《chap3 MFC基本应用程序的建立.ppt》由会员分享,可在线阅读,更多相关《chap3 MFC基本应用程序的建立.ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3章章 MFC基本应用程序的建立基本应用程序的建立3.1 Windows编程基础编程基础3.2 编制一个编制一个MFC应用程序应用程序3.3 使用使用MFC AppWizard3.4 使用类向导使用类向导3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序例例Ex_HelloMsg 一个简单的一个简单的Windows应用程序应用程序#include int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)MessageBo
2、x(NULL,你好,我的你好,我的Visual C+世界!世界!,问候问候,0);return 0;Windows应用程序用程序以应用程序用程序以WinMain函数作为进入程函数作为进入程序的初始入口点。序的初始入口点。WinMain函数的原型:函数的原型:int WINAPI WinMain(HINSTANCE hInstance,/当前实例句柄当前实例句柄HINSTANCE hPrevInstance,/前一实例句柄前一实例句柄LPSTR lpCmdLine,/指向命令行参数的指针指向命令行参数的指针int nCmdShow)/窗口的显示状态窗口的显示状态句柄:标识句柄:标识Windows
3、资源资源(如菜单、图标、窗口等如菜单、图标、窗口等)和设和设备等对象的数据指针类型备等对象的数据指针类型3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序每一个每一个C+Windows应用程序都需要应用程序都需要Windows.h头文件,它还包含了其他的一些头文件,它还包含了其他的一些Windows头文件。这些头文件定义了头文件。这些头文件定义了Windows的所有数据类型、函数调用、数据结构和符号的所有数据类型、函数调用、数据结构和符号常量。常量。程序中,
4、程序中,MessageBox是一个是一个Win32 API函数,函数,用来弹出一个消息对话框。该函数第一个参数用来弹出一个消息对话框。该函数第一个参数用来指定父窗口句柄,即对话框所在的窗口句用来指定父窗口句柄,即对话框所在的窗口句柄。第二、三个参数分别用来指定显示的消息柄。第二、三个参数分别用来指定显示的消息内容和对话框窗口的标题,最后一个参数用来内容和对话框窗口的标题,最后一个参数用来指定在对话框中显示的按钮。指定在对话框中显示的按钮。3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序例例Ex_HelloWin 一个完整的一个完整的Windows应
5、用程序应用程序#include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/窗口过程窗口过程int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)HWND hwnd;/窗口句柄窗口句柄 MSG msg;/消息消息 WNDCLASSwndclass;/窗口类窗口类 wndclass.style =CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc =WndProc;wndcla
6、ss.cbClsExtra =0;3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序 wndclass.cbWndExtra=0;wndclass.hInstance =hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor =LoadCursor(NULL,C_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName =NULL;wndclas
7、s.lpszClassName=HelloWin;/窗口类名窗口类名 3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序 if(!RegisterClass(&wndclass)/注册窗口注册窗口 MessageBox(NULL,窗口注册失败!窗口注册失败!,HelloWin,0);return 0;hwnd=CreateWindow(HelloWin,/窗口类名窗口类名 我的窗口我的窗口,/窗口标题窗口标题 WS_OVERLAPPEDWINDOW,/窗口样式窗口样式 CW_USEDEFAULT,/窗口最初的窗口最初的 x 位置位置 CW_USEDE
8、FAULT,/窗口最初的窗口最初的 y 位置位置 CW_USEDEFAULT,/窗口最初的窗口最初的 x 大小大小 CW_USEDEFAULT,/窗口最初的窗口最初的 y 大小大小3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序 NULL,/父窗口句柄父窗口句柄 NULL,/窗口菜单句柄窗口菜单句柄 hInstance,/应用程序实例句柄应用程序实例句柄 NULL);/创建窗口的参数创建窗口的参数 ShowWindow(hwnd,nCmdShow);/显示窗口显示窗口 UpdateWindow(hwnd);/更新窗口,包括窗口的客户区更新窗口,包括
9、窗口的客户区 /进入消息循环:当从应用程序消息队列中检取的消息是进入消息循环:当从应用程序消息队列中检取的消息是WM_QUIT时,则退出循环。时,则退出循环。while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);/转换某些键盘消息转换某些键盘消息 DispatchMessage(&msg);/将消息发送给窗口过将消息发送给窗口过 程,这里是程,这里是WndProc 3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序 return msg.wParam;LRESULT CALLBACK WndPro
10、c(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_CREATE:/窗口创建产生的消息窗口创建产生的消息return 0;case WM_LBUTTONDOWN:3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序MessageBox(NULL,你好,我的你好,我的Visual C+世界!世界!,问候问候,0);return 0;case WM_DESTROY:/当窗口关闭时产生的消息当窗口关闭时产生的消息 PostQuitMessage(0);retu
11、rn 0;return DefWindowProc(hwnd,message,wParam,lParam);/执行默认的消息处理执行默认的消息处理3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序窗口过程函数窗口过程函数WndProc:接收和处理各种不同的消息:接收和处理各种不同的消息主函数主函数WinMain:(1)调用调用API函数函数RegisterClass注册应用程序的窗口类。注册应用程序的窗口类。(2)调用相关调用相关API函数创建和显示窗口,并进行其它必函数创建和显示窗口,并进行其它必要的初始化处理。要的初始化处理。(3)创建和启动应用
12、程序的消息循环。创建和启动应用程序的消息循环。(4)如果接收到如果接收到WM_QUIT消息,则退出应用程序。消息,则退出应用程序。3.1 Windows编程基础编程基础 3.1.1 简单的简单的Windows应用程序应用程序初始化应用程序初始化应用程序开始执行开始执行初始化并创建应用程序窗口初始化并创建应用程序窗口进入消息循环并获取一条消息进入消息循环并获取一条消息消息是否为消息是否为WM_QUIT?终止程序终止程序是是应用程序中处应用程序中处理了此消息?理了此消息?否否处理消息处理消息转送消息给窗口进行默认处理转送消息给窗口进行默认处理是是否否WindowsWindows应用程序的基本流程应
13、用程序的基本流程3.1 Windows编程基础编程基础 3.1.2 Windows编程特点编程特点Windows应用程序特性:应用程序特性:消息驱动机制消息驱动机制图形设备接口图形设备接口(GDI)基于资源的程序设计基于资源的程序设计动态链接库动态链接库进程和线程进程和线程3.1 Windows编程基础编程基础 3.1.2 Windows编程特点编程特点1.消息驱动机制消息驱动机制事件事件(Events)产生的消息产生的消息(Message)。接收消息、分发消息、处理消息接收消息、分发消息、处理消息消息驱动的机制是消息驱动的机制是Windows编程的最大特点。编程的最大特点。-当用户按下鼠标的
14、左键时系统就会发送当用户按下鼠标的左键时系统就会发送WM_LBUTTONDOWN消息消息-用户敲了一个字符键时系统就会发送用户敲了一个字符键时系统就会发送WM_CHAR消消息息-进行菜单选择或工具按钮单击等操作时,系统又会相进行菜单选择或工具按钮单击等操作时,系统又会相应地发送应地发送WM_COMMAND消息给相应的窗口等等消息给相应的窗口等等3.1 Windows编程基础编程基础 3.1.2 Windows编程特点编程特点2.图形设备接口图形设备接口(GDI)DOS环境中打印:用户必须根据打印机类型和环境中打印:用户必须根据打印机类型和指令规则向打印机输送数据。指令规则向打印机输送数据。Wi
15、ndows:提供一个抽象的接口,称为图形设:提供一个抽象的接口,称为图形设备接口备接口(Graphical Device Interface,简称,简称GDI)使得用户直接利用系统的使得用户直接利用系统的GDI函数就能方便实函数就能方便实现输入或输出,而不必关心与系统相连的外部现输入或输出,而不必关心与系统相连的外部设备的类型。设备的类型。3.1 Windows编程基础编程基础 3.1.2 Windows编程特点编程特点3.基于资源的程序设计基于资源的程序设计众多图形元素,例如光标、菜单、工具栏、位众多图形元素,例如光标、菜单、工具栏、位图、对话框等,每一个这样的元素都作为一种图、对话框等,每
16、一个这样的元素都作为一种可以装入应用程序的资源来存放。这些资源就可以装入应用程序的资源来存放。这些资源就像像C+程序中的常量一样,可以被编辑、修改,程序中的常量一样,可以被编辑、修改,也可以被其他应用程序所共享。也可以被其他应用程序所共享。Visual C+6.0中就提供这样的编辑器,可中就提供这样的编辑器,可“所所见即所得见即所得”地对这些不同类型的资源进行设计、地对这些不同类型的资源进行设计、编辑等。编辑等。3.1 Windows编程基础编程基础 3.1.2 Windows编程特点编程特点4.动态链接库动态链接库动态链接库:提供一些特定结构的函数,能被应用程序动态链接库:提供一些特定结构的
17、函数,能被应用程序在运行过程中装入和连接,且多个程序可以共享同一个在运行过程中装入和连接,且多个程序可以共享同一个动态链接库动态链接库优点:大大节省内存和磁盘空间优点:大大节省内存和磁盘空间 提高程序模块的灵活性提高程序模块的灵活性.DLL扩展名或扩展名或.EXE扩展名扩展名 -KERNEL32:处理存储器低层功能、任务和资源管理:处理存储器低层功能、任务和资源管理等等Windows核心服务;核心服务;-GDI32:提供图形设备接口,管理用户界面和图形绘:提供图形设备接口,管理用户界面和图形绘制,包括制,包括Windows元文件、位图、设备描述表和字体等元文件、位图、设备描述表和字体等 -US
18、ER32:负责窗口的管理,包括消息、菜单、光标、:负责窗口的管理,包括消息、菜单、光标、计时器以及其它与控制窗口显示相关的一些功能。计时器以及其它与控制窗口显示相关的一些功能。3.1 Windows编程基础编程基础 3.1.2 Windows编程特点编程特点5.进程和线程进程和线程进程:装入内存中正在执行的应用程序。进程进程:装入内存中正在执行的应用程序。进程包括私有的虚拟地址空间、代码、数据及其它包括私有的虚拟地址空间、代码、数据及其它操作系统资源。进程包括了一个或多个在进程操作系统资源。进程包括了一个或多个在进程上下文内运行的线程。上下文内运行的线程。线程:操作系统分配线程:操作系统分配C
19、PU时间的基本实体。线时间的基本实体。线程可以执行应用程序代码的任何部分,包括当程可以执行应用程序代码的任何部分,包括当前正在被其它线程执行的那些部分。同一进程前正在被其它线程执行的那些部分。同一进程的所有线程共享同样的虚拟地址空间、全局变的所有线程共享同样的虚拟地址空间、全局变量和操作系统资源。量和操作系统资源。3.1 Windows编程基础编程基础 3.1.3 Windows基本数据类型基本数据类型Windows常用的基本数据类型常用的基本数据类型3.1 Windows编程基础编程基础 3.1.3 Windows基本数据类型基本数据类型Windows常用的预定义句柄类型常用的预定义句柄类型
20、3.2 编制一个编制一个MFC应用程序应用程序基础类库基础类库(Microsoft Foundation Class Library,简称,简称MFC):把:把Windows编程规范中的大多编程规范中的大多数内容封装成为各种类,又称为数内容封装成为各种类,又称为MFC程序框架程序框架3.2 编制一个编制一个MFC应用程序应用程序 3.2.1 设计一个设计一个MFC程序程序例例Ex_HelloMFC 一个一个MFC应用程序应用程序#include/MFC头文件头文件class CHelloApp:public CWinApp/声明应用程序类声明应用程序类 public:virtual BOOL
21、InitInstance();CHelloApp theApp;/建立应用程序类的实例建立应用程序类的实例class CMainFrame:public CFrameWnd /声明主窗口类声明主窗口类 public:CMainFrame()3.2 编制一个编制一个MFC应用程序应用程序 3.2.1 设计一个设计一个MFC程序程序/创建主窗口创建主窗口 Create(NULL,我的窗口我的窗口,WS_OVERLAPPEDWINDOW,CRect(0,0,400,300);protected:afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
22、DECLARE_MESSAGE_MAP();3.2 编制一个编制一个MFC应用程序应用程序 3.2.1 设计一个设计一个MFC程序程序/消息映射入口消息映射入口BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_WM_LBUTTONDOWN()/单击鼠标左键消息的映射宏单击鼠标左键消息的映射宏END_MESSAGE_MAP()/定义消息映射函数定义消息映射函数void CMainFrame:OnLButtonDown(UINT nFlags,CPoint point)MessageBox(你好,我的你好,我的Visual C+世界!世界!,问候问候,0);CFr
23、ameWnd:OnLButtonDown(nFlags,point);3.2 编制一个编制一个MFC应用程序应用程序 3.2.1 设计一个设计一个MFC程序程序BOOL CHelloApp:InitInstance()/每当应用程序首次每当应用程序首次执执行时都要调用的初始化函数行时都要调用的初始化函数 m_pMainWnd=new CMainFrame();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;3.2 编制一个编制一个MFC应用程序应用程序 3.2.1 设计一个设计一个MFC程序程序步骤
24、:步骤:(1)选择选择“文件文件”“新建新建”菜单命令,显示出菜单命令,显示出“新建新建”对话对话框。在框。在“工程工程”标签页面的列表框中,选中标签页面的列表框中,选中Win32 Application项,创建一个项,创建一个Ex_HelloMFC空应用程序项目。空应用程序项目。(2)再次选择再次选择“文件文件”“新建新建”菜单命令,在文件标签页面菜单命令,在文件标签页面左边的列表框中选择左边的列表框中选择C+Source File项,在右边的文件框中项,在右边的文件框中键入键入Ex_HelloMFC.cpp,单击,单击确定确定。(3)输入上面的代码。选择输入上面的代码。选择“工程工程”“设
25、置设置”菜单命令,在菜单命令,在出现的对话框中选择出现的对话框中选择“General”标签。然后在标签。然后在“Microsoft Foundation Classes”组合框中,选择组合框中,选择“Use MFC in a Shared DLL”,单击,单击确定确定按钮。按钮。(4)程序运行后,单击鼠标左键,就会弹出一个对话框,结果程序运行后,单击鼠标左键,就会弹出一个对话框,结果同同Ex_HelloWin。3.2 编制一个编制一个MFC应用程序应用程序 3.2.1 设计一个设计一个MFC程序程序3.2 编制一个编制一个MFC应用程序应用程序 3.2.2 理解程序代码理解程序代码映射一个消息
26、的过程:映射一个消息的过程:(1)在处理消息的类中,用消息宏在处理消息的类中,用消息宏DECLARE_MESSAGE_MAP声明对消息映射的支持,并在该宏之前声明消息处理函数。声明对消息映射的支持,并在该宏之前声明消息处理函数。protected:afx_msg void OnLButtonDown(UINT nFlags,CPoint point);DECLARE_MESSAGE_MAP()(2)使用使用BEGIN_MESSAGE_MAP和和END_MESSAGE_MAP宏宏在类声明之后的地方定义该类支持的消息映射入口点,所有在类声明之后的地方定义该类支持的消息映射入口点,所有消息映射宏都添
27、加在这里,当然不同的消息消息映射宏都添加在这里,当然不同的消息MFC都会有不同都会有不同的消息映射宏。的消息映射宏。BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)END_MESSAGE_MAP()该类的基类该类的基类需要支持消息映需要支持消息映射的用户派生类射的用户派生类3.2 编制一个编制一个MFC应用程序应用程序 3.2.2 理解程序代码理解程序代码(3)定义消息处理函数。例如:定义消息处理函数。例如:void CMainFrame:OnLButtonDown(UINT nFlags,CPoint point)MessageBox(你好,我的你好,我的Vis
28、ual C+世界!世界!,问候问候,0);CFrameWnd:OnLButtonDown(nFlags,point);3.3 使用使用MFC AppWizardMFC AppWizard:应用程序框架结构:应用程序框架结构基本应用程序类型:基本应用程序类型:l单文档:类似记事本,每次只能打开和处理单文档:类似记事本,每次只能打开和处理一个文档一个文档l多文档:允许同时打开和处理多个文档多文档:允许同时打开和处理多个文档l基于对话框的应用程序基于对话框的应用程序3.3 使用使用MFC AppWizard 3.3.2 创建一个单文档程序创建一个单文档程序1.开始开始 选择选择“文件文件”“新建新建
29、”菜单,在弹出的菜单,在弹出的“新建新建”对话框中,选择对话框中,选择MFC AppWizard(exe)的项目类型,的项目类型,将项目工作文件夹定位,并在工程编辑框中输入项将项目工作文件夹定位,并在工程编辑框中输入项目名目名Ex_SDIHello3.3 使用使用MFC AppWizard 3.3.2 创建一个单文档程序创建一个单文档程序2.第一步:单击第一步:单击确定确定,出现对话框,进行下列选择:,出现对话框,进行下列选择:(1)选择选择“单个文档单个文档”。(2)决定应用程序中是否需要决定应用程序中是否需要MFC的文档视图的文档视图(“文档文档/查查看体系结构支持看体系结构支持”)结构的
30、支持。一般应选中此项。结构的支持。一般应选中此项。(3)选择资源所使用的语言,这里是选择资源所使用的语言,这里是“中文中文中国中国”。3.3 使用使用MFC AppWizard 3.3.2 创建一个单文档程序创建一个单文档程序3.第二步第二步单击单击下一个下一个按钮,出现如图所示的对话框,让用户按钮,出现如图所示的对话框,让用户选择程序中是否加入数据库的支持选择程序中是否加入数据库的支持(有关数据库的有关数据库的内容将在以后的章节中介绍内容将在以后的章节中介绍)。3.3 使用使用MFC AppWizard 3.3.2 创建一个单文档程序创建一个单文档程序4.第三步第三步单击单击下一个下一个按钮
31、进入下一步,出现如图所示的对话框。允许用户按钮进入下一步,出现如图所示的对话框。允许用户在程序中加入复合文档、自动化、在程序中加入复合文档、自动化、ActiveX控件的支持。控件的支持。5.第四步第四步单击单击下一个下一个按钮进入下一步,出现如图所示的对话框,对话框的按钮进入下一步,出现如图所示的对话框,对话框的前几项依次确定对浮动工具条、打印与预览以及通信等特性的支持。前几项依次确定对浮动工具条、打印与预览以及通信等特性的支持。6.第五步第五步保留以上默认值,单击保留以上默认值,单击下一个下一个按钮进入下一步。弹出按钮进入下一步。弹出如如图所示的对话框图所示的对话框3.3 使用使用MFC A
32、ppWizard 3.3.2 创建一个单文档程序创建一个单文档程序7.第六步第六步 保留默认选项,单击保留默认选项,单击下一步下一步按钮进行下一步,出现如按钮进行下一步,出现如图所示的对话框。单击图所示的对话框。单击完成完成按钮出现一个信息对话框,按钮出现一个信息对话框,显示出用户在前面几个步骤中作出的选择内容,单击显示出用户在前面几个步骤中作出的选择内容,单击确定确定按钮系统开始创建,并又回到了按钮系统开始创建,并又回到了Visual C+6.0的主界面的主界面3.3 使用使用MFC AppWizard 3.3.2 创建一个单文档程序创建一个单文档程序8.编译并运行编译并运行MFC AppW
33、izard已经根据用户的选择内容自动生成基本的已经根据用户的选择内容自动生成基本的应用程序框架。单击编译工具栏上的运行工具按钮或按应用程序框架。单击编译工具栏上的运行工具按钮或按快捷键快捷键Ctrl+F5,系统开始编连并运行生成的单文档应用程,系统开始编连并运行生成的单文档应用程序可执行文件序可执行文件Ex_SDIHello.exe,运行结果如图所示。,运行结果如图所示。3.3 使用使用MFC AppWizard 3.3.2 创建一个单文档程序创建一个单文档程序菜单栏菜单栏工具栏工具栏状态栏状态栏标题栏标题栏文档文档窗口窗口3.3 使用使用MFC AppWizard 3.3.3 MFC应用程序
34、项目组织应用程序项目组织1.项目的文件组织项目的文件组织3.3 使用使用MFC AppWizard 3.3.3 MFC应用程序项目组织应用程序项目组织Ex_SDIHello文件夹文件夹Debug或或Release文件夹文件夹Res文件夹文件夹类文件类文件.cpp,.h资源文件资源文件Ex_SDIHello.rc项目及项目工作区文件项目及项目工作区文件其他文件其他文件编连过程产生的文件编连过程产生的文件运行文件运行文件Ex_SDIHello.exe图标文件图标文件Ex_SDIHello.ico等等工具栏资源工具栏资源Toolbar.bmp其他资源其他资源Ex_SDIHello.rc2等等3.3
35、使用使用MFC AppWizard 3.3.3 MFC应用程序项目组织应用程序项目组织2.MFC类结构类结构单文档应用程序项目单文档应用程序项目Ex_SDIHello类:类:CAboutDlg:本程序相关信息:本程序相关信息 CEx_SDIHelloApp:程序创建、运行和终止:程序创建、运行和终止 CEx_SDIHelloDoc:文档数据管理:文档数据管理 CEx_SDIHelloView:显示数据、用户交互:显示数据、用户交互 CMainFrame:主框架窗口的显示和管理:主框架窗口的显示和管理3.4 使用类向导使用类向导MFC类向导类向导(ClassWizard):自动为一个项目添加:自
36、动为一个项目添加一个类、进行消息和数据映射、创建一个类、进行消息和数据映射、创建OLE Automation(自动化自动化)属性和方法以及进行属性和方法以及进行ActiveX事事件处理等。件处理等。3.4 使用类向导使用类向导(1)“查看查看”“建立类向导建立类向导”或直接或直接Ctrl+W快捷快捷键键(2)在文档编辑窗口中,右击鼠标,从弹出的快捷菜在文档编辑窗口中,右击鼠标,从弹出的快捷菜单中选择单中选择“建立类向导建立类向导”命令。命令。ClassWizard标签页面:标签页面:Message Maps(消息映射消息映射):用来添加、删除和编程处理:用来添加、删除和编程处理消息的成员函数。
37、消息的成员函数。Member Variables(成员变量成员变量):添加或删除与控件相关:添加或删除与控件相关联的成员变量联的成员变量(数据成员数据成员),以便与控件进行数据交换。,以便与控件进行数据交换。这些控件所在的类一般是从这些控件所在的类一般是从CDialog、CPropertyPage、CRecordView或或CDaoRecordView中派生的类。中派生的类。Automation(自动化自动化):为支持:为支持Automation的类的类(如如ActiveX控件类控件类)添加属性和方法。添加属性和方法。ActiveX Events(ActiveX事件事件):为:为ActiveX
38、控件类添加触控件类添加触发事件的支持。发事件的支持。Class Info(类信息类信息):有关项目中类的其他信息。:有关项目中类的其他信息。3.4 使用类向导使用类向导 3.4.1 类向导概述类向导概述3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射1.消息分类消息分类(1)窗口消息窗口消息(Windows message)。由由WM_开头的消息开头的消息(WM_ COMMAND除外除外),一般由窗口类和视图类对,一般由窗口类和视图类对象来处理。象来处理。(2)控件的通知消息控件的通知消息(Control notifications)。当控件的状当控件的状态发生改变态发生改
39、变(例如用户在控件中进行输入例如用户在控件中进行输入)时,控件时,控件就会向其父窗口发送就会向其父窗口发送WM_COMMAND通知消息。通知消息。(3)命令消息命令消息(Command message)。由菜单、工具条的按由菜单、工具条的按钮、快捷键等发送的钮、快捷键等发送的WM_COMMAND通知消息。通知消息。由窗由窗口对口对象接象接收并收并处理处理由文档类、文档模板类、应用程序本身以及窗口和视图类接受处理由文档类、文档模板类、应用程序本身以及窗口和视图类接受处理2.ClassWizard映射消息的一般方法映射消息的一般方法 在在MFC中,绝大多数消息都可由中,绝大多数消息都可由MFC的的
40、ClassWizard来来映射。将映射。将ClassWizard对话框切换到对话框切换到Message Maps页面,页面,可以看到它有许多选项,各项功能说明如表所示。可以看到它有许多选项,各项功能说明如表所示。3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射2.ClassWizard映射消息的一般方法映射消息的一般方法例:向例:向CEx_SDIHelloView中添加中添加WM_LBUTTOMDOWN的消息映射步骤:的消息映射步骤:(1)按按Ctrl+W快捷键打开快捷键打开MFC ClassWizard对话框。对话框。(2)在在Class name中,将类名选定为中,将类
41、名选定为CEx_SDIHelloView。此时,此时,Object IDs和和Messages列表内容会相应的改变。列表内容会相应的改变。(3)在在Object IDs中选定中选定CEx_SDIHelloView,而在,而在Messages列表中选定列表中选定WM_LBUTTOMDOWN消息。消息。(4)双击双击WM_LBUTTOMDOWN消息或单击消息或单击Add Function按钮,都会在按钮,都会在CEx_SDIHelloView类中添加该类中添加该消息的映射函数消息的映射函数OnLButtonDown,同时在,同时在Member funcions列表中显示这一消息映射函数和被映射的消
42、息,列表中显示这一消息映射函数和被映射的消息,如图所示。如图所示。3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射(5)单击单击Edit Code按钮后,按钮后,ClassWizard对话框退出,并对话框退出,并转向文档窗口,定位到转向文档窗口,定位到OnLButtonDown函数源代码处。函数源代码处。(6)添加下列代码:添加下列代码:void CEx_SDIHelloView:OnLButtonDown(UINT nFlags,CPoint point)MessageBox(你好,我的你好,我的Visual C+世界!世界!,问候问候,0);CView:OnLButto
43、nDown(nFlags,point);(7)程序运行后,在窗口客户区单击鼠标左键,就会弹出程序运行后,在窗口客户区单击鼠标左键,就会弹出一个消息对话框。一个消息对话框。3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射3.消息映射代码消息映射代码 ClassWizard为为WM_LBUTTOMDOWN的消息映射作的消息映射作了以下三个方面内容的安排:了以下三个方面内容的安排:(1)在在Ex_SDIHelloView.h中声明中声明OnLButtonDown:protected:/AFX_MSG(CEx_SDIHelloView)afx_msg void OnLButtonD
44、own(UINT nFlags,CPoint point);/AFX_MSGDECLARE_MESSAGE_MAP()凡凡/和和/之间的程序代码块均由之间的程序代码块均由ClassWizard自动管理。自动管理。3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射3.消息映射代码消息映射代码(2)在在Ex_SDIHelloView.cpp源文件前面的消息映射入口源文件前面的消息映射入口处,添加了相应的映射宏:处,添加了相应的映射宏:/消息映射开始消息映射开始BEGIN_MESSAGE_MAP(CEx_SDIHelloView,CView)/AFX_MSG_MAP(CEx_SDI
45、HelloView)ON_WM_LBUTTONDOWN()/AFX_MSG_MAPEND_MESSAGE_MAP()/消息映射结束消息映射结束3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射3.消息映射代码消息映射代码(3)在在Ex_SDIHelloView.cpp文件中写入一个空的消息处文件中写入一个空的消息处理函数的模板,以便用户填入具体代码:理函数的模板,以便用户填入具体代码:void CEx_SDIHelloView:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code
46、here and/or call defaultCView:OnLButtonDown(nFlags,point);根据根据ClassWizard产生的上述消息映射过程,用户可以产生的上述消息映射过程,用户可以自己手动添加一些自己手动添加一些MFC ClassWizard不支持的消息不支持的消息映射函数,以完成特定的功能。映射函数,以完成特定的功能。3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射4.键盘消息键盘消息按下一个键或组合键:按下一个键或组合键:WM_KEYDOWN或或WM_SYSKEYDOWN放入消息队列中。放入消息队列中。键被释放:键被释放:WM_KEYUP或
47、或WM_SYSKEYUP消息被放消息被放入消息队列中。入消息队列中。字符键:在这两个消息之间产生字符键:在这两个消息之间产生WM_CHAR消息。消息。虚拟键代码:与设备无关的键盘编码。在虚拟键代码:与设备无关的键盘编码。在VC中,最常用中,最常用的虚拟键代码已被定义在的虚拟键代码已被定义在Winuser.h中,例如:中,例如:VK_SHIFT表示表示SHIFT键,键,VK_F1表示功能键表示功能键F1等。等。3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射5.鼠标消息鼠标消息键盘消息只发送给具有输入焦点的窗口,但鼠标消息不键盘消息只发送给具有输入焦点的窗口,但鼠标消息不受这
48、种限制。受这种限制。鼠标移动:鼠标移动:向该窗口发送向该窗口发送WM_MOUSEMOVE(移动鼠标移动鼠标)消息。消息。按下或释放一个鼠标键:按下或释放一个鼠标键:3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射7.其他窗口消息其他窗口消息(1)WM_CREATE消息。该消息是在窗口对象创建后,消息。该消息是在窗口对象创建后,Windows向视图发送的第一个消息;一般进行初始向视图发送的第一个消息;一般进行初始化。但由于化。但由于WM_CREATE消息发送时,窗口对象还消息发送时,窗口对象还未完成,因此在该消息处理函数未完成,因此在该消息处理函数OnCreate内,不能内,
49、不能调用那些依赖于窗口处于完成激活状态的调用那些依赖于窗口处于完成激活状态的Windows函数,如窗口的绘图函数等。函数,如窗口的绘图函数等。(2)WM_CLOSE或或WM_DESTROY消息。当用户从系消息。当用户从系统菜单中关闭窗口或者父窗口被关闭时,统菜单中关闭窗口或者父窗口被关闭时,Windows都会发送都会发送WM_CLOSE消息;而消息;而WM_DESTROY消消息是在窗口从屏幕消失后发送的,因此它紧随息是在窗口从屏幕消失后发送的,因此它紧随WM_CLOSE之后。之后。3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射7.其他窗口消息其他窗口消息(3)WM_PAI
50、NT消息。当窗口的大小发生变化、窗口内消息。当窗口的大小发生变化、窗口内容发生变化、窗口间的层叠关系发生变化等情况下,容发生变化、窗口间的层叠关系发生变化等情况下,系统都将产生系统都将产生WM_PAINT消息,表示要重新绘制消息,表示要重新绘制窗口的内容。该消息处理函数的原型是;窗口的内容。该消息处理函数的原型是;afx_msg void OnPaint();afx_msg是是MFC用于定义消息函数的标志用于定义消息函数的标志3.4 使用类向导使用类向导3.4.2 消息和消息映射消息和消息映射1.类的添加类的添加(1)按快捷键按快捷键Ctrl+W启动启动MFC ClassWizard对话框。单