第3章 MFC基本应用程序的建立.ppt_第1页
第3章 MFC基本应用程序的建立.ppt_第2页
第3章 MFC基本应用程序的建立.ppt_第3页
第3章 MFC基本应用程序的建立.ppt_第4页
第3章 MFC基本应用程序的建立.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章MFC基本应用程序的建立,3.1Windows编程基础编制一个功能强大和易操作的Windows应用程序所需要的代码肯定会比一般的C+程序要多得多,但并不是所有的代码都需要自己从头开始编写,因为VisualC+不仅提供了常用的Windows应用程序的基本框架,而且可以在框架程序中直接调用Win32API(ApplicationProgrammingInterface,应用程序接口)函数。这样,用户仅需要在相应的框架位置中添加自己的代码或修改部分代码就可实现Windows应用程序的许多功能。,3.1.1简单的Windows应用程序,先来看一个最简单的Windows应用程序Ex_HelloMsg。例Ex_HelloMsg一个简单的Windows应用程序#includeintWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)MessageBox(NULL,你好,我的VisualC+世界!,问候,0);return0;在VisualC+6.0运行上述程序需要进行以下步骤:(1)选择“文件”“新建”菜单命令,显示出“新建”对话框。在“工程”标签页面的列表框中,选中Win32Application项。,(2)在工程编辑框中键入Win32应用程序项目名称Ex_HelloMsg。在“位置”编辑框中直接键入文件夹名称,或单击浏览按钮选择一个已有的文件夹。(3)单击确定按钮继续。一个询问项目类型的Win32应用程序向导将被显示,选中Anemptyproject项。单击完成按钮,系统将显示该应用程序向导的创建信息,单击确定按钮系统将自动创建此应用程序。(4)再次选择“文件”“新建”菜单命令,显示出“新建”对话框。在“文件”标签页面左边的列表框中选择C+SourceFile项,在右边的文件框中键入Ex_HelloMsg.cpp,单击确定按钮。,3.1.1简单的Windows应用程序,例Ex_HelloMsg一个简单的Windows应用程序(5)输入上面的代码,运行程序,结果如图3.1所示。从上面的程序可以看出:C+控制台应用程序以main函数作为进入程序的初始入口点,但在Windows应用程序中,main主函数被WinMain函数取代。WinMain函数的原型如下:intWINAPIWinMain(HINSTANCEhInstance,/当前实例句柄HINSTANCEhPrevInstance,/前一实例句柄LPSTRlpCmdLine,/指向命令行参数的指针intnCmdShow)/窗口的显示状态,3.1.1简单的Windows应用程序,所谓句柄是一个标识Windows资源(如菜单、图标、窗口等)和设备等对象的数据指针类型。通常,一个句柄变量可用来对系统中某些资源的间接引用。每一个C+Windows应用程序都需要Windows.h头文件,它还包含了其他的一些Windows头文件。这些头文件定义了Windows的所有数据类型、函数调用、数据结构和符号常量。程序中,MessageBox是一个Win32API函数,用来弹出一个消息对话框。该函数第一个参数用来指定父窗口句柄,即对话框所在的窗口句柄。第二、三个参数分别用来指定显示的消息内容和对话框窗口的标题,最后一个参数用来指定在对话框中显示的按钮。,3.1.1简单的Windows应用程序,例Ex_HelloWin一个完整的Windows应用程序#includeLRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/窗口过程intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)HWNDhwnd;/窗口句柄MSGmsg;/消息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=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=HelloWin;/窗口类名if(!RegisterClass(return0;hwnd=CreateWindow(HelloWin,/窗口类名我的窗口,/窗口标题WS_OVERLAPPEDWINDOW,/窗口样式CW_USEDEFAULT,/窗口最初的x位置CW_USEDEFAULT,/窗口最初的y位置CW_USEDEFAULT,/窗口最初的x大小CW_USEDEFAULT,/窗口最初的y大小NULL,/父窗口句柄NULL,/窗口菜单句柄hInstance,/应用程序实例句柄NULL);/创建窗口的参数ShowWindow(hwnd,nCmdShow);/显示窗口UpdateWindow(hwnd);/更新窗口,包括窗口的客户区/进入消息循环:当从应用程序消息队列中检取的消息是WM_QUIT时,则退出循环。while(GetMessage(/将消息发送给窗口过程,这里是WndProc,returnmsg.wParam;LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)switch(message)caseWM_CREATE:/窗口创建产生的消息return0;caseWM_LBUTTONDOWN:MessageBox(NULL,你好,我的VisualC+世界!,问候,0);return0;caseWM_DESTROY:/当窗口关闭时产生的消息PostQuitMessage(0);return0;returnDefWindowProc(hwnd,message,wParam,lParam);/执行默认的消息处理,3.1.1简单的Windows应用程序,例Ex_HelloWin一个完整的Windows应用程序程序运行后,单击鼠标左键,就会弹出一个对话框,结果如图3.2所示。,图3.2Ex_HelloWin运行结果,3.1.1简单的Windows应用程序,窗口过程函数WndProc用来接收和处理各种不同的消息,而主函数WinMain通常要完成以下几步工作:(1)调用API函数RegisterClass注册应用程序的窗口类。(2)调用相关API函数创建和显示窗口,并进行其它必要的初始化处理。其中,函数CreateWindow用来创建已注册窗口类的窗口。Windows每一个窗口都有一些基本属性,如窗口标题、窗口位置和大小、应用程序图标、鼠标指针、菜单和背景颜色等。窗口类就是充当这些属性的模板。(3)创建和启动应用程序的消息循环。Windows应用程序接受各种不同的消息,包括键盘消息、鼠标以及窗口产生的各种消息。Windows系统首先将消息放入消息队列中,应用程序的消息循环就是从应用程序的消息队列中检取消息,并将消息发送相应的窗口过程函数中作进一步处理。API函数GetMessage和DispatchMessage就是起到这样的作用。(4)如果接收到WM_QUIT消息,则退出应用程序。,3.1.1简单的Windows应用程序,图3.3Windows应用程序的基本流程,3.1.2Windows编程特点,一个完整的Windows应用程序除了WinMain函数外,还包含用于处理用户动作和窗口消息的窗口函数。这不同于一个C+的控制台应用程序,可以将整个程序包含在main函数中。事实上,它们的区别还远不止这些,不久还会发现一个Windows应用程序还常常具有这样的一些特性:消息驱动机制图形设备接口(GDI)基于资源的程序设计动态链接库进程和线程,3.1.2Windows编程特点,1.消息驱动机制在Windows操作环境中,无论是系统产生的动作或是用户运行应用程序产生的动作,都称为事件(Events)产生的消息(Message)。例如,在Windows桌面(传统风格)上,双击应用程序的快捷图标,系统就会执行该应用程序。在Windows的应用程序中,也是通过接收消息、分发消息、处理消息来和用户进行交互的。这种消息驱动的机制是Windows编程的最大特点。需要注意的是,许多Windows消息都经过了严格的定义,并且适用于所有的应用程序。例如,当用户按下鼠标的左键时系统就会发送WM_LBUTTONDOWN消息,而当用户敲了一个字符键时系统就会发送WM_CHAR消息,若用户进行菜单选择或工具按钮单击等操作时,系统又会相应地发送WM_COMMAND消息给相应的窗口等等。,3.1.2Windows编程特点,2.图形设备接口(GDI)在传统的DOS环境中,想要在打印机上打印一幅图形是一件非常复杂的事情,因为用户必须根据打印机类型和指令规则向打印机输送数据。而Windows则提供了一个抽象的接口,称为图形设备接口(GraphicalDeviceInterface,简称GDI),使得用户直接利用系统的GDI函数就能方便实现输入或输出,而不必关心与系统相连的外部设备的类型。3.基于资源的程序设计Windows应用程序常常包含众多图形元素,例如光标、菜单、工具栏、位图、对话框等,在Windows环境下,每一个这样的元素都作为一种可以装入应用程序的资源来存放。这些资源就像C+程序中的常量一样,可以被编辑、修改,也可以被其他应用程序所共享。VisualC+6.0中就提供这样的编辑器,可“所见即所得”地对这些不同类型的资源进行设计、编辑等。,3.1.2Windows编程特点,4.动态链接库动态链接库提供了一些特定结构的函数,能被应用程序在运行过程中装入和连接,且多个程序可以共享同一个动态链接库,这样就可以大大节省内存和磁盘空间。从编程角度来说,动态链接库可以提高程序模块的灵活性,因为它本身是可以单独设计、编译和调试的。Windows提供了应用程序可利用的丰富的函数调用,大多数用于实现其用户界面和在显示器上显示的文本和图形,都是通过动态链接库来实现的。这些动态链接库是一些具有.DLL扩展名或者有时是.EXE扩展名的文件。在Windows操作系统中,最主要的DLLKERNEL32.DLL、GDI32.DLL和USER32.DLL三个模块。其中KERNEL32用来处理存储器低层功能、任务和资源管理等Windows核心服务;GDI32用来提供图形设备接口,管理用户界面和图形绘制,包括Windows元文件、位图、设备描述表和字体等;而USER32负责窗口的管理,包括消息、菜单、光标、计时器以及其它与控制窗口显示相关的一些功能。,3.1.2Windows编程特点,5.进程和线程在32位Windows多任务操作系统中,采用了进程和线程的管理模式。进程是装入内存中正在执行的应用程序。进程包括私有的虚拟地址空间、代码、数据及其它操作系统资源,如文件、管道以及对该进程可见的同步对象等。进程包括了一个或多个在进程上下文内运行的线程。线程是操作系统分配CPU时间的基本实体。线程可以执行应用程序代码的任何部分,包括当前正在被其它线程执行的那些部分。同一进程的所有线程共享同样的虚拟地址空间、全局变量和操作系统资源。在一个应用程序中,可以包括一个或多个进程,每个进程由一个或多个线程构成。,3.1.3Windows基本数据类型,表3.1列出了一些在Windows编程中常用的基本数据类型。,表3.1Windows常用的基本数据类型,3.1.3Windows基本数据类型,表3.2列出了常用的预定义句柄,它们的类型均为void*,即一个32位指针。,表3.2Windows常用的句柄类型,3.2编制一个MFC应用程序,前面的Ex_HelloMsg和Ex_HelloWin都是基于WindowsAPI的C+应用程序。显然,随着应用程序的复杂性,C+应用程序代码也必然越复杂。为了帮助用户处理那些经常使用又复杂繁琐的各种Windows操作,VisualC+设计了一套基础类库(MicrosoftFoundationClassLibrary,简称MFC)。MFC把Windows编程规范中的大多数内容封装成为各种类,使程序员从繁杂的编程中解脱出来,提高了编程和代码效率。,3.2.1设计一个MFC程序,在理解MFC机制之前,先来看一个MFC应用程序。例Ex_HelloMFC一个MFC应用程序#include/MFC头文件classCHelloApp:publicCWinApp/声明应用程序类public:virtualBOOLInitInstance();CHelloApptheApp;/建立应用程序类的实例classCMainFrame:publicCFrameWnd/声明主窗口类public:CMainFrame()/创建主窗口Create(NULL,我的窗口,WS_OVERLAPPEDWINDOW,CRect(0,0,400,300);protected:afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);DECLARE_MESSAGE_MAP();,/消息映射入口BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_WM_LBUTTONDOWN()/单击鼠标左键消息的映射宏END_MESSAGE_MAP()/定义消息映射函数voidCMainFrame:OnLButtonDown(UINTnFlags,CPointpoint)MessageBox(你好,我的VisualC+世界!,问候,0);CFrameWnd:OnLButtonDown(nFlags,point);BOOLCHelloApp:InitInstance()/每当应用程序首次执行时都要调用的初始化函数m_pMainWnd=newCMainFrame();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();returnTRUE;,3.2.1设计一个MFC程序,在VisualC+6.0运行上述MFC程序需要进行以下步骤:(1)选择“文件”“新建”菜单命令,显示出“新建”对话框。在“工程”标签页面的列表框中,选中Win32Application项,创建一个Ex_HelloMFC空应用程序项目。(2)再次选择“文件”“新建”菜单命令,显示出“新建”对话框。在文件标签页面左边的列表框中选择C+SourceFile项,在右边的文件框中键入Ex_HelloMFC.cpp,单击确定按钮。(3)输入上面的代码。选择“工程”“设置”菜单命令,在出现的对话框中选择“General”标签。然后在“MicrosoftFoundationClasses”组合框中,选择“UseMFCinaSharedDLL”,如图3.4所示。单击确定按钮。(4)程序运行后,单击鼠标左键,就会弹出一个对话框,结果同Ex_HelloWin。,3.2.1设计一个MFC程序,图3.4设置工程属性,3.2.2理解程序代码,按照MFC的消息映射机制,映射一个消息的过程是由三个部分组成的:(1)在处理消息的类中,使用消息宏DECLARE_MESSAGE_MAP声明对消息映射的支持,并在该宏之前声明消息处理函数。例如前面示例中的:protected:afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);DECLARE_MESSAGE_MAP()(2)使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏在类声明之后的地方定义该类支持的消息映射入口点,所有消息映射宏都添加在这里,当然不同的消息MFC都会有不同的消息映射宏。例如:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)END_MESSAGE_MAP(),其中,BEGIN_MESSAGE_MAP带有两个参数,第一个参数用来指定需要支持消息映射的用户派生类,第二个参数指定该类的基类。(3)定义消息处理函数。例如:voidCMainFrame:OnLButtonDown(UINTnFlags,CPointpoint)MessageBox(你好,我的VisualC+世界!,问候,0);CFrameWnd:OnLButtonDown(nFlags,point);,3.3使用MFCAppWizard,3.3.1应用程序框架类型这些类型基本满足了各个层次的用户的需要,但一般地,用户更关心的是MFCAppWizard(exe)应用程序框架,因为它包含用户最常用、最基本的三种应用程序类型:单文档、多文档和基于对话框的应用程序。,表3.3MFCAppWizard创建的应用程序类型,3.3.2创建一个单文档应用程序,用MFCAppWizard(MFC应用程序向导)可以方便地创建一个通用的Windows单文档应用程序,其步骤如下。1.开始选择“文件”“新建”菜单,在弹出的“新建”对话框中,可以看到工程标签页面中,显示出一系列的应用程序项目类型;选择MFCAppWizard(exe)的项目类型(该类型用于创建可执行的Windows应用程序),将项目工作文件夹定位在“D:VisualC+6.0程序”,并在工程编辑框中输入项目名Ex_SDIHello,结果如图3.5所示。,图3.5MFCAppWizard的“新建”对话框,3.3.2创建一个单文档应用程序,2.第一步单击确定按钮,出现如图3.6所示的对话框,进行下列选择:(1)从应用程序类型单个文档(SDI)、多重文档(MDI)和基本对话框(基于对话框的应用程序)中选择“单个文档”。(2)决定应用程序中是否需要MFC的文档视图(“文档/查看体系结构支持”)结构的支持。若不选定此项,则程序中的磁盘文件的打开、保存以及文档和视图的相互作用等功能需要用户来实现,且将跳过Step2Step5,直接弹出“Step6”对话框。一般情况下,应选中此项。(3)选择资源所使用的语言,这里是“中文中国”。3.第二步单击下一个按钮,出现如图3.7所示的对话框,让用户选择程序中是否加入数据库的支持(有关数据库的内容将在以后的章节中介绍)。,图3.6MFCAppWizard的“Step1”对话框,图3.7MFCAppWizard的“Step2”对话框,3.3.2创建一个单文档应用程序,4.第三步单击下一个按钮进入下一步,出现如图3.8所示的对话框。允许用户在程序中加入复合文档、自动化、ActiveX控件的支持。5.第四步单击下一个按钮进入下一步,出现如图3.9所示的对话框,对话框的前几项依次确定对浮动工具条、打印与预览以及通信等特性的支持。,图3.8MFCAppWizard的“Step3”对话框,图3.9MFCAppWizard的“Step4”对话框,3.3.2创建一个单文档应用程序,6.第五步保留以上默认值,单击下一个按钮进入下一步。弹出如图3.10所示的对话框,这里出现三个方面的选项,供用户来选择:(1)应用程序的主窗口是MFC标准风格还是窗口左边有切分窗口的浏览器风格;(2)在源文件中是否加入注释用来引导用户编写程序代码;(3)使用动态链接库还是静态链接库。,图3.10MFCAppWizard的“Step5”对话框,3.3.2创建一个单文档应用程序,7.第六步保留默认选项,单击下一步按钮进行下一步,出现如图3.11所示的对话框。在这里,用户可以对MFCAppWizard提供的默认类名、基类名、各个源文件名进行修改。单击完成按钮出现一个信息对话框,显示出用户在前面几个步骤中作出的选择内容,单击确定按钮系统开始创建,并又回到了VisualC+6.0的主界面。8.编译并运行到这里为止,用户虽然没有编写任何程序代码,但MFCAppWizard已经根据用户的选择内容自动生成基本的应用程序框架。单击编译工具栏上的运行工具按钮“”或按快捷键Ctrl+F5,系统开始编连并运行生成的单文档应用程序可执行文件Ex_SDIHello.exe,运行结果如图3.12所示。,图3.11MFCAppWizard的“Step6”对话框,图3.12Ex_SDIHello运行结果,3.3.3MFC应用程序项目组织,1.项目的文件组织在VisualC+6.0中,项目中所有的源文件都是采用文件夹的方式进行管理的,它将项目名作为文件夹名,在此文件夹下包含源程序代码文件(.cpp,.h)、项目文件(.dsp)以及项目工作区文件(.dsw)等。表3.4列出了这些文件类型的的含义。,表3.4VisualC+6.0文件类型的含义,除了上述文件外,还有相应的Debug(调试)或Release(发行)、Res(资源)等子文件夹。例如上述创建的单文档应用程序项目Ex_SDIHello,其各文件的组织如图3.13所示。当然,不同类型的项目的文件类型及数目会有所不同,3.3.3MFC应用程序项目组织,。,图3.13Ex_SDIHello项目的文件组织,3.3.3MFC应用程序项目组织,2.MFC类结构在开发环境中,VisualC+6.0是通过左边的项目工作区窗口来对项目进行各种管理。项目工作区窗口包含3个页面,它们分别是ClassView页、ResourceView页和FileView页,通过单击项目区窗口底部的页面标签进行切换。将VisualC+6.0项目工作区窗口切换到ClassView页面,可以看到MFC为单文档应用程序项目Ex_SDIHello自动创建了类CAboutDlg、CEx_SDIHelloApp、CEx_SDIHelloDoc、CEx_SDIHelloView和CMainFrame。这些MFC类之间的继承和派生关系如图3.14所示。,3.4使用类向导,MFC类向导(ClassWizard)是VisualC+6.0中又一个非常有用的工具。它能自动为一个项目添加一个类、进行消息和数据映射、创建OLEAutomation(自动化)属性和方法以及进行ActiveX事件处理等。,3.4.1类向导概述,打开MFC类向导可以使用下列几种方法:(1)选择“查看”“建立类向导”菜单或直接使用Ctrl+W快捷键。(2)在源代码文件的文档编辑窗口中,右击鼠标,从弹出的快捷菜单中选择“建立类向导”命令。当MFC类向导打开后,就会弹出如图3.15所示的MFCClassWizard对话框。,图3.15MFCClassWizard对话框,3.4.1类向导概述,可以看到ClassWizard对话框包含了5个标签页面,它们各自含义如下:MessageMaps(消息映射):用来添加、删除和编程处理消息的成员函数。MemberVariables(成员变量):添加或删除与控件相关联的成员变量(或称数据成员),以便与控件进行数据交换。这些控件所在的类一般是从CDialog、CPropertyPage、CRecordView或CDaoRecordView中派生的类。Automation(自动化):为支持Automation的类(如ActiveX控件类)添加属性和方法。ActiveXEvents(ActiveX事件):为ActiveX控件类添加触发事件的支持。ClassInfo(类信息):有关项目中类的其他信息。一般来说,MFCClassWizard对话框最前两项是用户最关心的,也是最经常使用的,因为几乎所有的代码编写都要利用这两个标签项。由于MemberVariables功能以后还会详细讨论,因此这里仅讨论MessageMaps(消息映射)与类的添加和删除方法。,3.4.2消息和消息映射,1.消息分类Windows应用程序中的消息主要有三种类型。(1)窗口消息(Windowsmessage)。这类消息主要是指由WM_开头的消息(WM_COMMAND除外),一般由窗口类和视图类对象来处理。窗口消息往往带有参数,以标志处理消息的方法。(2)控件的通知消息(Controlnotifications)。当控件的状态发生改变(例如用户在控件中进行输入)时,控件就会向其父窗口发送WM_COMMAND通知消息。应用程序框架处理控件消息的方法和窗口消息相同,但按钮的BN_CLICKED通知消息除外,它的处理方法与命令消息相同。(3)命令消息(Commandmessage)。命令消息主要包括由用户交互对象(菜单、工具条的按钮、快捷键等)发送的WM_COMMAND通知消息。命令消息的处理方式与其他两种消息不同,它能够被多种对象接收、处理,这些对象包括文档类、文档模板类、应用程序本身以及窗口和视类等;而窗口消息和控件的通知消息是由窗口对象接收并处理的,这里的窗口对象是指从CWnd中派生的类的对象,它包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及从这些类派生的对象等。,3.4.2消息和消息映射,2.ClassWizard映射消息的一般方法在MFC中,绝大多数消息都可由MFC的ClassWizard来映射。将ClassWizard对话框切换到MessageMaps页面(参看图3.15),可以看到它有许多选项,如项目组合框、类组合框等。各项功能说明如表3.5所示。,表3.5ClassWizard对话框的MessageMaps页面功能,3.4.2消息和消息映射,2.ClassWizard映射消息的一般方法例如,若向CEx_SDIHelloView中添加WM_LBUTTOMDOWN的消息映射,则可按下列步骤进行:(1)按Ctrl+W快捷键打开MFCClassWizard对话框。(2)在Classname组合框中,将类名选定为CEx_SDIHelloView。此时,ObjectIDs和Messages列表内容会相应的改变。(3)在ObjectIDs列表框中选定CEx_SDIHelloView,而在Messages列表中选定WM_LBUTTOMDOWN消息。(4)双击Messages列表中的WM_LBUTTOMDOWN消息或单击AddFunction按钮,都会在CEx_SDIHelloView类中添加该消息的映射函数OnLButtonDown,同时在Memberfuncions列表中显示这一消息映射函数和被映射的消息,结果如图3.16所示。,(5)单击EditCode按钮后,ClassWizard对话框退出,并转向文档窗口,定位到OnLButtonDown函数源代码处。(6)添加下列代码:voidCEx_SDIHelloView:OnLButtonDown(UINTnFlags,CPointpoint)MessageBox(你好,我的VisualC+世界!,问候,0);MessageBox(你好,我的VisualC+世界!,问候,0);CView:OnLButtonDown(nFlags,point);(7)这样就完成了一个消息映射过程。程序运行后,在窗口客户区单击鼠标左键,就会弹出一个消息对话框。,3.4.2消息和消息映射,图3.16映射WM_LBUTTONDOWN消息,3.4.2消息和消息映射,3.消息映射代码查看CEx_SDIHelloView程序代码,可以发现:ClassWizard为WM_LBUTTOMDOWN的消息映射作了以下三个方面内容的安排:(1)在头文件Ex_SDIHelloView.h中声明消息处理函数OnLButtonDown:protected:/AFX_MSG(CEx_SDIHelloView)afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);/AFX_MSGDECLARE_MESSAGE_MAP()代码中的/AFX_MSG(CEx_SDIHelloView)和/AFX_MSG之间的部分是ClassWizard定义的专门用作消息映射函数声明的标记。表示该程序块中的消息映射声明是由ClassWizard来自动管理的,用户一般不需要去更改。需要说明的是,凡/和/之间的程序代码块均由ClassWizard自动管理。,3.4.2消息和消息映射,3.消息映射代码(2)在Ex_SDIHelloView.cpp源文件前面的消息映射入口处,添加了相应的映射宏:BEGIN_MESSAGE_MAP(CEx_SDIHelloView,CView)/消息映射开始/AFX_MSG_MAP(CEx_SDIHelloView)ON_WM_LBUTTONDOWN()/AFX_MSG_MAPEND_MESSAGE_MAP()/消息映射结束,(3)在Ex_SDIHelloView.cpp文件中写入一个空的消息处理函数的模板,以便用户填入具体代码,如下面的框架:voidCEx_SDIHelloView:OnLButtonDown(UINTnFlags,CPointpoint)/TODO:Addyourmessagehandlercodehereand/orcalldefaultCView:OnLButtonDown(nFlags,point);事实上,根据ClassWizard产生的上述消息映射过程,用户可以自己手动添加一些MFCClassWizard不支持的消息映射函数,以完成特定的功能。例如,Ex_HelloMFC示例就是按照上述过程添加消息映射的。,3.4.2消息和消息映射,4.键盘消息当用户按下一个键或组合键时,Windows将WM_KEYDOWN或WM_SYSKEYDOWN放入具有输入焦点的应用程序窗口的消息队列中。当键被释放时,Windows则把WM_KEYUP或WM_SYSKEYUP消息放入消息队列中。对于字符键来说,还会在这两个消息之间产生WM_CHAR消息。MFCClassWizard能自动添加了当前类的WM_KEYDOWN和WM_KEYUP击键消息处理函数的调用,它们具有下列函数原型:afx_msgvoidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags);afx_msgvoidOnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags);afx_msg是MFC用于定义消息函数的标志,参数nChar表示虚拟键代码,nRepCnt表示当用户按住一个键时的重复计数,nFlags表示击键消息标志。,3.4.2消息和消息映射,所谓虚拟键代码,是指与设备无关的键盘编码。在VisualC+中,最常用的虚拟键代码已被定义在Winuser.h中,例如:VK_SHIFT表示SHIFT键,VK_F1表示功能键F1等。同击键消息一样,MFC中的ClassWizard也提供相应的字符消息处理框架,并自动添加了当前类的WM_CHAR消息处理函数调用,它具有下列函数原型:afx_msgvoidOnChar(UINTnChar,UINTnRepCnt,UINTnFlags);参数nChar表示键的ASCII码,nRepCnt表示当用户按住一个键时的重复计数,nFlags表示字符消息标志。5.鼠标消息当用户对鼠标进行操作时,像键盘一样也会产生对应的消息。通常,Windows只将键盘消息发送给具有输入焦点的窗口,但鼠标消息不受这种限制。只要鼠标移过窗口的客户区时,就会向该窗口发送WM_MOUSEMOVE(移动鼠标)消息。,表3.6客户区鼠标消息,这里的客户区是指窗口中用于输出文档的区域。由于MFC头文件中定义的与鼠标按钮相关的标识使用了LBUTTON(左)、MBUTTON(中)和RBUTTON(右),因而当在窗口的客户区中按下或释放一个鼠标键时,还会产生如表3.6所示的消息。,3.4.2消息和消息映射,5.鼠标消息对于所有这些消息来说,ClassWizard都会将映射成类似afx_msgvoidOnXXXX的消息处理函数,如前面WM_LBUTTONDOWN的消息函数OnLButtonDown,它们具有函数原型:afx_msgvoidOnXXXX(UINTnFlags,CPointpoint);其中,point表示鼠标光标在屏幕的(x,y)坐标;nFlags表示鼠标按钮和键盘组合情况,它可以是下列值的组合(MK前缀表示“鼠标键”):MK_CONTROL键盘上的Ctrl键被按下MK_LBUTTON鼠标左按钮被按下MK_MBUTTON鼠标中按钮被按下MK_RBUTTON鼠标右按钮被按下MK_SHIFT键盘上的Shift键被按下若想知道某个键被按下,可用对应的标识与nFlags进行逻辑“与”(参数nIDEvent用来指定该计时器的标识值(不能为0),当应用程序需要多个计时器时可多次调用该函数,但每一个计时器的标识值应是唯一的,各不相同。nElapse表示计时器的时间间隔(单位为毫秒),lpfnTimer是一个回调函数的指针,该函数由应用程序来定义,用来处理计时器WM_TIMER消息。一般情况下该参数为NULL,此时WM_TIMER消息被放入到应用程序消息队列中供CWnd对象处理。SetTimer函数成功调用后返回新计时器的标识值。当应用程序不再使用计时器时,可调用CWnd:KillTimer函数来停止WM_TIMER消息的传送,其函数原型如下:BOOLKillTimer(intnIDEvent);其中nIDEvent和用户调用SetTimer函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论