用MFC开发Windows应用程序.docx
- 文档编号:10714211
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:42
- 大小:212.78KB
用MFC开发Windows应用程序.docx
《用MFC开发Windows应用程序.docx》由会员分享,可在线阅读,更多相关《用MFC开发Windows应用程序.docx(42页珍藏版)》请在冰豆网上搜索。
用MFC开发Windows应用程序
用MFC开发Windows应用程序
1.实验目的
1.了解AppWizard自动生成的程序框架
2.了解MFC类库设计面向对象应用程序的过程
3.学习基本图形设计
4.学习使用基本控件和通用对话框
5.学习菜单设计
6.学习画笔、画刷和字体的应用
2.基础知识
2.1MFC类层次中所包含的类
MFC类库中包含了许多不同的类,它们可以划分为根类、应用程序结构类、应用程序结构类、窗口类、OLE类、数据库类等10个大类,在其中一些大类的基础上又派生出许多了类。
MFC类层次主要包含以下各类:
1.根类
MFC中的CObject类,是MFC抽象基类,是MFC中多数类和自定义子类的根类,它为程序员提供了许多编程所需的公共操作。
这些操作包括:
对象的建立和删除、串行化支持、对象诊断。
输出、运行时信息以及集合类的兼容等。
CObject类的主要派生类的派生层次如图2-1。
图2-1 CObject主要派生类的派生层次
2.应用程序体系结构类
应用程序体系结构类用于构造一个应用程序的框架,它能提供多数应用程序公用的功能。
应用程序体系结构类是由CCmdTarget为基类派生出来的,主要包含了与命令相关的类、窗口应用程序类、文档/视类和线程基类等,如图2-2。
图2-2MFC应用程序体系结构主要类
3.可视对象类,它主要包括:
•CWnd窗口类,该类提供了MFC中所有窗口的基本功能,它是CCmdTarget类的子类。
•CView视类,该类表示框架窗口的用户区和显示文档数据并接受输入的用户区。
•CMenu菜单类,该类是CObject类的子类,用于管理菜单。
•CDialog对话框类,该类从CWnd类中派生出来,对话框子层次结构包括通用对话框类CDialog以及支持文件选择、颜色选择、字体选择、打印、替换文本的公共对话框类。
•控件类,控件子层次结构包括若干子类控件类CButton、CEdit、CListBox、CScrollBar、CStatic、CComboBox,使用这些类可以建立静态文本、命令按钮、位图按钮、列表框等。
•CControlBar控件条类,控件条子结构为工具条、状态条、对话条和分割窗口建立模型。
•CGdiObject绘画对象类,图形绘画对象子层次结构以CGdiObject类为根类,或以用于建立绘画对象模型,如画笔、画刷、字体、位图、调色板等。
•CDC设备描述表类,该类及其子类支持设备描述表对象,是CObject类的子类。
4.通用类。
此分类中的类提供了很多通用服务,例如文件I/O、诊断和异常处理等。
包括CFile类和CArchive类、CException异常类、模板收集类等。
5.OLE类,对象连接与嵌入(OLE)子层次结构为支持OLE提供了9个类,分为3种:
普通类、客户类和服务器类。
6.ODBC数据库类,开放数据库连接子层次结构提供了一些类来支持ODBC的特征,即通过这些类可开发数据库应用程序来访问多个数据库文件,该层次结构中主要包含CDataBase类、CRecordSet类、CRecordView类等。
7.绘图和打印类,包含输出类、绘图工具类。
8.集合相关类包含数组类CArray、列表类CList和映像类CMap三大类。
9.Internet和网络工作类,包含ISAPI类、WindowsSocket类、Win32Internet类。
10.非CObject类派生的类,如字符串类CString、时间类CTime、CRect类、CPoint类等,这些类可以应用于非Windows应用程序。
2.2应用程序的类及文件说明
我们再用VisualC++6.0的向导生成应用程序时,系统共派生出五个类,在项目的Workapace窗口中选择ClassView选项卡,可以看到系统生成的五个类。
以建立一名为test文件窗口为例,图2-3显示的是系统在生成它时派生出的五个类。
图2-3在Workspace窗口中显示项目test的五个类
1.关于对话框的对话框类CAboutDlg
CAboutDlg是项目test的对话框类,这是由MFC类中的CDialog类派生而来的。
关于对话框的内容,我们将在下一节时详细介绍。
2.主框架窗口类CMainFrame
CMainFrame是项目test的主框架窗口类。
它的基类是FrameWnd。
头文件是MainFrame.h,实现文件是MainFrame.cpp。
主框架窗口类用于管理主程序的窗口,用来显示标题栏、工具栏、状态栏等,同时还处理对窗口操作的消息,例如窗口最大化、最小化等一般通用操作。
视图窗口是主框架窗口的子集,对于MDI应用程序,主框架窗口是所有MDI子窗口的容器。
3.应用程序类CTestApp
CTestApp是项目test的应用程序类。
它的基类是CWidApp。
头文件是test.h,实现文件为test.cpp。
应用程序类控制应用程序的所有对象,包括文档、视图和边框窗口,并且完成应用程序的初始化工作和程序退出时的清除工作。
注意,每个基于MFC的应用程序必须有一个从CWinApp类派生的对象。
4.文档类CTestDoc
CTestDoc是项目test的文档类。
它的基类是CDocument。
头文件是testDoc.h,实现文件是testDoc.cpp。
文档类用于存放应用程序的数据,以及文件的保存和装载功能。
文档类必须通过视图类实现与用户的交互。
5.视图类CTestView
CTestView是项目test的视图类。
它的基类是CView。
头文件是testView.h,实现文件是testView.cpp。
视图类主要负责管理视图窗口,对应的对象存在于框架窗口的客户区域中,负责显示用户数据,接受用户对数据的鼠标、键盘操作,并传送给文档类对象。
•Resource.h是标准的头文件,它包含了所有资源符号的定义。
•StdSfx.h和StdSfx.cpp用于建立预编译头文件(test.pch)和预编译类型文件(StdAfx.obj)。
•test.rc是包含资源描述信息的资源文件,其中保存了应用程序中使用到的各种资源的信息,包括存贮在“\res”子文件夹中的图标、位图、光标。
•test.ico是包含应用程序图标文件的图标文件。
•test.rc2文件中迎含了用VisualC++6.0不能直接编辑的资源。
可以将所有不能由资源编辑器编辑的资源放置到这个文件中。
•testDoc.ico文件中包含了打开文档时所用的图标文件
•Toolbar.bmp是用于创建工具栏按钮的位图文件。
初始化工具栏和状态栏是在主边框窗口中构造的。
•test.dsw称为Wordspace文件。
一个Wordspace文件可包含一个或多个项目。
•扩展名为.opt的文件存放与一个Wordspace文件对应的本地计算机配置信息。
•test.clw是ClassWizard的数据库文件,存放由ClassWizard使用的信息。
ClassWizard使用这些信息来编辑已有的新类或添加新类。
•test.dsp是Project文件,即项目文件。
Project文件中保存着项目的各种信息,一个项目文件对应一个项目应用程序。
项目test的文件可通过Workspace窗口中选择ClassView选项卡来显示(图2-4)通过图我们可以看到,系统在自动生成项目时,除了上面各个类的头文件和实现文件外,还生成了一些为建立应用程序所需要的其它文件。
下面分别加以说明:
图2-4系统生成的文件
另外,如果你在生成应用程序时选择的是其它选项的话,还会生成其它文件。
如会自动生成.hpj文件和一些.rtf文件,它们用以给出上下文的帮助。
在工作的根目录中,还会自动生成一个ReadMe.txt文件,它解释了所生成的其它所有文件并说明了所有创建的类。
2.3利用AppWizard生成Windows应用程序
我们将使用MFC中的AppWizard来生成一个最简单的应用程序,它只是简单显示一个基本的Windows窗口。
步骤一:
启动VisualC++,选择File菜单中的New菜单项,在弹出的New对话框中选择Project选项卡。
在项目列表中选择项目类型:
MFCAppWizare(exe),它表示生成使用MFC并且最终形成EXE可执行文件的项目。
在Location文本框中填写“E:
\”作为保存文件的路径,在Projectname文本框中输入项目名称“test”,单击OK按钮继续。
如图2-5所示。
图2-5创建test的Windows窗口
步骤二:
从MFCAppWizard弹出的MFCAppWizard-Step1对话框中选择“Singledocument”单文档,其余用系统默认值,然后单击Finish按钮。
见图2-6
图2-6MFCAppWizard-Step1
步骤三:
此时系统弹出“NewProjectInformation”对话框,对所创建项目进行总结,所选项配置不合适,可按“Cancel”按钮退回前述步骤重新配置,我们在这单击OK。
步骤四:
现在,AppWizard已经自动为我们生成了一个最简单的应用程序框架。
选择Build菜单中的buildtest.exe命令,对项目进行编译和链接,再选择Build菜单中的Executetest.exe命令运行程序。
将得到一个非常熟悉的Windows应用程序界面(图2-7)。
它拥有标准Windows的标题栏、菜单、工具栏和状态条。
可以在窗口上进行最大化、最小化等操作,或用鼠标拖动来重设窗口的大小。
图2-7用AppWizard生成的应用程序框架
3MFC应用程序编程及例题
MFC类库包括用来开发C++应用程序和Windows应用程序的一组类,这些类用来表示窗口、对话框、设备上下文、公共GDI对象如画笔、调色板、控制框和其它标准的Windows部件,封了大部分的Windows API函数。
下面简单介绍其中几方面的编程方法。
3.1鼠标消息
Windows是基于消息传递、事件驱动的操作系统。
该系统支持多个应用程序同时执行,在界面形式上,它支持多个窗口同时活动。
当用户移动鼠标、按下或释放鼠标键时,都会产生鼠标消息。
根据鼠标所处的位置(客户区或非客户区)不同,Windows系统产生的鼠标消息为两大类:
客户区域的鼠标消息、非窗户区域的鼠标消息。
下面只介绍客户区域的鼠标消息。
3.1.1客户区域鼠标消息
当鼠标指针通过应用程序窗口的客户区域时,Windows会发送客户区域鼠标消息到应用程序中。
例如,当用户移动鼠标在客户区域内画图时,应用程序会接收一连串的WM_MOUSEMOVE消息,这些消息不仅告诉应用程序鼠标在移动,而且还告诉应用程序在Windows产生消息时鼠标的位置。
应用程序可以接收十种客户区域鼠标消息,表3.1列举了这些消息和关于它们的消息处理函数。
表3.1 客户区域鼠标消息
消息
说明
WM_LBUTTONDBLCLK
OnLButtonBlclk(UINTnFlag,CPointpoint)
鼠标左键被双击
WM_LBUTTONDDOWN
OnLButtonDown(UINTnFlag,CPointpoint)
鼠标左键被按下
WM_LBUTTONDUP
OnLButtonUp(UINTnFlag,CPointpoint)
鼠标左键被释放
WM_MBUTTONDBLCLK
OnLMButtonBlclk(UINTnFlag,CPointpoint)
鼠标中间键被双击
WM_MBUTTONDDOWN
OnLMButtonDown(UINTnFlag,CPointpoint)
鼠标中间键被压下
WM_MBUTTONDUP
OnLMButtonUp(UINTnFlag,CPointpoint)
鼠标中间键被释放
WM_MOUSEMOVE
OnMoveMove(UINTnFlag,CPointpoint)
鼠标移动穿过客户区域
WM_RBUTTONDBLCKL
OnRButtonBlclk(UINTnFlag,CPointpoint)
鼠标右键被双击
WM_RBUTTONDDOWN
OnRButtonDown(UINTnFlag,CPointpoint)
鼠标右键被按下
WM_RBUTTONDUP
OnRButtonUp(UINTnFlag,CPointpoint)
鼠标右键被释放
以上消息函数的参数:
1.point代表鼠标热点的坐标位置,point.x为横坐标,point.y为纵坐标,默认坐标原点(0,0)位于客户区的左上角。
2.nFlag参数中包含了鼠标按钮和键盘合使用标志,用来描述鼠标按钮和键盘上Shift键和Ctrl键的组合状态。
3.1.2例题
消息就是操作系统通知应用程序某件事情已经发生的一种方式。
例如,当用户键入、移动鼠标或双击鼠标,都将向适当的窗口发送消息。
例:
3-1该例题是当按下鼠标左键,客户区域中显示鼠标坐标位置,实现步骤如下:
1.选File->NewMFCAppWizard[exe],建立工程名称:
TestMouse。
2.在Step1中选择单文档界面(SingleDocumet),其它接受系统设置。
3.在Step3中关闭ActiveXControls复选框,在Step4中,关闭Printingandprintpreview复选框。
4.其它接受系统设置,单击“Finish”按钮。
5.选择View(查看)ClassWizard(建立类向导),在classname列表中选择CTestMouseView项,选中单击鼠标左键消息WM_LBUTTONDOWN。
6.双击WM_LBUTTONDOWN(或单击AddFunction按钮),
7.在Memberfunction栏中双击OnLButtonDown(或单击EditCode按键),
8.建立类向导自动为该函数生成框架,在“//TODO……”后添加程序代码,
CDC*pDC=GetDC();
chartbuf[80];
sprintf(tbuf,"鼠标按下坐标为:
(%3d,%3d)",point.x,point.y);//将鼠标点坐标存入tbuf中
pDC->TextOut(20,40,tbuf);//显示鼠标点坐标
在Memberfunction栏中双击OnDrow,添加下面程序代码,
pDC->TextOut(20,20,"请按鼠标左键。
");
作用是提示:
请按鼠标左键
9.编译、运行。
10.结果如图3-1所示。
图3-1 鼠标位置
3.2 绘图
在MFC应用程序中,所有的绘图调用都必须通过设备环境(DeviceContext)的对象来实现。
设备环境是指一种Windows数据结构。
它包含了设备(如显示器、打印机)的各种绘图属性。
它是Windows应用程序与设备驱动程序和输出设备之间的桥梁。
设备环境从应用程序接收显示信息,然后根据显示信息对输出设备的驱动程序进行访问,最后通过驱动程序实现从指定设备输出。
在MFC中,CDC类封装了设备环境,它包括了大多数WindowsAPI中的GDI函数。
除了CDC类,MFC还提供了几个CDC的派生类(如表3-2),它们可以实现一些特殊的用途。
表3-2特殊的CDC派生类
类名称
功能描述
CPaintDC类
CPaintDC对象在构造时调用BeginPaint事件,在析构时调用EndPaint事件,所以此类只在响应WM_PAINT消息的函数OnPaint()函数中使用。
CClientDC类
提供一个面向窗口用户区的设备环境,用来立即响应鼠标事件进行绘图。
CWindowsDC类
提供一个面向整个窗口的设备环境,它包括了窗口的客户区和非客户区。
CMetaFileDC类
提供一个面向Windows备忘文本的设备环境,它允许为以后的重新绘图工作记录一系列绘图命令,此类的成员函数被记录在备忘文件中。
要在Windows应用程序中进行绘图,则必须首先获得设备环境,而当建立了一个设备环境时,它将自动带有一套默认的GDI对象。
这些对象可以实现各种画图功能。
如使用画笔(Pen)来画直线;使用画刷(Brush)来填充颜色等。
MFC提供了从CGdiObject派生的类来管理这些对象。
如CPen类封装了画笔;CBrush类封装了画刷等。
表3-3说明的这些类。
表3-3CGdiObject的派生类及说明
类名
说明
CPen
CPen类实现了GDI的画笔对象,画笔对象用于画线及绘制其它有边框的图形的工具。
我们可以设置当前画笔的颜色、线宽和线型。
CFont
CFont类封装了Windows的字体,并且提供了一些成员函数来处理字体。
CBitmap
CBitmap是位图类,是一种像素图形矩阵。
使用它来表示图像,其中包括了各种应用程序的工具栏、光标及有Windows系统中的其它一些小图标等。
CPalette
颜色调色板是一种颜色的映射接口,通过它可以不干扰其它应用程序而充分利用输出设备的颜色描绘能力。
CBrush
刷子类,定义一种位图的显示模板,一般用它来对某些区域的内部进行某种颜色的填充。
CRgn
一种多边形和椭圆组合而成的区域。
利用它可以进行填充、裁剪或鼠标选中测试。
在使用CPen对象之前,必须先创建它,然后将它选入设备环境。
得到设备环境,进行绘图也有两种方法:
第一种方法是创建GDI对象,然后将其选入设备环境。
第二种方法是使用CDC类的成员函数SelectStockObject()将对象选入设备环境中,这可以避免创建GDI对象的麻烦。
但该函数只能将CPen、CBrush和CFont对象选入设备环境中。
3.2.1绘图函数
1.设置当前位置(MoveTo())
可以通过CDC类的成员函数MoveTo(),来指定画线的起始点。
函数的原型如下:
CPointMoveTo(intx,inty);
CPointMoveTo(POINTpoint);
参数(x,y)或point指定了新的当前位置。
2.画直线(LineTo())
用CDC类的成员函数LineTo()可以实现以当前画笔画简单的直线。
函数的原型如下:
BOOLLineTo(intx,inty);
BOOLLineTo(POINTpoint);
直线从当前位置开始画到参数(x,y)或point指定的坐标位置,同时当前位置相应的修改为(x,y)或point。
如果要在点(a,b)和(c,d)之间画一条直线,可以使用如下代码:
pDC->MoveTo(a,b);
pDC->LineTo(c,d);
3.画矩形(Rectangle(),RoundRect())
画矩形有两个CDC成员函数Rectangle()(方角矩形)和RoundRect()(圆角矩形),这两个函数都是以当前画笔画矩形,然后以当前画刷自动填充矩形内部。
函数原型如下:
BOOLRectangle(intx1,inty1,intx2,inty2);
BOOLRectangle(LPCRECTlpRect);
BOOLRoundRect(intx1,inty1,intx2,inty2,intx3,inty3);
BOOLRoundRect(LPCRECTlpRect,POINTpoint);
(x1,y1)指矩形左上角的坐标,(x2,y2)指矩形右下角的坐标。
(x3,y3)分别指定圆角曲线的宽度和高度。
4.画圆弧(Arc(),ArcTo())
画弧函数用边界矩形来确定弧的大小。
边界矩形是隐藏的,用于描述圆弧的位置的大小。
画弧使用函数Arc()或ArcTo(),函数原型为:
BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);
BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEdn);
BOOLArcTo(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);
BOOLArcTo(LPCRECTlpRect,POINTptStart,POINTptEnd);
(x1,y1)指矩形区域左上角的坐标,(x2,y2)指矩形区域右下角的坐标。
(x3,y3)或ptStart是弧的起始点,(x4,y4)或ptEnd是弧的终止点。
5.画椭圆和圆(Ellipse())
用CDC类的成员函数Ellipse()画椭员或圆,函数原型为:
BOOLEllipse(intx1,inty1,intx2,inty2);
BOOLEllipse(LPCRECTlpRect);
(x1,y1)指矩形区域左上角的坐标,(x2,y2)指矩形区域右下角的坐标。
如果画圆,则可以指定正方形为外切边界矩形。
6.画饼图(Pie())
饼图由一条弧和从弧的两个端点到中心的连线所组成。
用成员函数Pie()来绘制饼图。
函数原型为:
BOOLPie(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);
BOOLPie(LPCRECTlpRect,POINTptStart,POINTptEnd);
Pin()函数的参数与画弧函数的参数完全相同,当用画笔画完饼图后,可以用当前画刷填充图形。
3.2.2使用画笔及画刷
使用画笔
如果不使用库存画笔,则要使用之前必须创建它。
创建画笔只需要提供画笔的颜色、线型和线宽。
创建画笔的方法有三种:
1.CPen类中封装了一个画笔的数据结构LOGPEN,将此结构作为参数传给CPen类的成员函数CreatePenIndirect(),就可以直接创建画笔。
BOOLCreatePenIndirect(LPLOGPENlpLogPen);
2.在构造函数中创建画笔并且进行初始化操作。
例创建一风格为点线、画笔宽度为10个单位和颜色为黑的画笔。
CPenmyPen(PS_DOT,10,RGB(0,0,0));
1.首先构造一个画笔对象,然后调用初始化函数CreatePen()对画笔进行初始化。
CreatePen()函数原型如下:
BOOLCreatePen(intnPwnStyle,intnWidth,COLOREFcrColor);
nPwnStyle:
指定了画笔的线型风格,其值如表3-4所示。
nWidth:
指定了画笔的线宽。
是一个逻辑单位量。
COLOREFcrColor:
指定画笔的颜色。
颜色是通过宏RGB()产生的COLORREF结构进行传递的,此结构是一个基于红色、绿色和蓝色三个分量的数据结构。
表3-4画笔线型风格及含义
画笔线型风格
含义
PS_DASH
用短横线画线,即画虚线
PS_DASHDOT
用短横线加点画线,即点划线
PS_DOT
用点画线
PS_DASHDOTDOT
用短横线加两个点画线
PS_INSIDEFRAME
在边界的区域内容用实线画线
PS_NU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 开发 Windows 应用程序