《MFC基本应用程序的建立.ppt》由会员分享,可在线阅读,更多相关《MFC基本应用程序的建立.ppt(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、4.1Windows编程基础编程基础 4.1.1简单的简单的Windows应用程序应用程序 例例Ex_HelloMsg 一个简单的一个简单的Windows应用程序。应用程序。#include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) MessageBox (NULL, 你好,我的你好,我的Visual C+世界!世界!, 问候问候, 0) ; return 0 ; 运行上述程序需要进行以下步骤:运行上述程序需要进行以下步骤:选择选择“File”
2、“New”。单击。单击Projects,选中,选中Win32 Application项。项。在在Project Name框中键入项目名称框中键入项目名称Ex_HelloMsg。在。在Location下的编辑下的编辑框中直接键入文件夹名称,或单击框中直接键入文件夹名称,或单击Browse按钮按钮(.)选择一个已有的文件夹。选择一个已有的文件夹。单击单击OK。选中。选中An empty project项。单击项。单击Finish,单击,单击OK系统将系统将自动创建此应用程序。自动创建此应用程序。 选择选择“File”“New”。单击。单击File标签,在左边的列表框中选择标签,在左边的列表框中选择
3、C+ Source File项,在右边的项,在右边的File框中键入框中键入Ex_HelloMsg.cpp,单击,单击OK。4.1Windows编程基础编程基础输入上面的代码,运行程序,如图。输入上面的代码,运行程序,如图。从程序可以看出从程序可以看出 :传统的传统的DOS程序以程序以main函数作为进入程序的初始入口点,但在函数作为进入程序的初始入口点,但在Windows应用程序中,应用程序中,main函数被函数被WinMain函数取而代之,函数取而代之,WinMain函数的原型函数的原型如下:如下:int WINAPI WinMain (HINSTANCE hInstance, / 当前实
4、例句柄当前实例句柄HINSTANCE hPrevInstance, / 前一实例句柄前一实例句柄LPSTR lpCmdLine, / 指向命令行参数的指针指向命令行参数的指针int nCmdShow) / 窗口的显示状态窗口的显示状态句柄句柄是一个标识是一个标识Windows资源资源(如菜单、图标、窗口等如菜单、图标、窗口等)和设备等对象的变和设备等对象的变量,或者是一个对操作系统资源的间接引用。量,或者是一个对操作系统资源的间接引用。每一个每一个Windows应用程序都需要应用程序都需要Windows.h头文件,它还包含了其他的头文件,它还包含了其他的一些一些Windows头文件。这些头文件
5、定义了头文件。这些头文件定义了Windows的所有数据类型、函的所有数据类型、函数调用、数据结构和符号常量。数调用、数据结构和符号常量。MessageBox是一个是一个Win32 API(Application Programming Interface, 应用程序接口应用程序接口)函数,用来弹出一个对话框窗口,显示短信息。该函数第一函数,用来弹出一个对话框窗口,显示短信息。该函数第一个参数用来指定父窗口句柄,即对话框所在的窗口句柄。第二、三个参数个参数用来指定父窗口句柄,即对话框所在的窗口句柄。第二、三个参数分别用来指定显示的消息内容和对话框窗口的标题,最后一个参数用来指分别用来指定显示的消
6、息内容和对话框窗口的标题,最后一个参数用来指定在对话框中显示的按钮。定在对话框中显示的按钮。 图图4.1 Ex_HelloMsg运行结果运行结果4.1Windows编程基础编程基础例例Ex_HelloWin 一个完整的一个完整的Windows应用程序。应用程序。#include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);/ 窗窗口过程口过程int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
7、HWND hwnd ;/ 窗口句柄窗口句柄 MSG msg ;/ 消息消息 WNDCLASSwndclass ;/ 窗口类窗口类 wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc= WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra= 0 ; wndclass.hInstance= hInstance ; wndclass.hIcon= LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor= LoadCurs
8、or (NULL, IDC_ARROW) ; wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName= NULL ; wndclass.lpszClassName= “HelloWin”;/ 窗口类名窗口类名 if (!RegisterClass (&wndclass)/ 注注册窗口册窗口 MessageBox (NULL, 窗口注册失败!窗口注册失败!, HelloWin, 0) ; return 0 ; 4.1Windows编程基础编程基础 hwnd = CreateWind
9、ow (HelloWin, / 窗口类名窗口类名 我的窗口我的窗口,/ 窗口标题窗口标题 WS_OVERLAPPEDWINDOW, / 窗口样式窗口样式 CW_USEDEFAULT, / 窗口最初的窗口最初的 x 位置位置 CW_USEDEFAULT, / 窗口最初的窗口最初的 y 位置位置 CW_USEDEFAULT, / 窗口最初的窗口最初的 x 大小大小 CW_USEDEFAULT, / 窗口最初的窗口最初的 y 大小大小 NULL, / 父窗口句柄父窗口句柄 NULL, / 窗口菜单句柄窗口菜单句柄 hInstance, / 应用程序实例句柄应用程序实例句柄 NULL) ; / 创建窗
10、口的参数创建窗口的参数 ShowWindow (hwnd, nCmdShow) ;/ 显示窗口显示窗口 UpdateWindow (hwnd) ;/ 更新窗口,包括窗口的更新窗口,包括窗口的客户区客户区 / 进入消息循环:当从应用程序消息队列中检取的消息是进入消息循环:当从应用程序消息队列中检取的消息是WM_QUIT时,则退出循时,则退出循环。环。 while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ;/ 转换某些键盘消息转换某些键盘消息 DispatchMessage (&msg) ;/ 将消息发送给窗口过程,这里是将消息
11、发送给窗口过程,这里是WndProc return msg.wParam ; 4.1Windows编程基础编程基础LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)switch (message) case WM_CREATE:/ 窗口创建产生的消息return 0 ; case WM_LBUTTONDOWN:MessageBox (NULL, 你好,我的Visual C+世界!, 问候, 0) ;return 0 ; case WM_DESTROY:/ 当窗口关闭时产生的消息Post
12、QuitMessage (0) ;return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ; / 执行默认的消息处理 4.1Windows编程基础编程基础程序运行,单击鼠标左键,如图。程序运行,单击鼠标左键,如图。窗口过程函数窗口过程函数WndProc用来接收和处理各种不同的消息,用来接收和处理各种不同的消息,WinMain函数函数通常要完成:通常要完成:调用调用API函数函数RegisterClass注册应用程序的窗口类。注册应用程序的窗口类。调用相关调用相关API函数创建和显示窗口,并进行必要的初始化。函数创建和显示窗
13、口,并进行必要的初始化。CreateWindow创建已注册窗口类的窗口。创建已注册窗口类的窗口。Windows每一个窗口都有一每一个窗口都有一些基本属性。窗口类就是充当这些属性的模板。些基本属性。窗口类就是充当这些属性的模板。创建和启动应用程序的消息循环。创建和启动应用程序的消息循环。Windows应用程序接受各种不同的消息。应用程序接受各种不同的消息。Windows系统首先将消息放入消息队列中,应用程序的消息循环就是从应系统首先将消息放入消息队列中,应用程序的消息循环就是从应用程序的消息队列中检取消息,并将消息发送相应的窗口过程函数中作进用程序的消息队列中检取消息,并将消息发送相应的窗口过程
14、函数中作进一步处理。一步处理。如果接收到如果接收到WM_QUIT消息,则退出应用程序消息,则退出应用程序 图图4.2 Ex_HelloWin运行结果运行结果4.1Windows编程基础编程基础应用程序的基本流程,如图。 图图4.3 Windows应用程序的基本流程应用程序的基本流程4.1Windows编程基础编程基础4.1.2Windows编程特点编程特点 消息驱动机制消息驱动机制 DOS程序是通过调用系统的函数来获得用户输入的,程序是通过调用系统的函数来获得用户输入的,Windows程序则是程序则是通过操作系统发送的消息来处理用户输入的。通过操作系统发送的消息来处理用户输入的。无论是系统产生
15、的动作或是运行应用程序产生的动作,都称为事件无论是系统产生的动作或是运行应用程序产生的动作,都称为事件(Events)产生的消息产生的消息(Message)。在应用程序中,通过接收消息、分发消。在应用程序中,通过接收消息、分发消息、处理消息来和用户进行交互。许多消息都经过了严格的定义,并且适息、处理消息来和用户进行交互。许多消息都经过了严格的定义,并且适用于所有的应用程序。用于所有的应用程序。 图形设备接口图形设备接口(GDI )DOS环境中,要在打印机上打印一幅图形是非常复杂的事件。环境中,要在打印机上打印一幅图形是非常复杂的事件。Windows则提供了一个抽象的接口,称为图形设备接口则提供
16、了一个抽象的接口,称为图形设备接口(Graphical Device Interface,简称,简称GDI),使得用户直接利用系统的,使得用户直接利用系统的GDI函数就能方便实现函数就能方便实现输入或输出,而不必关心与系统相连的外部设备的类型。输入或输出,而不必关心与系统相连的外部设备的类型。 基于资源的程序设计基于资源的程序设计Windows应用程序常常包含众多图形元素,每一个这样的元素都作为一种应用程序常常包含众多图形元素,每一个这样的元素都作为一种可以装入应用程序的资源来存放。这些资源可以被编辑、修改,也可以被可以装入应用程序的资源来存放。这些资源可以被编辑、修改,也可以被其他应用程序所
17、共享。其他应用程序所共享。VC中提供的许多编辑器能中提供的许多编辑器能“所见即所得所见即所得”地进行不地进行不同类型资源的设计、编辑等。同类型资源的设计、编辑等。 4.1Windows编程基础编程基础动态链接库动态链接库u提供一些特定结构的函数,能被应用程序在运行过程中装入和连接,多个提供一些特定结构的函数,能被应用程序在运行过程中装入和连接,多个程序可以共享同一个动态链接库。程序可以共享同一个动态链接库。从编程角度,动态链接库可以提高程序模块的灵活性,它本身是可以单独设计、编译和调试的。uWindows提供了应用程序可利用的丰富的函数调用,大多数用于实现其用户界面和在显示器上显示的文本和图形
18、,都是通过动态链接库来实现的。uWindows中,KERNEL32用来处理存储器低层功能、任务和资源管理等核用来处理存储器低层功能、任务和资源管理等核心服务;心服务; GDI32用来提供图形设备接口,管理用户界面和图形绘制;用来提供图形设备接口,管理用户界面和图形绘制;USER32负责窗口的管理。负责窗口的管理。 进程和线程进程和线程uWindows是一个是一个32位多任务操作系统,采用进程和线程的管理模式。位多任务操作系统,采用进程和线程的管理模式。u进程是装入内存中正在执行的应用程序。进程包括私有的虚拟地址空间、进程是装入内存中正在执行的应用程序。进程包括私有的虚拟地址空间、代码、数据及其
19、它操作系统资源。进程包括了一个或多个在进程上下文内代码、数据及其它操作系统资源。进程包括了一个或多个在进程上下文内运行的线程。运行的线程。u线程是操作系统分配线程是操作系统分配CPU时间的基本实体。线程可以执行应用程序代码的时间的基本实体。线程可以执行应用程序代码的任何部分,包括当前正在被其它线程执行的那些部分。同一进程的所有线任何部分,包括当前正在被其它线程执行的那些部分。同一进程的所有线程共享同样的虚拟地址空间、全局变量和操作系统资源。程共享同样的虚拟地址空间、全局变量和操作系统资源。u一个应用程序,包括一个或多个进程,每个进程由一个或多个线程构成。一个应用程序,包括一个或多个进程,每个进
20、程由一个或多个线程构成。4.1Windows编程基础编程基础4.1.3Windows基本数据类型基本数据类型4.1Windows编程基础编程基础需要说明的是:u这些基本数据类型都是以大写字符出现。这些基本数据类型都是以大写字符出现。u凡是数据类型的前缀是凡是数据类型的前缀是P或或LP,表示该类型是一个指针或长指针数据类型。,表示该类型是一个指针或长指针数据类型。前缀是前缀是H,表示是句柄类型。前缀是,表示是句柄类型。前缀是U,表示是无符号数据类型。,表示是无符号数据类型。u还提供一些宏来处理上述基本数据类型。还提供一些宏来处理上述基本数据类型。LOBYTE和和HIBYTE分别用来获取分别用来获
21、取16位数值中的低位和高位字节;位数值中的低位和高位字节;LOWORD和和HIWORD分别用来获取分别用来获取32位位数值中的低位和高位字;数值中的低位和高位字;MAKEWORD是将两个是将两个16位无符号值结合成一个位无符号值结合成一个32位无符号值。位无符号值。4.2编制一个编制一个MFC应用程序应用程序4.2.1MFC概述概述1987年微软公司推出了第一代年微软公司推出了第一代Windows产品,并为应用程序设计者提供产品,并为应用程序设计者提供了了Win16 API,在此基础上推出了,在此基础上推出了Windows GUI(图形用户界面图形用户界面),然后,然后采用面向对象技术对采用面
22、向对象技术对API进行封装。进行封装。1992年推出应用程序框架产品年推出应用程序框架产品AFX(Application Frameworks),并在,并在AFX的基础上进一步发展为的基础上进一步发展为MFC产品。产品。MFC类的基本层次结构如图。类的基本层次结构如图。 图图4.4 MFC类的基本层次结构类的基本层次结构CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd4.2编制一个编制一个MFC应用程序应用程序4.2.2设计一个设
23、计一个MFC程序程序例例Ex_HelloMFC 一个一个MFC应用程序。应用程序。#include / MFC头文件头文件class CHelloApp : public CWinApp/ 声明应用程序类声明应用程序类public:virtual BOOL InitInstance();CHelloApp theApp; / 建立应用程序类的实例建立应用程序类的实例class CMainFrame: public CFrameWnd/ 声明主窗口类声明主窗口类public:CMainFrame()/ 创建主窗口创建主窗口Create(NULL, 我的窗口我的窗口, WS_OVERLAPPEDW
24、INDOW, CRect(0,0,400,300);protected:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);DECLARE_MESSAGE_MAP();/ 消息映射入口消息映射入口BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_WM_LBUTTONDOWN()/ 单击鼠标左键消息的映射宏单击鼠标左键消息的映射宏END_MESSAGE_MAP()4.2编制一个编制一个MFC应用程序应用程序void CMainFrame:OnLButtonDown(UINT nFlags, CPoint
25、point) MessageBox (你好,我的Visual C+世界!, 问候, 0) ;CFrameWnd:OnLButtonDown(nFlags, point);/ 每当应用程序首次执行时都要调用的初始化函数BOOL CHelloApp:InitInstance()m_pMainWnd = new CMainFrame(); m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); return TRUE; 运行上述MFC程序需要进行以下步骤:u选择“File”“New”。单击Projects,选中Win32 Appli
26、cation项,创建一个Ex_HelloMFC空应用程序项目。u选择“File”“New”。单击File标签,在左边的列表框中选择C+ Source File项,在右边的File框中键入Ex_HelloMsg.cpp,单击OK。u输入上面的代码。选择“Project”“Settings”,选择“General”标签。在“Microsoft Foundation Classes”组合框中,选择“Use MFC in a Shared DLL”。单击OK。u程序运行后,单击鼠标左键,就会弹出一个对话框,结果同Ex_HelloWin。 4.2编制一个编制一个MFC应用程序应用程序4.2.3理解程序代
27、码理解程序代码 MFC是使用是使用afxwin.h来代替头文件来代替头文件windows.h。运行应用程序时,自动调用应用程序框架内部的运行应用程序时,自动调用应用程序框架内部的WinMain函数,并自动查函数,并自动查找该应用程序类找该应用程序类CHelloApp(从从CWinApp派生派生)的全局变量的全局变量theApp,然后,然后自动调用自动调用CHelloApp的虚函数的虚函数InitInstance,该函数会进一步调用相应的,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作。上述程序中函数来完成主窗口的构造和显示工作。上述程序中InitInstance的执行过的执行过程。程
28、。首先执行的是:首先执行的是:m_pMainWnd = new CMainFrame();创建从创建从CFrameWnd类派生而来的用户框架窗口类派生而来的用户框架窗口CMainFrame类对象,继类对象,继而调用该类的构造函数,使得而调用该类的构造函数,使得Create函数被调用,完成了窗口创建工作。函数被调用,完成了窗口创建工作。然后执行后面两句:然后执行后面两句:m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();用作窗口的显示和更新。用作窗口的显示和更新。最后返回最后返回TRUE,表示窗口创建成功。,表示窗口创建成功。
29、由于应用程序类由于应用程序类CWinApp是用来调用是用来调用WinMain以及实例的初始化,因此以及实例的初始化,因此每一个每一个MFC应用程序有且只能一个这样的应用程序类,且需要一个全局的应用程序有且只能一个这样的应用程序类,且需要一个全局的对象实例,如上述程序中的对象实例,如上述程序中的theApp。 4.2编制一个编制一个MFC应用程序应用程序InitInstance完成初始化后,调用基类完成初始化后,调用基类CWinApp的成员函数的成员函数Run,执行,执行应用程序的消息循环。应用程序的消息循环。Run检查到消息队列为空时,调用基类检查到消息队列为空时,调用基类CWinApp的的成
30、员函数成员函数OnIdle进行空闲时的后台处理工作。若消息队列为空且又没有后进行空闲时的后台处理工作。若消息队列为空且又没有后台工作要处理时,则应用程序一直处于等待状态,一直等到有消息为止。台工作要处理时,则应用程序一直处于等待状态,一直等到有消息为止。当程序结束后,调用基类当程序结束后,调用基类CWinApp的成员函数的成员函数ExitInstance,完成终止,完成终止应用程序的收尾工作。应用程序的收尾工作。在在MFC中,一个消息的处理往往是通过独特的中,一个消息的处理往往是通过独特的MFC消息映射机制来进行的。消息映射机制来进行的。消息映射消息映射(Message Map)机制,指机制,
31、指MFC类中将消息与消息处理函数联系类中将消息与消息处理函数联系起来,一一对应的机制。任何一个从类起来,一一对应的机制。任何一个从类CCmdTarget派生的类理论上均可派生的类理论上均可处理消息,且都有相应的消息映射函数。处理消息,且都有相应的消息映射函数。按照按照MFC的消息映射机制,映射一个消息的过程由三个部分组成:的消息映射机制,映射一个消息的过程由三个部分组成:在处理消息的类中,使用消息宏在处理消息的类中,使用消息宏DECLARE_MESSAGE_MAP()声明对声明对消息映射的支持,并在该宏之前声明消息处理函数。消息映射的支持,并在该宏之前声明消息处理函数。使用使用BEGIN_ME
32、SSAGE_MAP和和END_MESSAGE_MAP宏在类声明宏在类声明之后的地方定义该类支持的消息映射入口点,所有消息映射宏都添加之后的地方定义该类支持的消息映射入口点,所有消息映射宏都添加在这里,当然不同的消息在这里,当然不同的消息MFC都会有不同的消息映射宏。都会有不同的消息映射宏。定义消息处理函数。定义消息处理函数。为了使该消息能被其他对象接收并处理,在函数中常常需要调用基类中的为了使该消息能被其他对象接收并处理,在函数中常常需要调用基类中的相关消息处理函数。相关消息处理函数。MFC的的ClassWizard(类向导类向导)能自动完成消息的上述能自动完成消息的上述映射过程。映射过程。4
33、.3使用使用MFC AppWizard4.3.1应用程序框架类型应用程序框架类型4.3使用使用MFC AppWizard4.3.2创建一个单文档应用程序创建一个单文档应用程序开始开始选择选择“File”“New”,选择,选择Projects标签;选择标签;选择MFC AppWizard(exe)的项目类型的项目类型(该类型用于创建可执行的该类型用于创建可执行的Windows应用程序应用程序),将项目工作文,将项目工作文件夹定位在件夹定位在“D:Visual C+ 6.0程序程序”,并在,并在“Project Name”框中输框中输入项目名入项目名Ex_SDIHello,如图,单击,如图,单击O
34、K。图图4.5 MFC AppWizard的的“New”对话框对话框4.3使用使用MFC AppWizard第一步第一步u从应用程序类型从应用程序类型Single Document、Multiple Document和和Dialog Based中选择中选择SDI。u决定应用程序中是否需要决定应用程序中是否需要MFC的的“文档文档/视图视图”结构的支持。若不选定此项,结构的支持。若不选定此项,则程序中的磁盘文件的打开、保存以及文档和视图的相互作用等功能需要用则程序中的磁盘文件的打开、保存以及文档和视图的相互作用等功能需要用户来实现,且将跳过户来实现,且将跳过Step 2Step 5,直接弹出,直
35、接弹出“Step 6”对话框。对话框。u选择资源所使用的语言,这里是选择资源所使用的语言,这里是“中文中文中国中国”,单击,单击Next按钮。按钮。图图4.6 SDI的的“Step 1”对话框对话框4.3使用使用MFC AppWizard第二步第二步单击Next按钮进入下一步。 第三步第三步单击Next按钮进入下一步。 图图4.7 SDI的的“Step 2”对话框对话框图图4.8 SDI的的“Step 3”对话框对话框4.3使用使用MFC AppWizard第四步第四步单击Next按钮进入下一步。 图图4.9 SDI的的“Step 4”对话框对话框4.3使用使用MFC AppWizard第五步
36、第五步在弹出的对话框在弹出的对话框(如图如图)中出现三个方面的选项,供用户来选择:中出现三个方面的选项,供用户来选择: u应用程序的主窗口是应用程序的主窗口是MFC标准风格还是窗口左边有切分窗口的浏览器风格;标准风格还是窗口左边有切分窗口的浏览器风格;u在源文件中是否加入注释用来引导用户编写程序代码;在源文件中是否加入注释用来引导用户编写程序代码;u使用动态链接库还是静态链接库。使用动态链接库还是静态链接库。u保留缺省状态,单击保留缺省状态,单击Next按钮进行下一步按钮进行下一步。图图4.10 SDI的的“Step 5”对话框对话框4.3使用使用MFC AppWizard第六步第六步单击Fi
37、nish按钮出现如图4.12所示的对话框 图图4.11 SDI的的“Step 6”对话框对话框图图4.12 项目信息对话框项目信息对话框4.3使用使用MFC AppWizard编译并运行编译并运行图图4.13 应用程序运行结果应用程序运行结果菜单栏工具栏状态栏标题栏文档窗口4.3使用使用MFC AppWizard4.3.3理解程序框架理解程序框架应用类应用类CEx_SDIHelloApp下面首先来看看下面首先来看看Ex_SDIHello应用程序的应用程序的Ex_SDIHello.h文件:文件:.class CEx_SDIHelloApp : public CWinApppublic:CEx_S
38、DIHelloApp();/AFX_VIRTUAL(CEx_SDIHelloApp)public:virtual BOOL InitInstance();/AFX_VIRTUAL/ Implementation(实现实现)/AFX_MSG(CEx_SDIHelloApp)afx_msg void OnAppAbout();/ NOTE - the ClassWizard will add and remove member functions here./ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGD
39、ECLARE_MESSAGE_MAP()/ 声明消息映射声明消息映射;. 4.3使用使用MFC AppWizard代码中,代码中,/AFX_VIRTUAL(类名类名)./AFX_VIRTUAL是是ClassWizard定义的专门用作虚函数重载的标记,表示该程序块中的虚定义的专门用作虚函数重载的标记,表示该程序块中的虚函数的重载是由函数的重载是由ClassWizard来自动管理的,一般不需要去更改。同样,来自动管理的,一般不需要去更改。同样,/AFX_MSG(类名类名)./AFX_MSG是是ClassWizard定义的专门用作消息映射声明的标记。定义的专门用作消息映射声明的标记。代码中的代码中的
40、“/TODO:”以及英文等注释是由以及英文等注释是由MFC AppWizard为用户自动生为用户自动生成的。若不需要这些注释,可在应用程序向导的第五步对话框中,将成的。若不需要这些注释,可在应用程序向导的第五步对话框中,将“Would you like to generate source file comments?”项选为项选为“No,thank you”。下面再来看看该下面再来看看该Ex_SDIHello应用程序的应用程序的Ex_SDIHello.cpp源文件:源文件:#include stdafx.h/ 预编译处理的头文件预编译处理的头文件#include Ex_SDIHello.h/
41、 应用类的头文件应用类的头文件#include MainFrm.h/ 主框架类的头文件主框架类的头文件#include Ex_SDIHelloDoc.h/ 文档类的头文件文档类的头文件#include Ex_SDIHelloView.h/ 视图类的头文件视图类的头文件 4.3使用使用MFC AppWizard/消息映射开始消息映射开始BEGIN_MESSAGE_MAP(CEx_SDIHelloApp, CWinApp)/ 消息消息映射宏映射宏/AFX_MSG_MAP(CEx_SDIHelloApp)/ 映射映射“帮助帮助”菜单项中的菜单项中的“关于关于Ex_SDIHello”命令消息,当用户选
42、命令消息,当用户选择了择了/ 该命令时,将执行函数该命令时,将执行函数OnAppAboutON_COMMAND(ID_APP_ABOUT, OnAppAbout)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAP/ 映射映射“文件文件”菜单项中的菜单项中的“新建新建”和和“打开打开”命令消息,当用户选择命令消息,当用户选择了了“新建新建”/ 或或“打开打开”命令时,将相应
43、执行命令时,将相应执行CWinApp:OnFileNew或或CWinApp:OnFileOpenON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen)/ 映射映射“文件文件”菜单项中的菜单项中的“打印设置打印设置”命令消息,当用户选择了命令消息,当用户选择了/ 该命令时,将执行函数该命令时,将执行函数CWinApp:OnFilePrintSetupON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp:OnFilePrintSetup)END_MESSA
44、GE_MAP()/ 消息映射宏消息映射宏 4.3使用使用MFC AppWizard/ 消息映射开始结束消息映射开始结束CEx_SDIHelloApp:CEx_SDIHelloApp()/ 构造函数构造函数CEx_SDIHelloApp theApp;/ 定义的一个应用类对象,表示一个实定义的一个应用类对象,表示一个实例例BOOL CEx_SDIHelloApp:InitInstance().void CEx_SDIHelloApp:OnAppAbout()CAboutDlg aboutDlg;/ 定义的定义的CAboutDlg对象对象aboutDlg.DoModal();/ 调用相应的库函数,
45、显示调用相应的库函数,显示CAboutDlg对话框对话框代码中,代码中,/AFX_MSG_MAP(类名类名)./AFX_MSG_MAP是是ClassWizard定义的专门用作消息映射的标记,表示该程序块中的消息定义的专门用作消息映射的标记,表示该程序块中的消息映射函数是由映射函数是由ClassWizard来自动管理的,用户一般不需要去更改。来自动管理的,用户一般不需要去更改。 4.3使用使用MFC AppWizard最主要的最主要的InitInstance函数体代码:函数体代码:BOOL CEx_SDIHelloApp:InitInstance()/ 若用户在若用户在MFC AppWizard
46、的第三步中,选中了的第三步中,选中了“ActiveX Controls”,/ 则表示所创建的应用程序支持则表示所创建的应用程序支持ActiveX控件控件AfxEnableControlContainer();/ 若用户在若用户在MFC AppWizard的第四步中,选中了的第四步中,选中了“3D controls”/ 则表示所创建的应用程序支持则表示所创建的应用程序支持Windows 95版本前的版本前的3D控件风格控件风格#ifdef _AFXDLLEnable3dControls();/ 使用动态的使用动态的3D控件控件#elseEnable3dControlsStatic();/ 使用静
47、态的使用静态的3D控件控件#endif / 在系统注册表中登记应用程序的主键值,以便将一些与应用程序在系统注册表中登记应用程序的主键值,以便将一些与应用程序/ 相关的参数存放在该主键值下相关的参数存放在该主键值下SetRegistryKey(_T(Local MFC AppWizard-Generated Applications);/ 从注册表中调入应用程序的一些标准参数值从注册表中调入应用程序的一些标准参数值.LoadStdProfileSettings(); 4.3使用使用MFC AppWizard/ 若用户在若用户在MFC AppWizard的第一步中,选择了的第一步中,选择了“Sin
48、gle document”类型,类型,/ 则进行下列的单文档模板的创建及其初始化操作。则进行下列的单文档模板的创建及其初始化操作。CSingleDocTemplate* pDocTemplate;/ 定义一个单文档模板指针变量定义一个单文档模板指针变量pDocTemplate = new CSingleDocTemplate(/ 登记并创建单文档应用程序模板登记并创建单文档应用程序模板IDR_MAINFRAME,/ 菜单、快捷键等的资源标识号菜单、快捷键等的资源标识号RUNTIME_CLASS(CEx_SDIHelloDoc),/ 文档类文档类RUNTIME_CLASS(CMainFrame)
49、, / 主框架窗口类主框架窗口类RUNTIME_CLASS(CEx_SDIHelloView);/ 视图类视图类AddDocTemplate(pDocTemplate);/ 向应用程序添加文档模板向应用程序添加文档模板/ 分列命令行标准命令如分列命令行标准命令如DDE、文件打开等、文件打开等CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);/ 传送命令行指定的命令,并执行相应的操作传送命令行指定的命令,并执行相应的操作if (!ProcessShellCommand(cmdInfo)return FALSE;/ 对主框架窗口进行初始化以便显示
50、和更新对主框架窗口进行初始化以便显示和更新m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();return TRUE;4.3使用使用MFC AppWizarduRUNTIME_CLASS是一个运行类的宏定义,返回是一个运行类的宏定义,返回CRuntimeClass类指针。借助类指针。借助CRuntimeClass类结构类结构能在应用程序运行过程中获得该类对象及其基类的相关能在应用程序运行过程中获得该类对象及其基类的相关信息,从而可以实现运行时类型检查。信息,从而可以实现运行时类型检查。uCSingleDocTemplate是一个单文