第二章MFC编程和操作.ppt
《第二章MFC编程和操作.ppt》由会员分享,可在线阅读,更多相关《第二章MFC编程和操作.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章第二章MFC编程和操作编程和操作2.1Windows编程编程2.2MFC编程编程2.3MFC程序应用程序应用 2.4消息和消息映射消息和消息映射2.5Visual C+常用操作常用操作2.1Windows编程编程 2.1.1C+的Windows编程 早期的Windows应用程序开发是使用C/C+通过调用Windows API所提供的结构和函数来进行的。对于有些特殊的功能,有时还要借助相应的软件开发工具(Software Development Kit,简称SDK)来实现。这种编程方式由于其运行效率高,因而至今在某些特殊场合中仍旧使用,但它编程繁琐、手工代码量也比较大。下面来看一个简单的W
2、indows应用程序。例例Ex_HelloMsg 一个简单的一个简单的Windows应用程序应用程序#include int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)MessageBox(NULL,你好,我的Visual C+世界!,问候,0);return 0;2.1Windows编程编程 在在Visual C+6.0运行上述程序需要进行以下步骤:运行上述程序需要进行以下步骤:(1)选择)选择“文件文件”“新建新建”菜单命令,显示出菜单命令,显示出“新建新建
3、”对话框。在对话框。在“工程工程”标签页面的列表框中,选中标签页面的列表框中,选中Win32 Application(Win32 应用程序)应用程序)项。项。(2)在工程编辑框中键入)在工程编辑框中键入Win32应用程序项目名称应用程序项目名称Ex_HelloMsg。在。在“位置位置”编辑框中直接键入文件夹名称,或单击浏览按钮编辑框中直接键入文件夹名称,或单击浏览按钮 选择一个已有选择一个已有的文件夹,这里为的文件夹,这里为“D:Visual C+应用应用第第2章章”。(3)单击)单击确定确定按钮继续。弹出一个向导对话框,用来询问创建的按钮继续。弹出一个向导对话框,用来询问创建的Win32应用
4、程序的项目类型,选中应用程序的项目类型,选中An empty project项。单击项。单击完成完成按钮,按钮,系统将显示该应用程序向导的创建信息,单击系统将显示该应用程序向导的创建信息,单击确定确定按钮系统将自动创建此按钮系统将自动创建此应用程序。应用程序。(4)再次选择)再次选择“文件文件”“新建新建”菜单命令,显示出菜单命令,显示出“新建新建”对话框。对话框。在在“文件文件”标签页面左边的列表框中选择标签页面左边的列表框中选择C+Source File项,在右边的文件项,在右边的文件框中键入框中键入Ex_HelloMsg.cpp,单击,单击确定确定按钮。按钮。(5)输入上面的代码,运行程
5、序,结果)输入上面的代码,运行程序,结果如图如图2.1所示。所示。从上面的程序代码可以看出:从上面的程序代码可以看出:图图2.1 Ex_HelloMsg运行结果运行结果2.1Windows编程编程 C+控制台应用程序以main函数作为进入程序的初始入口点,但在Windows应用程序中,main主函数被WinMain函数取代。WinMain函数的原型如下:int WINAPI WinMain(HINSTANCE hInstance,/当前实例句柄 HINSTANCE hPrevInstance,/前一实例句柄 LPSTR lpCmdLine,/指向命令行参数的指针 int nCmdShow)/窗
6、口的显示状态 每一个C+Windows应用程序都需要Windows.h头文件,它还包含了其他的一些Windows头文件。这些头文件定义了Windows的所有数据类型、函数调用、数据结构和符号常量。程序中结果的输出已不再是显示在屏幕上,而是通过对话框(如MessageBox)来显示或将结果绘制绘制在用户界面元素上。MessageBox是一个Win32 API函数,用来弹出一个消息对话框。该函数第一个参数用来指定父窗口句柄,即对话框所在的窗口句柄。第二、三个参数分别用来指定显示的消息内容和对话框窗口的标题,最后一个参数用来指定在对话框中显示的按钮。下面再看一个比较完整的Windows应用程序Ex_
7、HelloWin。2.1Windows编程编程 例例Ex_HelloWin 一个完整的一个完整的Windows应用程序应用程序 在Visual C+6.0创建和运行上述程序的步骤与Ex_HelloMsg相同。程序运行后,单击鼠标左键,就会弹出一个对话框,结果如图2.2所示。与Ex_HelloMsg相比,示例Ex_HelloWin要复杂的多,但总可以将其分解成是两个基本函数的程序结构。一个是WinMain函数,另一个是用户定义的窗口过程函数WndProc。窗口过程函数WndProc用来接收和处理各种不同的消息,而主函数WinMain通常要完成以下几步工作:图图2.2 Ex_HelloWin运行结
8、果运行结果 (1)调用API函数RegisterClass注册应用程序的窗口类。(2)调用相关API函数创建和显示窗口,并进行其它必要的初始化处理。其中,函数CreateWindow用来创建已注册窗口类的窗口。Windows每一个窗口都有一些基本属性,如窗口标题、窗口位置和大小、应用程序图标、鼠标指针、菜单和背景颜色等。窗口类就是充当这些属性的模板。2.1Windows编程编程 (3)创建和启动应用程序的消息循环。Windows应用程序接受各种不同的消息,包括键盘消息、鼠标以及窗口产生的各种消息。Windows系统首先将消息放入消息队列中,应用程序的消息循环就是从应用程序的消息队列中检取消息,
9、并将消息发送相应的窗口过程函数中作进一步处理。API函数GetMessage 和DispatchMessage就是起到这样的作用。(4)如果接收到WM_QUIT消息,则调用PostQuitMessage,向系统请求退出 2.1.2 Windows编程特点编程特点 1.消息驱动机制消息驱动机制 前面已经看到,Windows应用程序和C+控制台应用程序之间的一个最根本区别,就在于C+控制台应用程序是通过调用系统函数来获得用户输入的,而Windows应用程序则是通过系统发送的消息来处理用户输入的。例如,对鼠标消息WM_LBUTTONDOWN的处理。需要注意的是,许多Windows消息都经过了严格的定
10、义,并且适用于所有的应用程序。例如,当用户按下鼠标的左键时系统就会发送WM_LBUTTONDOWN消息,而当用户敲了一个字符键时系统就会发送WM_CHAR消息,若用户进行菜单选择或工具按钮单击等操作时,系统又会相应地发送WM_COMMAND消息给相应的窗口等等。2.1Windows编程编程 2.图形设备接口图形设备接口 在传统的DOS环境中,想要在打印机上打印一幅图形是一件非常复杂的事情,因为用户必须根据打印机类型和指令规则向打印机输送数据。而Windows则提供了一个抽象的接口,称为图形设备接口图形设备接口(Graphical Device Interface,简称GDI),使得用户直接利用
11、系统的GDI函数就能方便实现输入或输出,而不必关心与系统相连的外部设备的类型。3.基于资源的程序设计基于资源的程序设计 Windows应用程序常常包含众多图形元素,例如光标、菜单、工具栏、位图、对话框等,在Windows环境下,每一个这样的元素都作为一种可以装入应用程序的资源来存放。这些资源就像C+程序中的常量一样,可以被编辑、修改,也可以被其他应用程序所共享。Visual C+6.0中就提供这样的编辑器,可“所见即所得”地对这些不同类型的资源进行设计、编辑等。4.动态链接库动态链接库 动态链接库提供了一些特定结构的函数,能被应用程序在运行过程中装入和连接,且多个程序可以共享同一个动态链接库,
12、这样就可以大大节省内存和磁盘空间。从编程角度来说,动态链接库可以提高程序模块的灵活性,因为它本身是可以单独设计、编译和调试的。2.1Windows编程编程 5.进程和线程进程和线程 在32位Windows多任务操作系统中,采用了进程和线程的管理模式。进程是装入内进程是装入内存中正在执行的应用程序。存中正在执行的应用程序。进程包括私有的虚拟地址空间、代码、数据及其它操作系统资源,如文件、管道以及对该进程可见的同步对象等。进程包括了一个或多个在进程上进程包括了一个或多个在进程上下文内运行的线程。线程是操作系统分配下文内运行的线程。线程是操作系统分配CPU时间的基本实体时间的基本实体。线程可以执行应
13、用程序代码的任何部分,包括当前正在被其它线程执行的那些部分。同一进程的所有线程共享同一进程的所有线程共享同样的虚拟地址空间、全局变量和操作系统资源。在一个应用程序中,可以包括一个或同样的虚拟地址空间、全局变量和操作系统资源。在一个应用程序中,可以包括一个或多个进程,每个进程由一个或多个线程构成。多个进程,每个进程由一个或多个线程构成。2.1.3 Windows基本数据类型基本数据类型 在前面示例和函数原型中,有一些“奇怪”的数据类型,如前面的HINSTANCE和LPSTR等,事实上,很多这样的数据类型只是一些基本数据类型的别名这样的数据类型只是一些基本数据类型的别名,表2.1列出了一些在Win
14、dows编程中常用的基本数据类型。表2.2列出了常用的预定义句柄,它们的类型均为void*,即一个,即一个32位指针。位指针。需要说明的是:这些基本数据类型都是以大写字符出现,以与一般C+基本数据类型相区别。凡是数据类型的前缀是前缀是P或或LP,则表示该类型是一个指针或长指针数据类型。,则表示该类型是一个指针或长指针数据类型。如果前缀是H,则表示是句柄类型。若前缀是U,则表示是无符号数据类型,等等。Windows还提供一些宏宏来处理上述基本数据类型。例如,LOBYTE和HIBYTE分别用来获取16位数值中的低位和高位字节;LOWORD和HIWORD分别用来获取32位数值中的低位和高位字;MAK
15、EWORD是将两个16位无符号值结合成一个32位无符号值,等等。2.1Windows编程编程表表2.1 Windows常用的基本数据类型常用的基本数据类型Windows所用的所用的数据类型数据类型对应的基本数据类型对应的基本数据类型说明说明BOOLbool布布尔尔值值BSTRunsigned short*32位字符指位字符指针针BYTEunsigned char8位无符号整数位无符号整数COLORREFunsigned long用作用作颜颜色色值值的的32位位值值DWORDunsigned long32位无符号整数,段地址和相关的偏移地址位无符号整数,段地址和相关的偏移地址LONGlong32
16、位位带带符号整数符号整数LPARAMlong作作为为参数参数传递给传递给窗口窗口过过程或回程或回调调函数的函数的32位位值值LPCSTRconst char*指向字符串常量的指向字符串常量的32位指位指针针LPSTRchar*指向字符串的指向字符串的32位指位指针针LPVOIDvoid*指向未定指向未定义类义类型的型的32位指位指针针LRESULTlong来自窗口来自窗口过过程或回程或回调调函数的函数的32位返回位返回值值UINTunsigned int32位无符号整数位无符号整数WORDunsigned short16位无符号整数位无符号整数WPARAMunsigned int当作参数当作参
17、数传递给传递给窗口窗口过过程或回程或回调调函数的函数的32位位值值2.1Windows编程编程表表2.2 Windows常用的句柄类型常用的句柄类型句柄类型句柄类型说明说明HBITMAP保存位图信息的内存域的句柄HBRUSH画刷句柄HCURSOR鼠标光标句柄HDC设备描述表句柄HFONT字体句柄HICON图标句柄HINSTANCE应用程序的实例句柄HMENU菜单句柄HPALETTE颜色调色板句柄HPEN在设备上画图时用于指明线型的笔的句柄HWND窗口句柄2.2MFC编程编程 2.2.1 MFC概述 1987年微软公司推出了第一代Windows产品,并为应用程序设计者提供了Win16(16位Wi
18、ndows操作系统)API,在此基础上推出了Windows GUI(图形用户界面),然后采用面向对象技术对API进行封装。1992年推出应用程序框架产品AFX(Application Frameworks),并在AFX的基础上进一步发展为MFC产品。正因为如此,在用MFC应用程序向导(后面会讨论)创建的程序中仍然保留stdafx.h头文件包含,它是每个应用程序所必有的预编译头文件,程序所用到的Visual C+头文件包含语句一般均添加到这个文件中。MFC类的基本层次结构如图2.3所示。图图2.3 MFC类的基本层次结构类的基本层次结构CCmdTargetCWndCDocumentCFrameW
19、ndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd2.2MFC编程编程 CObject类是MFC提供的绝大多数类的基类。该类完成动态空间的分配与回收,支持一般诊断、出错信息处理和文档序列化等。CCmdTarget类主要负责将系统事件(消息)和窗口事件(消息)发送给响应这些事件的对象,完成消息发送、等待和派遣(调度)等工作,实现应用程序的对象之间协调运行。CWinApp类是应用程序的主线程类,它是从CWinThread类派生而来。CWinThread类用来完成对线程的控制,包括线程的创建、运行
20、、终止和挂起等。CDocument类是文档类,包含了应用程序在运行期间所用到的数据。CWnd类是一个通用的窗口类,用来提供Windows 中的所有通用特性、对话框和控件。CFrameWnd 类是从 CWnd 继承来的,并实现了标准的框架应用程序。CDialog 类用来控制对话框窗口。CView 是用于让用户通过窗口来访问文档。CMDIFrameWnd和CMDIChildWnd类分别用来多文档应用程序的主框架窗口和文档子窗口的显示和管理。CMiniFrameWnd类是一种简化的框架窗口,它没有最大化和最小化窗口按钮,也没有窗口系统菜单,一般很少用到它。2.2MFC编程编程 2.2.2 一个一个M
21、FC程序程序 例例Ex_HelloMFC 一个一个MFC应用程序应用程序 (1)在Visual C+6.0运行上述MFC程序需要进行以下步骤:选择“文件”“新建”菜单命令,显示出“新建”对话框。在“工程”标签页面的列表框中,选 中Win32 Application项,创建一个Ex_HelloMFC空应用程序项目。(2)再次选择“文 件”“新建”菜单命令,显示出“新建”对话框。在文件标签页面左边的列表框中选择C+Source File项,在右边的文件框中键入Ex_HelloMFC.cpp,单击确定按钮。(3)输入上面的代码。选择“工程”“设置”菜单命令,在出现的对话框中选择“General”标签
22、。然后在“Microsoft Foundation Classes”组合框中,选择“Use MFC in a Shared DLL”,如图2.4所示。单击确定按钮。(4)程序运行后,单击鼠标左键,就会弹出一个对话框,结果同Ex_HelloWin。图图2.4 设置工程属性设置工程属性2.2MFC编程编程 2.2.3 理解程序代码理解程序代码 当用户运行应用程序时,Windows会自动调用应用程序框架内部的WinMain函数,并自动查找该应用程序类CHelloApp(从CWinApp派生)的全局变量theApp,然后自动调用CHelloApp的虚函数InitInstance,该函数会进一步调用相应
23、的函数来完成主窗口的构造和显示工作。下面来看看上述程序中InitInstance的执行过程。(1)首先执行的是:m_pMainWnd=new CMainFrame();该语句用来创建从CFrameWnd类派生而来的用户框架窗口CMainFrame类对象,继而调用该类的构造函数,使得Create函数被调用,完成了窗口创建工作。(2)然后执行后面两句:m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();用作窗口的显示和更新。(3)最后返回TRUE,表示窗口创建成功。需要说明的是,由于应用程序类CWinApp派生类CHelloApp
24、有一个全局的对象实例theApp,这使得在构造时还自动进行基类CWinApp的初始化,使得在InitInstance完成初始化工作之后,还调用基类CWinApp的成员函数Run,执行应用程序的消息循环,即重复执行接收消息并转发消息的工作。当Run检查到消息队列为空时,将调用基类CWinApp的成员函数OnIdle进行空闲时的后台处理工作。若消息队列为空且又没有后台工作要处理时,则应用程序一直处于等待状态,一直等到有消息为止。当程序结束后,调用基类CWinApp的成员函数ExitInstance,完成终止应用程序的收尾工作。2.2MFC编程编程选择“文件”“新建”菜单,在弹出的“新建”对话框中,
25、可以看到工程工程标签页面中,显示出一系列的应用程序项目类型,如表2.3所示。这些类型基本满足了用户的各个层次的需要,但用户更关心的是MFC AppWizard(exe)(MFC 应用程序向导,用于创建常见的可执行Windows应用程序)类型,因为它包含了一般用户常创建的最常用、最基本的三种应用程序类型:单文档单文档、多文档多文档和基于对话框基于对话框的应用程序。与单文档应用程序相比较,基于对话框对话框的应用程序是最简单,也是最紧凑的。它没有菜单、工具栏及状态栏,也不能处理文档,但它的好处是速度快,代码少,程序员所花费的开发和调试时间短。多文档应用程序多文档应用程序,顾名思义,能允许同时打开和处
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 MFC 编程 操作
限制150内