MFC单文档应用程序基础训练文本输出绘图等.docx
- 文档编号:18259641
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:26
- 大小:325.54KB
MFC单文档应用程序基础训练文本输出绘图等.docx
《MFC单文档应用程序基础训练文本输出绘图等.docx》由会员分享,可在线阅读,更多相关《MFC单文档应用程序基础训练文本输出绘图等.docx(26页珍藏版)》请在冰点文库上搜索。
MFC单文档应用程序基础训练文本输出绘图等
MFC单文档
基础训练——文本输出、绘图等
平台为:
VS2010
1.一个简单的单文档应用程序
文件->新建项目->MFC应用程序,出现窗口按“下一步”,出现下面窗口选择单文档
点"调试—>运行",最后运行界面为下图:
一个简单的单文档应用程序向导自动建立五个类:
向导自动建立的类
相应源文件
其他源文件
相应头文件
其他头文件
CAboutDlg
StdAfx.cpp
StdAfx.h
CXxxApp
Xxx.cpp
Xxx.rc
Xxx.h
Resource.h
CXxxView
XxxView.cpp
XxxView.h
CXxxDoc
XxxDoc.cpp
XxxDoc.h
CMainFrame
MainFrame.cpp
MainFrame.h
文档—视结构
每个类的主要函数:
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)//创建窗体的工具栏,状态栏等
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
BOOLCXxxApp:
:
InitInstance()
voidCXxxApp:
:
OnAppAbout()
BOOLCXxxDoc:
:
OnNewDocument()//初始化文档字符数据、字体信息等
voidCXxxDoc:
:
Serialize(CArchive&ar)
BOOLCXxxView:
:
PreCreateWindow(CREATESTRUCT&cs)
voidCXxxView:
:
OnDraw(CDC*pDC)
BOOLCXxxView:
:
OnPreparePrinting(CPrintInfo*pInfo)//弹出打印对话框
voidCXxxView:
:
OnBeginPrinting(CDC*pDC,CPrintInfo*pInfo)
voidCXxxView:
:
OnEndPrinting(CDC*pDC,CPrintInfo*pInfo)
CXxxDoc*CXxxView:
:
GetDocument()//non-debugversionisinline
创建单文档应用程序的一般步骤:
●利用AppWizard创建应用程序框架
●在文档内中声明保存文档数据所需要数据对象
●完成文档类的OnNewDocument函数,初始化新文档
●完成文档类的Serialize函数,保持和加载文档数据
●完成视类的OnInitialUpdate函数,初始化显示
●完成视类的OnDraw函数,显示当前文档内容
●在视类中加入可以使用户编辑文档数据所需的代码
2.简单文本和图形输出
建立一个简单的单文档应用程序SimpleTextPicture,通过修改OnDraw函数在视(View)中输出信息或画图。
找到函数OnDraw(CDC*/*pDC*/),改为OnDraw(CDC*pDC);
OnDraw函数在SimpleTextPicture.cpp文件中,专门用于输出信息或画图。
负责视图显示功能(包括打印、显示、预览等)
例2.1显示正方形和文本
voidCSimpleTextPictureView:
:
OnDraw(CDC*pDC)
{
CSimpleTextPictureDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
pDC->TextOut(10,120,_T("HelloWorld!
"));
pDC->Rectangle(20,20,100,100);
}
在AppWizard生成的OnDraw函数中加入以黑体字给出的两行代码,运行程序,显示如下:
例2.2显示彩色图形和文本
voidCSimpleTextPictureView:
:
OnDraw(CDC*pDC)
{
CSimpleTextPictureDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
CPenpen;
CBrushbrush;
pen.CreatePen(PS_SOLID,3,RGB(250,0,0));
brush.CreateSolidBrush(RGB(0,250,0));
pDC->SelectObject(pen);
pDC->SelectObject(brush);
pDC->Ellipse(100,200,300,300);
DeleteObject(pen);
DeleteObject(brush);
CStringstr(_T("HelloWorld!
"));//用UNICODE编码pDC->SetTextColor(RGB(0,0,250));
pDC->TextOut(120,150,str);
pDC->SetTextColor(RGB(125,125,125));
doublea[]={31.4,888.54};
charch[10];
CStringstr1;
str1.Format(_T("%f"),a[0]);
pDC->TextOut(20,40,str1);
str1.Format(_T("%f"),a[1]);
pDC->TextOut(20,60,str1);
}
3.滚动字幕
创建一个简单的单文档应用程序Xxx2;
[1]在Xxx2View.h中添加代码如下:
public:
virtual~CXxx2View();
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&dc)const;
#endif
protected:
private:
intn;//定义变量
[2]在CXxx2View构造函数中初始化变量n
CXxx2View:
:
CXxx2View()
{
//TODO:
addconstructioncodehere
n=0;
}
[3]在Xxx2View.cpp文件中修改OnDraw函数:
voidCXxx2View:
:
OnDraw(CDC*pDC)
{
CXxx2Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)
return;
pDC->SetTextColor(RGB(0,0,235));
pDC->SetBkMode(TRANSPARENT);
CFontfont;
font.CreateFont(28,15,0,0,FW_NORMAL,false,false,false,DEFAULT_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,_T("隶书"));
pDC->SelectObject(&font);
pDC->TextOut(n,100,_T("世上无难事,只要肯登攀!
"));
n=n+20;
RECTr;
GetClientRect(&r);//获得窗口
if(n>r.right-r.left)//窗口如果n>右坐标减去左坐标
n=0;
}
[4]添加三条消息映射,并加入相应代码。
通过菜单命令:
视图/类视图,找到CXxx2View类,在CXxx2View类上点击“右键->属性”,找到消息按扭,如下图:
点击
voidCXxx2View:
:
OnLButtonDblClk(UINTnFlags,CPointpoint)
{//鼠标左双击函数
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
SetTimer(1,500,NULL);
CView:
:
OnLButtonDblClk(nFlags,point);
}
voidCXxx2View:
:
OnRButtonDblClk(UINTnFlags,CPointpoint)
{//鼠标右双击函数
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
KillTimer
(1);
CView:
:
OnRButtonDblClk(nFlags,point);
}
voidCXxx2View:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
Invalidate();//擦除背景,重新绘制
CView:
:
OnTimer(nIDEvent);
}
[5]添加菜单控制与代理
点击视图->资源视图,如下图,双击IDR_MAINFRAME,进入菜单编辑。
在资源Menu中添加运行子菜单:
启动(IDC_MOVE)和停止(IDC_STOP)及其消息映射(右键->添加事件处理程序)。
下为“启动”对应的消息映射:
并修改代码:
voidCXxx2View:
:
OnMove()//启动对应消息
{
//TODO:
Addyourcommandhandlercodehere
SetTimer(1,300,NULL);
}
voidCXxx2View:
:
OnStop()//停止对应的消息
{
//TODO:
Addyourcommandhandlercodehere
KillTimer
(1);
}
4.使用计算数据画直方图
1.使用AppWixard生成单文档工程Plot
2.在PlotDoc.h中类CPlotDoc的定义之前加入类Max的定义:
classMax
{
doublex1,x2,x3,x4;
doubleMax2(double,double);
public:
Max(double,double,double,double);
doubleMax4();
};
3.在PlotDoc.cpp的文件尾部加入类Max的实现部分:
//CPlotDoccommands
doubleMax:
:
Max2(doublea,doubleb)
{
if(a>=b)returna;
elsereturnb;
}
Max:
:
Max(doublea,doubleb,doublec,doubled)
{
x1=a;x2=b;x3=c;x4=d;
}
doubleMax:
:
Max4()
{
returnMax2(Max2(x1,x2),Max2(x3,x4));
}
4.为CPlotDoc类增加一个公有的void类型的成员函数Find和一个公有int数据成员数组m_num[5],使用类产生对象并计算它们的最大值,将它们转换成int,存入整数数组m_num。
voidCPlotDoc:
:
Find()
{
Maxa(110.5,120.8,110,68);
Maxb(130,256.5,90,200);
Maxc(125,406.8,350,330);
Maxd(120,356.8,300,280.5);
Maxe(102,256.8,120,105);
m_num[0]=(int)a.Max4();
m_num[1]=(int)b.Max4();
m_num[2]=(int)c.Max4();
m_num[3]=(int)d.Max4();
m_num[4]=(int)e.Max4();
}
5.为CPlotDoc类的成员函数OnNewDocument增加调用语句准备数据。
BOOLCPlotDoc:
:
OnNewDocument()
{
if(!
CDocument:
:
OnNewDocument())
returnFALSE;
//TODO:
addreinitializationcodehere
//(SDIdocumentswillreusethisdocument)
Find();//增加的语句
returnTRUE;
}
6.在视类中画图写字
voidCPlotView:
:
OnDraw(CDC*pDC)
{
CPlotDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetViewportOrg(50,250);
pDC->MoveTo(0,0);
pDC->LineTo(1100,0);
pDC->MoveTo(0,0);
pDC->LineTo(0,600);
intwidth=40;
intch='A';
CStringstr1;
CBrushbrush;
brush.CreateSolidBrush(RGB(50,250,0));
pDC->SelectObject(brush);
for(inti=1;i<6;i++,ch++)
{
pDC->Rectangle(200*i,0,200*i+width,pDoc->m_num[i-1]);
str1.Format(_T("%c"),ch);//整型以字符格式赋给str1
pDC->TextOut(200*i+10,-10,str1);//输出ABCDE
}
CFontfont;
font.CreateFont(0,0,0,0,800,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,_T("楷体"));
pDC->SelectObject(&font);
pDC->TextOut(200,550,_T("各公司销售点水果月销售量直方图"));
}
7.运行程序,结果如下:
5.单文档串行化编程之一
SerialRect应用程序串行化一个矩形数据,用对话框修改数据,用编辑/修改菜单打开对话框。
2.用AppWizard建立一个普通单文档SerialRect工程,按下一步,直到出现下图,将CSerialRectView的基类设为CFormView。
3.初始界面如下:
4.在Form上添加控件
5.添加变量Edit1~Edit4整型(m_x1,m_y1,m_x2,m_y2),取值范围0~300,Edit5为Control-CEdit型(m_Ctrl)
6.用右键选择控件的Events修改Edit1的黙认EN_CHANGE消息处理OnChangeEdit1为自定义的OnChangeEdit。
其他三个Edit也映射到这个函数。
7.在Doc头文件SerialRectDoc.h中添加变量:
classCSerialRectDoc:
publicCDocument
{
protected:
//createfromserializationonly
CSerialRectDoc();
DECLARE_DYNCREATE(CSerialRectDoc)
//Attributes
public:
intx1,y1,x2,y2;
//Operations
6.在SerialRectDoc.cpp的构造函数中初始化变量:
CSerialRectDoc:
:
CSerialRectDoc()
{
//TODO:
addone-timeconstructioncodehere
x1=y1=x2=y2=0;
}
7.SerialRectView.cpp中添加下面内容:
voidCSerialRectView:
:
OnChangeEdit()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData();
CSerialRectDoc*pDoc=GetDocument();
if(m_x1!
=pDoc->x1)pDoc->x1=m_x1;
if(m_y1!
=pDoc->y1)pDoc->y1=m_y1;
if(m_x2!
=pDoc->x2)pDoc->x2=m_x2;
if(m_y2!
=pDoc->y2)pDoc->y2=m_y2;
Invalidate(true);
}
voidCSerialRectView:
:
OnInitialUpdate()
{
CFormView:
:
OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_x1=GetDocument()->x1;
m_x2=GetDocument()->x2;
m_y1=GetDocument()->y1;
m_y2=GetDocument()->y2;
UpdateData(false);
}
8.在SerialRectDoc.cpp的串行化代码:
voidCSerialRectDoc:
:
Serialize(CArchive&ar)
{
if(ar.IsStoring())
{
//TODO:
addstoringcodehere
ar< } else { //TODO: addloadingcodehere ar>>x1>>y1>>x2>>y2; } } 9.为CSerialRectView类添加OnDraw函数 在工作区类视图中右键单击CSerialRectView类,选择AddMemberFunction弹出对话框: voidCSerialRectView: : OnDraw(CDC*pDC) { m_Ctrl.UpdateWindow(); pDC=m_Ctrl.GetWindowDC(); pDC->Rectangle(m_x1,m_y1,m_x2,m_y2); UpdateData(false); } 6.单文档串行化编程之二 SerialData应用程序串行化日期结构数据,用对话框修改数据,用编辑/修改菜单打开对话框。 1.用AppWizard建立一个普通单文档SerialDate工程 2.添加一个对话框资源如下: 并为三个编辑框添加变量m_nYear,m_nMonth,m_nDay, 3.用ClassWizard添加类CDateDialog(其基类为CDialog) 4.在Doc头文件SerialDateDoc.h中添加下面内容: structDate { intm_nYear; intm_nMonth; intm_nDay; }; #include"DateDialog.h" classCSerialDateDoc: publicCDocument { protected: //createfromserializationonly CSerialDateDoc(); DECLARE_DYNCREATE(CSerialDateDoc) //Attributes public: Datedate; 4.编辑菜单中添加子菜单项,ID_EDIT_MODIFY,消息映射到SerialDateDoc.cpp文件中的OnEditModify()函数 5.在SerialDateDoc.cpp中添加代码 CSerialDateDoc: : CSerialDateDoc() { date.m_nYear=2002; date.m_nMonth=6; date.m_nDay=1; } voidCSerialDateDoc: : Serialize(CArchive&ar) { if(ar.IsStoring()) {ar< } else {ar>>date.m_nYear>>date.m_nMonth>>date.m_nDay; } } voidCSerialDateDoc: : OnEditModify() { CDateDialogdlg; dlg.m_nYear=date.m_nYear; dlg.m_nMonth=date.m_nMonth; dlg.m_nDay=date.m_nDay; if(dlg.DoModal()==IDOK) { date.m_nYear=dlg.m_nYear; date.m_nMonth=dlg.m_nMonth; date.m_nDay=dlg.m_nDay; } UpdateAllViews(NULL); SetModifiedFlag(true);//关闭窗口时提示存盘 } 6.修改SerialDateView.cpp中的OnDraw代码 voidCSerialDateView: : OnDraw(CDC*pDC) { CSerialDateDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); CStringstr; str.Format(_T("Year: %d"),pDoc->date.m_nYear); pDC->TextOut(20,20,str); str.Format(_T("Month: %d"),pDoc->date.m_nMonth); pDC->TextOut(20,40,str); str.Format(_T("Day: %d"),pDoc-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 文档 应用程序 基础训练 文本 输出 绘图