实验五MFC进行可视化编程.docx
《实验五MFC进行可视化编程.docx》由会员分享,可在线阅读,更多相关《实验五MFC进行可视化编程.docx(14页珍藏版)》请在冰豆网上搜索。
实验五MFC进行可视化编程
实验五MFC进行可视化编程
一、实验目的与要求
了解MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用
程序。
要求:
(1)掌握MFC类的层次结构及主要类的用法。
(2)使用应用程序向导创建MFC类
的Windows应用程序。
二、基本知识点
类的概念。
MFC类的层次结构。
MFC类主要的类的用法。
应用程序向导的应用方法。
三、实验设备与平台
实验设备要求每个学生一台电脑,其中运行C++程序环境为VC++6.0系统或新版。
四、实验内容:
实验一、
本实验主要掌握VC++的一种编程方法,利用MFC(MicrosoftFoundationClass)和向导
(Wizard)来编写Windows应用程序,即首先使用ClassWizard来生成Windows应用程序
的基本框架,然后用ClassWizard来建立应用程序的类、消息处理、数据处理函数或定义控
件的属性、事件及方法,最后把各应用程序所要求的功能添加到类中,这种编写程序的方法
编写代码工作量小,系统自动生成了一些代码,从而编写起来方便。
MFC是用来编写Windows应用程序的VC++类集,该类集以层次结构组织起来,其中
封装了大部分WindowsAPI函数,它所包含的功能涉及到整个Windows操作系统。
MFC类
库是以层次结构的方式组织起来的,它的类按层次关系主要可划分为如下几类:
根类、应用
程序体系结构类、可视对象类、通用类、OLE类及ODBC数据库类。
应用程序向导为程序
员提供了一个基于MFC的应用程序框架,用户在此基础上添加实现特定功能的代码即可。
实验题目:
用MFC的向导创建编辑框,在编辑框中实现算术“加”、“减气“乘”及“除”
的运算,界面如图13.1所示。
图13-1具有“加气“减”、“乘”及“除”运算功能的界面
实验步骤:
1、利用MFC向导建立程序框架,在MFCAppWizardStepl中选择Dialogbasedo其余都采
用默认选项。
这样建立了一个基于对话框的程序。
2、利用资源编辑器,建立对话框:
在ResourceView选项卡中打开Dialog资源组,由于程
序的文件名为editor,因此,系统自动产生一个名为IDD_editor_DIALOG的资源文件,在
ResourceView资源组框中双击IDD_editor_DIALOG,如图13-2所示。
然后在右边的窗口中
显示出待编辑的对话框。
根据如图13-1所示的样式建立对话框。
-Heditorresources
-Dialog
"圄IDD_ABOUTBOX
L国IDD_editor_DIALOG
-Icon
L□IDR_MAINFRAME
日StringTable
ateStringTable
-Version^
国VS_VERSION_INFO
■5Class...*E)Reso...FileVi...
图13-2ResourceView资源组框
下面以“数据1”编辑框和“加”按钮为例介绍控件的创建过程,其余的编辑框和按钮
可参照此操作:
(1)在控件工具栏中选择“编辑框”,在控件工具上单击鼠标左键,在如图13-1所示的对
话框编辑窗口上“数据1”编辑框的位置上,画出一个大小合适的编辑框。
然后在对话框上
单击鼠标右键,对该编辑框上的Properties属性进行设置,如图13-3所示,设置对话框的ID
属性。
图13-3EditProperties对话框
(2)在图13-1的“加”按钮的位置上,画出一个大小合适的下压式按钮。
设置该按钮的
Properties选项,如图13-4所示,设置该控件的ID值和Caption属性。
图13-4按钮“加”的属性设置
按照上面的操作过程编辑各按钮或编辑框等对象的属性。
见表13-1所示。
表13-1对象属性表
对象
ID
Caption
编辑框
IDCITEM1EDIT
编辑框
IDCITEM1EDIT
编辑框
IDCRESULTEDIT
按钮
IDCADDBUTTON
Add
按钮
IDCDIFFERENCEBUTTON
Difference
按钮
IDCMULTIPLYBUTTON
Multiply
按钮
IDCDEVIDEBUTTON
Devide
按钮
IDCEXITBUTTON
Exit
(3)添加代码
1)给编辑框连接变量:
在任何一个编辑框上单击鼠标右键,设置ClassWizard菜单项,
弹出MFCClassWizard对话框,选择MemberVariables选项卡。
然后在ControlIDs列表框
中,选中IDC_ITEM1_EDIT,单击AddVariable按钮,在弹出的对话框中连接变量
m_Iteml_Edit;同样的方法添加其它变量。
2)给四个按钮连接代码:
在“加”按钮上单击鼠标右键,选择ClassWizard,在弹出的
对话框中选择MessageMaps选项卡,在ObjectIDs列表框中选择IDC_ADD_BUTTON,在
Messages列表框中选择BN.CLICKED选项,即选择单击按钮事件。
单击右边的AddFunction
按钮,在弹出的对话框中接受默认的名字,执行结果如图13-6所示。
单击EditCode按钮,
此时显示源代码文件,在函数OnAddButton()中输入相应代码。
图13-6为按钮连接代码
voidCEditorDlg:
:
OnAddButton()
〃此处填写加法的代码。
3)同样的可以给“减”、“乘气“除”按钮连接代码,不同的是消息映射函数中执行减、
乘及除的操作。
减的操作代码:
voidCEditorDlg:
:
OnDifferenceButton()
(
〃此处填写减的代码。
)
乘的操作代码:
voidCEditorDlg:
:
OnMultiplyButton()
(
〃此处填写乘的代码。
)
除的操作代码:
voidCEditorDlg:
:
OnDevideButton()
(
〃此处填写除的代码。
}
4)给“退出“按钮连接代码,利用ClassWizard将按钮消息BN_CLICKED加到函数
OnExitButton()中,例如F列代码:
voidCEditorDlg:
:
OnExitButton()
(
OnOK();
}
3、建立并运行程序
运行后该编辑框能实现“加”、“减”、“乘”及“除”的运算。
如图13-7所示。
图13-7实现“加"、"减”、“乘”及“除”的运算
实验二、
本实验的主要内容是文档与视图,主要是关于用AppWizard和MFC类库所写程序用
到文档与视图的结构,文档和视图是MFC应用程序最主要的对象。
文档用于管理应用程序
的数据,视图用于显示文档管理和用户的交互。
定义和操纵数据的代码在文档类中实现,而
显示数据并解释用户的代码则在视图类中实现。
文档类和视图类的交互式通过这两类中的成员函数实现的。
CDocument类是所有文档
的基类,提供了用户自定义文档类的基本功能。
CView类则是所有视图类的基类,提供了用
户自定义视图类的框架。
文档和视图类的关系如图14-1所示。
磁盘文件或网络数据等介质
通过文档类的成员函数
文档对象
用户
图14-1文档/视图结构关系图
实验题目:
利用文档/视图结构创建一个绘图板,使其能绘画各种直线,具有新建空白窗口,
重画窗口时可以恢复直线等功能。
实验步骤:
1.创建应用程序的基本框架
使用MFCAppWizard来建立应用程序的基本框架,设置该Project的名字为“MyExam”。
并且在“MFCAppWizard-Stepl”对话框中选择“Singledocument”选项,表示要生成SDI
应用程序。
2.视图的处理
(1)在视图类中添加数据成员
首先,打开文件MyExamView.h,将以下语句添加到MyExamView类定义中:
protected:
intm_Draw;
HCURSORm_Hcursor;
CPointm_p01d;
CPointm_pOrigin;
接着,打开文件,将以下代码添加到CmyExamView类的构造函数中,以便初始化数据
成员m_Draw和m_Hcursor:
m_Draw=0;
m_Hcursoi-AfxGetApp()->LoadStandardCursor(IDC_CROSS);
(2)用ClassWizard映射鼠标消息
1)从“View”菜单选择“ClassWizard”命令,弹出“MFCClassWizard”对话框,选择
uMessageMaps,,选项卡。
2)从“Classname”中选择类名"CMyExamView”。
3)在“ObjectIDs”中选择“CMyExamView”。
4)在“Messages”中选择要映射的鼠标消息为WM_LBUTTONDOWN(单击鼠标左键),
然后单击“AddFunction”按钮。
5)重复(4),映射鼠标消息WM_MOUSEMOVE(移动鼠标到新的位置)和
WM_LBUTTONUP(释放鼠标左键)。
结果如图14-2所示。
■FCClassWizard
图14-2映射鼠标消息后的结果
Memberfunctions:
VOnBeginPrinting
VOnDraw
VOnEndPrinting
A
S3OnLButtonDownON_WM_LBUTTONDOWN
1
WOnLButtonUpON_WM_LBUTTONUP
V
(3)添加消息处理函数代码
1)在消息处理函数CMyExamView:
:
OnLButtonDown中添加一下代码:
m_pOld=point;
m_pOrigin二point;
SetCapture();
m_Draw=1;
RECTrect;
GetClientRect(&rect);
ClientToScreen(&rect);
ClipCursor(&rect);
2)在消息处理函数CMyExamView:
:
OnMouseMove中添加一下代码:
SetCursor(m_Hcursor);
if(m_Draw)
(
CClientDCdc(this);
dc.SetROP2(R2_NOT);
dc.MoveTo(m_pOrigin);
dc.LineTo(m_pOld);
dc.MoveTo(m_pOrigin);
dc.LineTo(point);
m_pOld=point;
}
3)在消息处理函数CMyExamView:
:
OnLButtonUp中添加一下代码:
if(m_Draw)
(
m_Draw=O;
ReleaseCapture();
ClipCursor(NULL);
}
图14-3运行MyExam应用程序并画各种直线
4)建立并运行程序
运行结果如图14-3所示,可以用鼠标画各种直线后的结果。
3、文档的处理
对于用户在视图窗口中所画的直线,可以在文档类中添加数据成员来存放直线的坐标,
以便在重画窗口时可以恢复直线。
(1)在文档中存放直线坐标。
1)在文档类头文件MyExamDoc.h中添加类CMyLine来存放直线的坐标。
classCMyLine:
publicCObject
(
protected:
intm_StartX;
intm_StartY;
intm_EndX;
intm_EndY;
public:
CMyLine(intStartX,intStartY,intEndX,intEndY);
voidDrawLine(CDC*pDC);
};
2)在文档类头文件MyExamDoc.h中添加成员函数,以便其他类能够处理文档的数据成
员。
protected:
CObArraym_ObArray;
public:
voidAddLine(intStartX,intStartY,intEndX,intEndY);
CMyLine*GetLine(intindex);
intGetTotalLine();
3)在文档类头文件中添加成员函数的定义
CMyLine:
:
CMyLine(intStartX,intStartY,intEndX,intEndY)
{
m_StartX=StartX;
m_StartY=StartY;
m_EndX=EndX;
m_EndY=EndY;
);
voidCMyLine:
:
DrawLine(CDC*pDC)
(
pDC->MoveTo(m_StartX,m_StartY);
pDC->LineTo(m_EndX,m_EndY);
};
voidCMyExamDoc:
:
AddLine(intStartX,intStartYjntEndX,intEndY)
(
CMyLine*pMyLine=newCMyLine(StartX,StartY,EndX,EndY);
m_ObArray.Add(pMyLine);
);
CMyLine^CMyExamDoc:
:
GetLine(intindex)
{
if(index<0||index>m_perBound())
return0;
return(CMyLine*)m_(index);
);
intCMyExamDoc:
:
GetTotalLine()
(
returnm_ze();
};
(2)画完直线后存放直线坐标
在消息处理函数CMyExamView:
:
OnLButtonUp中添加一下代码,以便在画完直线释放鼠
标时存放直线的坐标:
CMyExamDoc*pDoc=GetDocument();
pDoc->AddLine(m_pOrigin.x,m_pOrigin.y,point.x,point.y);
(3)修改视图的OnDraw成员函数。
为了使视图窗口重新绘制时,可以根据存放在文档类中的数据来恢复直线,有必要往
OnDraw函数中添加一下代码:
intindex;
index=pDoc->GetTotalLine();
while(index—)
pDoc->GetLine(index)->DrawLine(pDC);
(4)删除文档数据
初始化新文档之前,必须要删除存放在当前文档中的数据,在文档类的头文件
MyExamDoc.h中添加一下代码:
virtualvoidDeleteContents();
接着,在文档类的实现文件中添加以下代码:
voidCMyExamDoc:
:
DeleteContents()
(
intindex;
index=m_ze();
while(index—)
deletem_(index);
m_eAll();
}
(5)建立并运行程序
运行后可以在视图窗口中画各种直线,由于在文档中存放所画的直线,所以在窗口缩放
和移动时将恢复所画的直线,而且实现了新建空白窗口的功能,如图14.4所示。
图14-4运行MyExam应用程序并画各种直线
五、学生实验报告要求
1>完成编写相关实验代码
2、实验步骤和实验结果
3、实验中的问题和提高