版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第3章章 MFC基本应用程序的建立基本应用程序的建立3.1 Windows编程基础编程基础编制一个功能强大和易操作的Windows应用程序所需要的代码肯定会比一般的C+程序要多得多,但并不是所有的代码都需要自己从头开始编写但并不是所有的代码都需要自己从头开始编写,因为Visual C+不仅提供了常用的Windows应用程序的基本框架,而且可以在框架程序中直接调用Win32 API(Application Programming Interface, 应用程序接口)函数。这样,用户仅需要在相应的框架位置中添加自己的代码或修改部分代码就可实现Windows应用程序的许多功能。3.1.2 Wind
2、ows编程特点编程特点一个完整的Windows应用程序除了WinMain函数外,还包含用于处理用户动作和窗口消息的窗口函数。这不同于一个C+的控制台应用程序,可以将整个程序包含在main函数中。Windows应用程序具有如下特性: 消息驱动机制消息驱动机制图形设备接口图形设备接口(GDI)基于资源的程序设计基于资源的程序设计动态链接库动态链接库进程和线程进程和线程3.1.3 Windows基本数据类型基本数据类型表3.1列出了一些在Windows编程中常用的基本数据类型。表表3.1 Windows常用的基本数据类型常用的基本数据类型3.1.3 Windows基本数据类型基本数据类型表3.2列出
3、了常用的预定义句柄,它们的类型均为void *,即一个32位指针。表表3. 2 Windows常用的句柄类型常用的句柄类型3.2 编制一个编制一个MFC应用程序应用程序为了帮助用户处理那些经常使用又复杂繁琐的各种Windows操作,Visual C+设计了一套基础类库(Microsoft Foundation Class Library,简称MFC)。MFC把Windows编程规范中的大多数内容封装成为各种类,使程序员从繁杂的编程中解脱出来,提高了编程和代码效率。 3.3 使用使用MFC AppWizard3.3.1应用程序框架类型应用程序框架类型这些类型基本满足了各个层次的用户的需要,但一般
4、地,用户更关心的是MFC AppWizard(exe)应用程序框架应用程序框架,因为它包含用户最常用、最基本的三种应用程序类型:单文档、多文档和基于对话框的应用程序。表表3.3 MFC AppWizard创建的应用程序类型创建的应用程序类型3.3.2 创建一个单文档应用程序创建一个单文档应用程序用MFC AppWizard(MFC应用程序向导)可以方便地创建一个通用的Windows单文档应用程序,其步骤如下。1. 开始开始选择“文件”“新建”菜单,在弹出的“新建”对话框中,可以看到工程标签页面中,显示出一系列的应用程序项目类型;选择MFC AppWizard(exe)的项目类型(该类型用于创建
5、可执行的Windows应用程序),将项目工作文件夹定位在“D:Visual C+ 6.0程序”,并在工程编辑框中输入项目名Ex_SDIHello,结果如图3.5所示。图3.5 MFC AppWizard的“新建”对话框3.3.2 创建一个单文档应用程序创建一个单文档应用程序2. 第一步第一步单击确定按钮,出现如图3.6所示的对话框,进行下列选择:(1)从应用程序类型单个文档(SDI)、多重文档(MDI)和基本对话框(基于对话框的应用程序)中选择“单个文档”。(2) 决定应用程序中是否需要MFC的文档视图(“文档/查看体系结构支持”)结构的支持。若不选定此项,则程序中的磁盘文件的打开、保存以及文
6、档和视图的相互作用等功能需要用户来实现,且将跳过Step 2Step 5,直接弹出“Step 6”对话框。一般情况下,应选中此项。(3) 选择资源所使用的语言,这里是“中文中国”。3.第二步第二步单击下一个按钮,出现如图3.7所示的对话框,让用户选择程序中是否加入数据库的支持(有关数据库的内容将在以后的章节中介绍)。图3.6 MFC AppWizard的“Step 1”对话框 图3.7 MFC AppWizard的“Step 2”对话框3.3.2 创建一个单文档应用程序创建一个单文档应用程序4.第三步第三步单击下一个按钮进入下一步,出现如图3.8所示的对话框。允许用户在程序中加入复合文档、自动
7、化、ActiveX控件的支持。5. 第四步第四步单击下一个按钮进入下一步,出现如图3.9所示的对话框,对话框的前几项依次确定对浮动工具条、打印与预览以及通信等特性的支持。图3.8 MFC AppWizard的“Step 3”对话框 图3.9 MFC AppWizard的“Step 4”对话框3.3.2 创建一个单文档应用程序创建一个单文档应用程序6. 第五步第五步保留以上默认值,单击下一个按钮进入下一步。弹出如图3.10所示的对话框,这里出现三个方面的选项,供用户来选择:(1) 应用程序的主窗口是MFC标准风格还是窗口左边有切分窗口的浏览器风格;(2) 在源文件中是否加入注释用来引导用户编写程
8、序代码;(3) 使用动态链接库还是静态链接库。 图3.10 MFC AppWizard的“Step 5”对话框 3.3.2 创建一个单文档应用程序创建一个单文档应用程序7. 第六步第六步保留默认选项,单击下一步按钮进行下一步,出现如图3.11所示的对话框。在这里,用户可以对MFC AppWizard提供的默认类名、基类名、各个源文件名进行修改。单击完成按钮出现一个信息对话框,显示出用户在前面几个步骤中作出的选择内容,单击确定按钮系统开始创建,并又回到了Visual C+ 6.0的主界面。8.编译并运行编译并运行到这里为止,用户虽然没有编写任何程序代码,但MFC AppWizard已经根据用户的
9、选择内容自动生成基本的应用程序框架。单击编译工具栏上的运行工具按钮“”或按快捷键Ctrl+F5,系统开始编连并运行生成的单文档应用程序可执行文件Ex_SDIHello.exe,运行结果如图3.12所示。菜单栏工具栏状态栏标题栏文档窗口图3.11 MFC AppWizard的“Step 6”对话框 图3.12 Ex_SDIHello运行结果3.3.3 MFC应用程序项目组织应用程序项目组织1. 项目的文件组织项目的文件组织在Visual C+ 6.0中,项目中所有的源文件都是采用文件夹的方式进行管理的,它将项目名作为文件夹名,在此文件夹下包含源程序代码文件(.cpp,.h)、项目文件(.dsp)
10、以及项目工作区文件(.dsw)等。表3.4列出了这些文件类型的的含义。表表3.4 Visual C+ 6.0文件类型的含义文件类型的含义3.3.3 MFC应用程序项目组织应用程序项目组织除了上述文件外,还有相应的Debug(调试)或Release(发行)、Res(资源)等子文件夹。例如上述创建的单文档应用程序项目Ex_SDIHello,其各文件的组织如图3.13所示。当然,不同类型的项目的文件类型及数目会有所不同。Ex_SDIHello文件夹Debug或Release文件夹Res文件夹类文件.cpp,.h资源文件Ex_SDIHello.rc项目及项目工作区文件其他文件编连过程产生的文件运行文件
11、Ex_SDIHello.exe图标文件Ex_SDIHello.ico等工具栏资源Toolbar.bmp其他资源Ex_SDIHello.rc2等图3.13 Ex_SDIHello项目的文件组织 3.4 使用类向导使用类向导MFC类向导(ClassWizard)是Visual C+ 6.0中又一个非常有用的工具。它能自动为一个项目添加一个类、进行消息和数据映射、创建OLE Automation(自动化)属性和方法以及进行ActiveX事件处理等。 3.4.1 类向导概述类向导概述打开MFC类向导可以使用下列几种方法:(1) 选择“查看”“建立类向导”菜单或直接使用Ctrl+W快捷键。(2) 在源代
12、码文件的文档编辑窗口中,右击鼠标,从弹出的快捷菜单中选择“建立类向导”命令。当MFC类向导打开后,就会弹出如图3.15所示的MFC ClassWizard对话框。图3.15 MFC ClassWizard对话框3.4.1 类向导概述类向导概述可以看到ClassWizard对话框包含了5个标签页面个标签页面,它们各自含义如下: Message Maps(消息映射消息映射):用来添加、删除和编程处理消息的成员函数。 Member Variables(成员变量成员变量):添加或删除与控件相关联的成员变量(或称数据成员),以便与控件进行数据交换。这些控件所在的类一般是从CDialog、CPropert
13、yPage、CRecordView或CDaoRecordView中派生的类。 Automation(自动化):为支持Automation的类(如ActiveX控件类)添加属性和方法。 ActiveX Events(ActiveX事件):为ActiveX控件类添加触发事件的支持。 Class Info(类信息):有关项目中类的其他信息。一般来说,MFC ClassWizard对话框最前两项是用户最关心的,也是最经常使用的,因为几乎所有的代码编写都要利用这两个标签项。由于Member Variables功能以后还会详细讨论,因此这里仅讨论Message Maps(消息映射)与类的添加和删除方法。3
14、.4.2 消息和消息映射消息和消息映射1. 消息分类消息分类Windows应用程序中的消息主要有三种类型。(1)窗口消息(Windows message)。这类消息主要是指由WM_开头的消息(WM_ COMMAND除外),一般由窗口类和视图类对象来处理。窗口消息往往带有参数,以标志处理消息的方法。(2)控件的通知消息(Control notifications)。当控件的状态发生改变(例如用户在控件中进行输入)时,控件就会向其父窗口发送WM_COMMAND通知消息。应用程序框架处理控件消息的方法和窗口消息相同,但按钮的BN_CLICKED通知消息除外,它的处理方法与命令消息相同。(3)命令消息
15、(Command message)。命令消息主要包括由用户交互对象(菜单、工具条的按钮、快捷键等)发送的WM_COMMAND通知消息。命令消息的处理方式与其他两种消息不同,它能够被多种对象接收、处理,这些对象包括文档类、文档模板类、应用程序本身以及窗口和视类等;而窗口消息和控件的通知消息是由窗口对象接收并处理的,这里的窗口对象是指从CWnd中派生的类的对象,它包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及从这些类派生的对象等。3.4.2 消息和消息映射消息和消息映射2. ClassWizard映射消息的一般方法映射消息的一般方法在MF
16、C中,绝大多数消息都可由MFC的ClassWizard来映射。将ClassWizard对话框切换到Message Maps页面(参看图3.15),可以看到它有许多选项,如项目组合框、类组合框等。各项功能说明如表3.5所示。表表3.5 ClassWizard对话框的对话框的Message Maps页面功能页面功能3.4.2 消息和消息映射消息和消息映射2. ClassWizard映射消息的一般方法映射消息的一般方法例如,若向CEx_SDIHelloView中添加WM_LBUTTOMDOWN的消息映射,则可按下列步骤进行:(1) 按Ctrl+W快捷键打开MFC ClassWizard对话框。(2)
17、 在Class name组合框中,将类名选定为CEx_SDIHelloView。此时,Object IDs和Messages列表内容会相应的改变。(3) 在Object IDs列表框中选定CEx_SDIHelloView,而在Messages列表中选定WM_LBUTTOMDOWN消息。(4) 双击Messages列表中的WM_LBUTTOMDOWN消息或单击Add Function按钮,都会在CEx_SDIHelloView类中添加该消息的映射函数OnLButtonDown,同时在Member funcions列表中显示这一消息映射函数和被映射的消息,结果如图3.16所示。(5) 单击Edit
18、 Code按钮后,ClassWizard对话框退出,并转向文档窗口,定位到OnLButtonDown函数源代码处。(6) 添加下列代码:void CEx_SDIHelloView:OnLButtonDown(UINT nFlags, CPoint point) MessageBox (你好,我的你好,我的Visual C+世界!世界!, 问候问候, 0) ;CView:OnLButtonDown(nFlags, point);(7) 这样就完成了一个消息映射过程。程序运行后,在窗口客户区单击鼠标左键,就会弹出一个消息对话框。3.4.2 消息和消息映射消息和消息映射图3.16 映射WM_LBUT
19、TONDOWN消息3.4.2 消息和消息映射消息和消息映射3. 消息映射代码消息映射代码查看CEx_SDIHelloView程序代码,可以发现:ClassWizard为WM_LBUTTOMDOWN的消息映射作了以下三个方面内容的安排:(1) 在头文件Ex_SDIHelloView.h中声明消息处理函数OnLButtonDown:protected:/AFX_MSG(CEx_SDIHelloView)afx_msg void OnLButtonDown(UINT nFlags, CPoint point);/AFX_MSGDECLARE_MESSAGE_MAP()代码中的/AFX_MSG(CEx
20、_SDIHelloView)和/AFX_MSG之间的部分是ClassWizard定义的专门用作消息映射函数声明的标记。表示该程序块中的消息映射声明是由ClassWizard来自动管理的,用户一般不需要去更改。需要说明的是,凡/和/之间的程序代码块均由ClassWizard自动管理。3.4.2 消息和消息映射消息和消息映射3. 消息映射代码消息映射代码(2) 在Ex_SDIHelloView.cpp源文件前面的消息映射入口处,添加了相应的映射宏:BEGIN_MESSAGE_MAP(CEx_SDIHelloView, CView)/ 消息映射开始/AFX_MSG_MAP(CEx_SDIHelloV
21、iew)ON_WM_LBUTTONDOWN()/AFX_MSG_MAPEND_MESSAGE_MAP()/ 消息映射结束(3) 在Ex_SDIHelloView.cpp文件中写入一个空的消息处理函数的模板,以便用户填入具体代码,如下面的框架:void CEx_SDIHelloView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCView:OnLButtonDown(nFlags, point);4.消息映射函数的删除:消息映射函数的
22、删除:(1)先在ClassWizard中删除对应的消息映射函数;(2)然后删除cpp文件中对应的映射函数定义代码。3.4.2 消息和消息映射消息和消息映射4. 键盘消息键盘消息当用户按下一个键或组合键时,Windows将WM_KEYDOWN或WM_SYSKEYDOWN放入具有输入焦点的应用程序窗口的消息队列中。当键被释放时,Windows则把WM_KEYUP或WM_SYSKEYUP消息放入消息队列中。对于字符键来说,还会在这两个消息之间产生WM_CHAR消息。MFC ClassWizard能自动添加了当前类的WM_KEYDOWN和WM_KEYUP击键消息处理函数的调用,它们具有下列函数原型:a
23、fx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );afx_msg是MFC用于定义消息函数的标志,参数nChar表示虚拟键代码,nRepCnt表示当用户按住一个键时的重复计数,nFlags表示击键消息标志。所谓虚拟键代码,是指与设备无关的键盘编码。在Visual C+中,最常用的虚拟键代码已被定义在Winuser.h中,例如:VK_SHIFT表示SHIFT键,VK_F1表示功能键F1等。同击键消息一
24、样,MFC中的ClassWizard也提供相应的字符消息处理框架,并自动添加了当前类的WM_CHAR消息处理函数调用,它具有下列函数原型:afx_msg void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );参数nChar表示键的ASCII码,nRepCnt表示当用户按住一个键时的重复计数,nFlags表示字符消息标志。键盘消息例子: 新建一个基于对话框的MFC(.exe)应用程序,工程名为Ex_Four,然后在主对话框类CEx_FourDlg上点右键,添加一个虚函数PreTranslateMessage。 在BOOL CGameDlg:Pr
25、eTranslateMessage(MSG* pMsg)函数中添加如下代码: if(pMsg-message=WM_KEYDOWN & pMsg-wParam=VK_RETURN) AfxMessageBox(你按下了键盘上的回车键!);if (pMsg-message = WM_CHAR) if(pMsg-wParam =a | (char)pMsg-wParam =A)/VC+支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改 AfxMessageBox(_T(A); 编译运行,按键盘上的回车键或字母A键
26、,就会弹出提示对话框。 3.4.2 消息和消息映射消息和消息映射5. 鼠标消息鼠标消息当用户对鼠标进行操作时,像键盘一样也会产生对应的消息。通常,Windows只将键盘消息发送给具有输入焦点的窗口,但鼠标消息不受这种限制。只要鼠标移过窗口的客户区时,就会向该窗口发送WM_MOUSEMOVE(移动鼠标)消息。这里的客户区是指窗口中用于输出文档的区域。由于MFC头文件中定义的与鼠标按钮相关的标识使用了LBUTTON(左)、MBUTTON(中)和RBUTTON(右),因而当在窗口的客户区中按下或释放一个鼠标键时,还会产生如表3.6所示的消息。表表3.6 客户区鼠标消息客户区鼠标消息3.4.2 消息和
27、消息映射消息和消息映射5. 鼠标消息鼠标消息对于所有这些消息来说,ClassWizard都会将映射成类似afx_msg void OnXXXX的消息处理函数,如前面WM_LBUTTONDOWN的消息函数OnLButtonDown,它们具有函数原型:afx_msg void OnXXXX( UINT nFlags, CPoint point );其中,point表示鼠标光标在屏幕的(x,y)坐标;nFlags表示鼠标按钮和键盘组合情况,它可以是下列值的组合(MK前缀表示“鼠标键”): MK_CONTROL 键盘上的Ctrl键被按下 MK_LBUTTON 鼠标左按钮被按下 MK_MBUTTON 鼠
28、标中按钮被按下 MK_RBUTTON 鼠标右按钮被按下 MK_SHIFT 键盘上的Shift键被按下若想知道某个键被按下,可用对应的标识与nFlags进行逻辑“与”(&)运算,所得结果若为TRUE(非0)时,则表示该键被按下。例如,若收到了WM_LBUTTONDOWN消息,且值nFlags&MK_CONTROL是TRUE时,则表明按下鼠标左键的同时也按下Ctrl键。3.4.2 消息和消息映射消息和消息映射6. 计时器消息计时器消息应用程序是通过CWnd的SetTimer函数来设置并启动计时器的,这个函数的原型如下: UINT SetTimer( UINT nIDEvent, U
29、INT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );参数nIDEvent用来指定该计时器的标识值(不能为0),当应用程序需要多个计时器时可多次调用该函数,但每一个计时器的标识值应是唯一的,各不相同。nElapse表示计时器的时间间隔(单位为毫秒),lpfnTimer是一个回调函数的指针,该函数由应用程序来定义,用来处理计时器WM_TIMER消息。一般情况下该参数为NULL,此时WM_TIMER消息被放入到应用程序消息队列中供CWnd对象处理。SetTimer函数成功调用后返回新计时器的标识值。当应用
30、程序不再使用计时器时,可调用CWnd: KillTimer函数来停止WM_TIMER消息的传送,其函数原型如下: BOOL KillTimer( int nIDEvent );其中nIDEvent和用户调用SetTimer函数设置的计时器标识值是一致的。对于WM_TIMER消息,ClassWizard会将其映射成具有下列原型的消息处理函数: afx_msg void OnTimer( UINT nIDEvent );通过nIDEvent可判断出WM_TIMER是哪个计时器传送的。3.4.2 消息和消息映射消息和消息映射7. 其他窗口消息其他窗口消息在系统中,除了用户输入产生的消息外,还有许多系
31、统根据应用程序的状态和运行过程产生的消息,有时也需要用户进行处理。(1) WM_CREATE消息。该消息是在窗口对象创建后,Windows向视图发送的第一个消息;如果用户有什么工作需要在初始化时处理,就可在该消息处理函数中加入所需代码。但是,由于WM_CREATE消息发送时,窗口对象还未完成,窗口还不可见,因此在该消息处理函数OnCreate内,不能调用那些依赖于窗口处于完成激活状态的Windows函数,如窗口的绘图函数等。(2) WM_CLOSE或WM_DESTROY消息。当用户从系统菜单中关闭窗口或者父窗口被关闭时,Windows都会发送WM_CLOSE消息;而WM_DESTROY消息是在窗口从屏幕消失后发送的,因此它紧随WM_CLOSE之后。(3) WM_PAINT消息。当窗口的大小发生变化、窗口内容发生变化、窗口间的层叠关系发生变化或调用函数UpdateWindow或RedrawWindow时,系统都将产生WM_PA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年医疗废物规范化管理培训试题及答案
- 2026六年级数学上册 分数乘法思维拓展训练
- 行风建设自查自纠工作报告
- 消防安全自查自纠整改报告
- 护理工作流程优化与改进
- 心育首诊责任制度
- 戒毒所首接责任制度
- 打黄打非岗位责任制度
- 技术员安全责任制度范本
- 护厂工岗位责任制度
- 2026年安徽工商职业学院单招职业技能考试题库带答案详解(考试直接用)
- 2026年徐州生物工程职业技术学院单招职业适应性测试题库与答案详解
- 2025-2030中国礼品酒行业供需趋势及投资风险研究报告
- 2026年商丘职业技术学院单招职业技能测试题库及答案详解(名校卷)
- 施工现场临时用电分区管控实施方案
- 2026年内蒙古电子信息职业技术学院单招综合素质考试题库带答案详解(精练)
- 塔吊作业安全技术交底
- 危险作业审批人培训试题(附答案)
- 2026年徽商职业学院单招职业适应性测试题库及答案解析
- 2026浙江绍兴杭绍临空示范区开发集团有限公司工作人员招聘23人考试参考题库及答案解析
- 2026春统编版二年级下册小学道德与法治每课教学设计(简练版)新教材
评论
0/150
提交评论