《第二部分 MFC编程——MFC基本应用程序的建立.ppt》由会员分享,可在线阅读,更多相关《第二部分 MFC编程——MFC基本应用程序的建立.ppt(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第二部分第二部分第二部分第二部分 MFCMFC程序设计程序设计程序设计程序设计MFC与与Windows编程基础编程基础Windows编程基础编程基础使用使用MFC AppWizard编制编制MFC应用程序应用程序MFC常见类介绍常见类介绍消息与消息驱动消息与消息驱动1/14/202321 Windows编程基础编程基础编编制制一一个个功功能能强强大大和和易易操操作作的的WindowsWindows应应用用程程序序所所需需要要的的代代码码肯肯定定会会比比一一般般的的C+C+程程序序要要多多得得多多,但但并并不不是是所所有有的的代代码码都都需需要要自自己己从从头头开开始始编编写写,因因为为Visu
2、al Visual C+C+不不仅仅提提供供了了常常用用的的WindowsWindows应应用用程程序序的的基基本本框框架架,而而且且可可以以在在框框架架程程序序中中直直接接调调用用Win32 Win32 APIAPI函函数数。这这样样,用用户户仅仅需需要要在在相相应应的的框框架架位位置置中中添添加加自自己己的的代代码码或或修修改改部部分分代代码码就就可可实实现现WindowsWindows应应用用程序的许多功能。程序的许多功能。1/14/20233Windows API:Application Programming Interface,应应用用程程序序接接口口,是是一一套套用用来来控控制制
3、整整个个Windows系系统统的的接接口口函函数数库库。Windows系系统统拥拥有有多多达达上上百百个个API函函数数,无无论论执执行行何何种操作,系统都会利用这些函数来进行一定的控制。种操作,系统都会利用这些函数来进行一定的控制。MFC:Microsoft Foundation Class Library,微微软软基基础础类类库库,以以C+形形式式封封装装的的Windows的的API函函数数的的类类库库。在在Visual C+6.0版版本本中中MFC大大约约包包含含200个个类类。利利用用MFC建建立立应应用用程程序序更更符符合合面面向向对对象象的的设设计计思思想想,利利用用向向导导创创建
4、应用程序可以隐藏许多设计细节,进而简化编程过程。建应用程序可以隐藏许多设计细节,进而简化编程过程。Windows SDK:Windows Software Development Kit,Windows软软件件开开发发工工具具包包.一一般般是是一一些些被被软软件件工工程程师师用用于于为为特特定定的的软软件件包包、软软件件框框架架、硬硬件件平平台台、操操作作系系统统等等建建立应用软件的开发工具的集合。立应用软件的开发工具的集合。1/14/202341.1 简单的简单的Windows应用程序应用程序#include int WINAPI WinMain(HINSTANCE hInstance,HI
5、NSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)MessageBox(NULL,你好,我的Visual C+世界!,问候,0);return 0;注意:项目类型为:Win32 Application1/14/20235C+控控制制台台应应用用程程序序以以main函函数数作作为为进进入入程程序序的的初初始始入入口口点点,但但在在Windows应应用用程程序序中中,main主主函函数数被被WinMain函函数数取取代代。WinMain函数的原型如下:函数的原型如下:int WINAPI WinMain(HINSTANCE hInstance,/
6、当前实例句柄当前实例句柄 HINSTANCE hPrevInstance,/前一实例句柄前一实例句柄 LPSTR lpCmdLine,/指向命令行参数的指针指向命令行参数的指针 int nCmdShow)/窗口的显示状态窗口的显示状态 所谓句柄是一个标识所谓句柄是一个标识Windows资源资源(如菜单、图标、窗口等如菜单、图标、窗口等)和和设备等对象的数据指针类型。通常,一个句柄变量可用来对系设备等对象的数据指针类型。通常,一个句柄变量可用来对系统中某些资源的间接引用。统中某些资源的间接引用。每一个每一个C+Windows应用程序都需要应用程序都需要Windows.h头文件,它还头文件,它还包
7、含了其他的一些包含了其他的一些Windows头文件。这些头文件定义了头文件。这些头文件定义了Windows的所有数据类型、函数调用、数据结构和符号常量。的所有数据类型、函数调用、数据结构和符号常量。程序中,程序中,MessageBox是一个是一个Win32 API函数,用来弹出一个消函数,用来弹出一个消息对话框。使用格式参见息对话框。使用格式参见MSDN1/14/202361.2 完整的完整的Windows应用程序应用程序#include#includeLRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HI
8、NSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)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(NU
9、LL,IDI_APPLICATION);wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName =NULL;wndclass.lpszClassName=HelloWin;/窗口类名窗口类名 1/14/20237if(!RegisterClass(&wndclass)/注册窗口注册窗口 MessageBox(NULL,窗口注册失败!窗口注册失败!,HelloWin,0);return 0;hwnd=C
10、reateWindow(HelloWin,我的窗口我的窗口,WS_OVERLAPPEDWINDOW,/窗口类名窗口类名,窗口标题窗口标题 ,窗口样式窗口样式 CW_USEDEFAULT,CW_USEDEFAULT,/窗口最初的窗口最初的 x 位置位置,窗口最初的窗口最初的 y 位置位置 CW_USEDEFAULT,CW_USEDEFAULT,/窗口最初的窗口最初的 x 大小大小,窗口最初的窗口最初的 y 大小大小 NULL,NULL,hInstance,NULL);/父窗口句柄父窗口句柄,窗口菜单句柄窗口菜单句柄,应用程序实例句柄应用程序实例句柄,创建窗口的参数创建窗口的参数 ShowWind
11、ow(hwnd,nCmdShow);/显示窗口显示窗口 UpdateWindow(hwnd);/更新窗口,包括窗口的客户区更新窗口,包括窗口的客户区 while(GetMessage(&msg,NULL,0,0)/进入消息循环:当从应用程序消息队列中检取的消息是进入消息循环:当从应用程序消息队列中检取的消息是WM_QUIT时,则退出循环。时,则退出循环。TranslateMessage(&msg);/转换某些键盘消息转换某些键盘消息 DispatchMessage(&msg);/将消息发送给窗口过程,这里是将消息发送给窗口过程,这里是WndProc return msg.wParam;1/14
12、/20238LRESULT 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_CHAR:char szChar400;sprintf(szChar,keyboard is pressed,the char is%c,wPar
13、am);MessageBox(hwnd,szChar,提示提示,0);break;case WM_RBUTTONDOWN:int t=strlen(鼠标右键点击鼠标右键点击);TextOut(GetDC(hwnd),100,100,鼠标右键点击鼠标右键点击,t);break;case WM_DESTROY:/当窗口关闭时产生的消息当窗口关闭时产生的消息PostQuitMessage(0);return 0;return DefWindowProc(hwnd,message,wParam,lParam);/执行默认的消息处理执行默认的消息处理1/14/20239 窗窗口口过过程程函函数数WndP
14、roc用用来来接接收收和和处处理理各各种种不不同同的的消消息息,而而主主函数函数WinMain通常要完成以下几步工作:通常要完成以下几步工作:(1)对对WNDCLASS类对象进行参数设置,实现窗口定义。类对象进行参数设置,实现窗口定义。(2)调用调用API函数函数RegisterClass注册应用程序的窗口类。注册应用程序的窗口类。(3)调调用用相相关关API函函数数创创建建和和显显示示窗窗口口,并并进进行行其其它它必必要要的的初初始始化化处处理理。其其中中,函函数数CreateWindow用用来来创创建建已已注注册册窗窗口口类类的的窗窗口口。Windows每每一一个个窗窗口口都都有有一一些些
15、基基本本属属性性,如如窗窗口口标标题题、窗窗口口位位置置和和大大小小、应应用用程程序序图图标标、鼠鼠标标指指针针、菜菜单单和和背背景景颜颜色色等等。窗窗口类就是充当这些属性的模板。口类就是充当这些属性的模板。(4)创创建建和和启启动动应应用用程程序序的的消消息息循循环环。Windows应应用用程程序序接接受受各各种种不不同同的的消消息息,包包括括键键盘盘消消息息、鼠鼠标标以以及及窗窗口口产产生生的的各各种种消消息息。Windows系系统统首首先先将将消消息息放放入入消消息息队队列列中中,应应用用程程序序的的消消息息循循环环就就是是从从应应用用程程序序的的消消息息队队列列中中检检取取消消息息,并
16、并将将消消息息发发送送相相应应的的窗窗口口过过程程函函数数中中作作进进一一步步处处理理。API函函数数GetMessage 和和DispatchMessage就是起到这样的作用。就是起到这样的作用。(5)如果接收到如果接收到WM_QUIT消息,则退出应用程序。消息,则退出应用程序。1/14/202310初始化应用程序初始化应用程序开始执行开始执行初始化并创建初始化并创建应用程序窗口应用程序窗口进入消息循环进入消息循环并获取一条消息并获取一条消息消息是否为消息是否为WM_QUIT?终止程序终止程序是是应用程序中是否应用程序中是否处理了此消息处理了此消息否否处理消息处理消息转送消息给窗口转送消息给
17、窗口进行默认处理进行默认处理是是否否 Windows应用程序的基本流程1/14/2023111.3 Windows编程特点编程特点一一个个完完整整的的Windows应应用用程程序序除除了了WinMain函函数数外外,还还包包含含用用于于处理用户动作和处理用户动作和窗窗口口消消息息的的窗窗口口函函数数。这这不不同同于于一一个个C+的的控控制制台台应应用用程程序序,可可以将整个程序包以将整个程序包含含在在main函函数数中中。事事实实上上,它它们们的的区区别别还还远远不不止止这这些些,不不久久还还会会发现一个发现一个Windows应用程序还常常具有这样的一些特性:应用程序还常常具有这样的一些特性:
18、消息驱动机制消息驱动机制图形设备接口图形设备接口(GDI)基于资源的程序设计基于资源的程序设计动态链接库动态链接库进程和线程进程和线程1/14/2023121.消息驱动机制消息驱动机制在在Windows操作环境中,无论是系统产生的动作或是用户运行应操作环境中,无论是系统产生的动作或是用户运行应用程序产生的动作,都称为事件用程序产生的动作,都称为事件(Events)产生的消息产生的消息(Message)。例如,在例如,在Windows 桌面桌面(传统风格传统风格)上,双击应用程序的快捷图标,上,双击应用程序的快捷图标,系统就会执行该应用程序。在系统就会执行该应用程序。在Windows的应用程序中
19、,也是通过的应用程序中,也是通过接收消息、分发消息、处理消息来和用户进行交互的。接收消息、分发消息、处理消息来和用户进行交互的。这种消息驱动的机制是这种消息驱动的机制是Windows编程的最大特点。需要注意的是,编程的最大特点。需要注意的是,许多许多Windows消息都经过了严格的定义,并且适用于所有的应用消息都经过了严格的定义,并且适用于所有的应用程序。例如,当用户按下鼠标的左键时系统就会发送程序。例如,当用户按下鼠标的左键时系统就会发送WM_LBUTTONDOWN消息,而当用户敲了一个字符键时系统消息,而当用户敲了一个字符键时系统就会发送就会发送WM_CHAR消息,若用户进行菜单选择或工具
20、按钮单击消息,若用户进行菜单选择或工具按钮单击等操作时,系统又会相应地发送等操作时,系统又会相应地发送WM_COMMAND消息给相应的消息给相应的窗口等等。窗口等等。1/14/2023132.图形设备接口图形设备接口(GDI)在传统的在传统的DOS环境中,想要在打印机上打印一幅图形是一件非常环境中,想要在打印机上打印一幅图形是一件非常复杂的事情,因为用户必须根据打印机类型和指令规则向打印机复杂的事情,因为用户必须根据打印机类型和指令规则向打印机输送数据。而输送数据。而Windows则提供了一个抽象的接口,称为图形设备则提供了一个抽象的接口,称为图形设备接口接口(Graphical Device
21、 Interface,简称,简称GDI),使得用户直接,使得用户直接利用系统的利用系统的GDI函数就能方便实现输入或输出,而不必关心与系函数就能方便实现输入或输出,而不必关心与系统相连的外部设备的类型。统相连的外部设备的类型。3.基于资源的程序设计基于资源的程序设计Windows应用程序常常包含众多图形元素,例如光标、菜单、工应用程序常常包含众多图形元素,例如光标、菜单、工具栏、位图、对话框等,在具栏、位图、对话框等,在Windows环境下,每一个这样的元素环境下,每一个这样的元素都作为一种可以装入应用程序的资源来存放。这些资源就像都作为一种可以装入应用程序的资源来存放。这些资源就像C+程序中
22、的常量一样,可以被编辑、修改,也可以被其他应用程序程序中的常量一样,可以被编辑、修改,也可以被其他应用程序所共享。所共享。Visual C+6.0中就提供这样的编辑器,可中就提供这样的编辑器,可“所见即所所见即所得得”地对这些不同类型的资源进行设计、编辑等。地对这些不同类型的资源进行设计、编辑等。1/14/2023144.动态链接库动态链接库动态链接库提供了一些特定结构的函数,能被应用程序在运行过程中动态链接库提供了一些特定结构的函数,能被应用程序在运行过程中装入和连接,且多个程序可以共享同一个动态链接库,这样就可以大装入和连接,且多个程序可以共享同一个动态链接库,这样就可以大大节省内存和磁盘
23、空间。从编程角度来说,动态链接库可以提高程序大节省内存和磁盘空间。从编程角度来说,动态链接库可以提高程序模块的灵活性,因为它本身是可以单独设计、编译和调试的。模块的灵活性,因为它本身是可以单独设计、编译和调试的。Windows提供了应用程序可利用的丰富的函数调用,大多数用于实现提供了应用程序可利用的丰富的函数调用,大多数用于实现其用户界面和在显示器上显示的文本和图形,都是通过动态链接库来其用户界面和在显示器上显示的文本和图形,都是通过动态链接库来实现的。这些动态链接库是一些具有实现的。这些动态链接库是一些具有.DLL扩展名或者有时是扩展名或者有时是.EXE扩展扩展名的文件。名的文件。在在Win
24、dows操作系统中,最主要的操作系统中,最主要的DLL有有KERNEL32.DLL、GDI32.DLL和和USER32.DLL三个模块。其中,三个模块。其中,KERNEL32用来处理用来处理存储器低层功能、任务和资源管理等存储器低层功能、任务和资源管理等Windows核心服务;核心服务;GDI32用来用来提供图形设备接口,管理用户界面和图形绘制,包括提供图形设备接口,管理用户界面和图形绘制,包括Windows元文件、元文件、位图、设备描述表和字体等;而位图、设备描述表和字体等;而USER32负责窗口的管理,包括消息、负责窗口的管理,包括消息、菜单、光标、计时器以及其它与控制窗口显示相关的一些功
25、能。菜单、光标、计时器以及其它与控制窗口显示相关的一些功能。1/14/2023155.进程和线程进程和线程在在32位位Windows多任务操作系统中,采用了进程和线程的管理模多任务操作系统中,采用了进程和线程的管理模式。进程是装入内存中正在执行的应用程序。进程包括私有的虚式。进程是装入内存中正在执行的应用程序。进程包括私有的虚拟地址空间、代码、数据及其它操作系统资源,如文件、管道以拟地址空间、代码、数据及其它操作系统资源,如文件、管道以及对该进程可见的同步对象等。进程包括了一个或多个在进程上及对该进程可见的同步对象等。进程包括了一个或多个在进程上下文内运行的线程。线程是操作系统分配下文内运行的
26、线程。线程是操作系统分配CPU时间的基本实体。时间的基本实体。线程可以执行应用程序代码的任何部分,包括当前正在被其它线线程可以执行应用程序代码的任何部分,包括当前正在被其它线程执行的那些部分。同一进程的所有线程共享同样的虚拟地址空程执行的那些部分。同一进程的所有线程共享同样的虚拟地址空间、全局变量和操作系统资源。间、全局变量和操作系统资源。在一个应用程序中,可以包括一个或多个进程,每个进程由一个在一个应用程序中,可以包括一个或多个进程,每个进程由一个或多个线程构成。或多个线程构成。1/14/2023161.4 Windows一些基本概念一些基本概念表表1 Windows常用的基本数据类型常用的
27、基本数据类型1/14/202317句柄句柄(Handl),是整个,是整个windows编程的基础,一个句柄是指使用的编程的基础,一个句柄是指使用的一个唯一的整数值,是指一个四字节长的数值,用于标志应用程序一个唯一的整数值,是指一个四字节长的数值,用于标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等,应用程序能够通过句图标,滚动条,输出设备,控件或者文件等,应用程序能够通过句柄访问相应的对象的信息。柄访问相应的对象的信息。表表2 Windows常用的句柄类型常用的句柄类型1/
28、14/202318窗口窗口(Window)构成一个应用程序构成一个应用程序构成一个应用程序构成一个应用程序窗口窗口窗口窗口的成分的成分的成分的成分窗口边界窗口边界下拉菜单下拉菜单水平滚动条水平滚动条垂直滚动条垂直滚动条最小化按钮最小化按钮标题栏标题栏控制菜单框控制菜单框工作区工作区最大化按钮最大化按钮1/14/202319wWin应用程序应用程序编程编程创建一个或多个窗口,创建一个或多个窗口,wWin应用程序应用程序运行运行窗口内部窗口内部、窗口与窗口窗口与窗口之间之间、窗口窗口与系统与系统之间进行之间进行数据处理与交换数据处理与交换的过程。的过程。应用程序与用户之间应用程序与用户之间交互的接
29、口环境交互的接口环境系统对应用程序系统对应用程序管理的基本单位管理的基本单位Window应用程序应用程序基本的操作单元基本的操作单元窗口窗口窗口窗口及其功能及其功能及其功能及其功能1/14/2023202 使用使用MFC AppWizard创建创建Windows应用程序应用程序2.1 MFC AppWizard(MFC应用程序向导应用程序向导)创建单文档应用程序步骤创建单文档应用程序步骤1.开始开始新建项目,选择新建项目,选择MFC AppWizard(exe)的项目类型的项目类型(该类型用于创建可执行该类型用于创建可执行的的 Windows应用程序应用程序)。2.MFC AppWizard-
30、stetp 1确定应用程序类型,确定应用程序类型,3个选项:对话框程序、单文档程序、多文档程序个选项:对话框程序、单文档程序、多文档程序3.MFC AppWizard-stetp 2是否加入数据库的支持是否加入数据库的支持4.MFC AppWizard-stetp 3允许用户在程序中加入复合文档、自动化、允许用户在程序中加入复合文档、自动化、ActiveX控件的支持。控件的支持。5.MFC AppWizard-stetp 4对浮动工具条、打印与预览以及通信等特性的支持。对浮动工具条、打印与预览以及通信等特性的支持。6.MFC AppWizard-stetp 5关于窗口风格、备注文件、关于窗口风
31、格、备注文件、DLL的使用的使用7.MFC AppWizard-stetp 6自动生成类的类名及文件信息设置自动生成类的类名及文件信息设置1/14/202321表表3 MFC AppWizard创建的应用程序类型创建的应用程序类型1/14/2023222.2 MFC应用程序项目组织应用程序项目组织表表4 Visual C+6.0文件类型的含义文件类型的含义1/14/202323Ex_SDIHello文件夹文件夹Debug或或Release文件夹文件夹Res文件夹文件夹类文件类文件.cpp,.h资源文件资源文件Ex_SDIHello.rc项目及项目工作区文件项目及项目工作区文件其他文件其他文件编
32、连过程产生的文件编连过程产生的文件运行文件运行文件Ex_SDIHello.exe图标文件图标文件Ex_SDIHello.ico等等工具栏资源工具栏资源Toolbar.bmp其他资源其他资源Ex_SDIHello.rc2等等图 项目的文件组织 1/14/2023243 MFC的类层次及常用类介绍的类层次及常用类介绍图图 MFC类的基本层次结构类的基本层次结构CCmdTargetCWndCDocumentCFrameWndCObjectCViewCDialog及控件及控件CWinThreadCWinAppCMDIChildWndCMDIFrameWndCMiniFrameWnd1/14/20232
33、5CObject是大多数是大多数MFC类的根类或基类。类的根类或基类。CCmdTarget类类是是MFC处处理理命命令令消消息息的的基基础础、核核心心。MFC为为该该类类设设计计了了许多成员函数和一些成员数据,基本上是为了解决消息映射问题的许多成员函数和一些成员数据,基本上是为了解决消息映射问题的 CWinThread类类是是MFC用用来来封封装装线线程程的的,包包括括UI线线程程和和工工作作者者线线程程。Windows以以消消息息驱驱动动方方式式工工作作,每每个个WIN32应应用用程程序序都都至至少少包包含含一一个个消消息息队队列列和和一一个个消消息息泵泵。消消息息队队列列建建立立在在操操作
34、作系系统统提提供供内内存存保保留留区区中中,消消息息泵泵不不断断搜搜寻寻消消息息队队列列,将将取取得得的的消消息息分分发发给给应应用用程程序序的的各各个个部部分分进进行处理,这个过程叫做消息循环。行处理,这个过程叫做消息循环。虚函数虚函数InitInstance:Windows允许同时运行一个应用程序的多个备允许同时运行一个应用程序的多个备份,又称为运行一个程序的多个实例。份,又称为运行一个程序的多个实例。InitInstance就是就是“初始化实例初始化实例”的意思,可见,它是在实例创建时首先被调用的。应用程序总要重载的意思,可见,它是在实例创建时首先被调用的。应用程序总要重载这个虚函数,进
35、行系统设置,创建运行环境。例如,主窗口一定要在这个虚函数,进行系统设置,创建运行环境。例如,主窗口一定要在InitInstance()中创建,因为该函数退出后就进入该线程的消息循环。中创建,因为该函数退出后就进入该线程的消息循环。虚函数虚函数Run:该函数提供:该函数提供UI线程的消息循环,即反复地提取消息,分发线程的消息循环,即反复地提取消息,分发消息,直到收到消息,直到收到WM_QUIT退出循环,线程随即结束。在循环中,如果退出循环,线程随即结束。在循环中,如果当前没有收到消息,则调用空闲消息处理程序当前没有收到消息,则调用空闲消息处理程序OnIdle()。1/14/202326CDocu
36、ment类类为为用用户户定定义义的的文文档档类类提提供供了了基基本本的的函函数数功功能能。文文档档类类表表示示了了通通常常用用于于File Open命命令令打打开开和和使使用用File Save命命令令保保存存的数据。的数据。CWnd窗窗口口基基类类是是最最基基本本的的GUI对对象象。我我们们在在屏屏幕幕上上看看到到的的一一切切对对象象都都与与窗窗口口有有关关,它它们们或或者者派派生生于于CWnd,属属继继承承关关系系,如如对对话话框框、工工具具栏栏、状状态态栏栏、子子控控件件;或或者者被被CWnd合合成成,属属服服务务员员与服务对象的关系,如图标、菜单、显示设备。与服务对象的关系,如图标、菜
37、单、显示设备。CWnd类类封封装装的的窗窗口口操操作作主主要要包包括括窗窗口口的的创创建建和和销销毁毁、操操作作窗窗口口风风格格、操操作作窗窗口口状状态态、窗窗口口子子类类化化、获获取取指指定定窗窗口口等等。除除窗窗口口操操作作外外,CWnd类类还还实实现现绘绘制制窗窗口口、操操作作窗窗口口子子控控件件、窗窗口口定定时时器器、进行窗口消息处理进行窗口消息处理 等。等。1/14/202327CWinApp为为应应用用程程序序类类,MFC 中中的的主主应应用用程程序序类类,用用于于 Windows 操操作作系系统统的的应应用用程程序序的的初初始始化化、运运行行和和终终止止。基基于于框框架架生生成成
38、的的应应用用程程序序必必须须有有且且仅仅有有一一个个从从 CWinApp 派派生生的的类类的对象的对象theApp。在创建窗口之前先构造该对象。在创建窗口之前先构造该对象。与与用用于于 Windows 操操作作系系统统的的任任何何程程序序一一样样,框框架架应应用用程程序序也也具具有有 WinMain 函函数数。但但在在框框架架应应用用程程序序中中不不必必编编写写 WinMain。它它由由类类库库提提供供,并并在在应应用用程程序序启启动动时时调调用用。WinMain 执执行行注注册册窗窗口口类类等等标标准准服服务务。然然后后它它调调用用应应用用程程序序对对象象的的成成员员函函数数来来初初始始化化
39、和和运运行行应应用用程程序序:为为初初始始化化应应用用程程序序,WinMain 调调 用用 应应 用用 程程 序序 对对 象象 的的 InitApplication 和和 InitInstance 成成员员函函数数;为为运运行行应应用用程程序序的的消消息息循循环环,WinMain 调调用用 Run 成成员员函函数数;在在终终止止时时,WinMain 调调用用应应用程序对象的用程序对象的 ExitInstance 成员函数。成员函数。1/14/202328CFrameWnd类往往用于创建应用程序的主窗口,因为它能很类往往用于创建应用程序的主窗口,因为它能很好地支持系统菜单和控制条(工具条、状态条
40、等),为此定义好地支持系统菜单和控制条(工具条、状态条等),为此定义了大量的成员函数和变量。在编写文档了大量的成员函数和变量。在编写文档/视图结构的应用程序视图结构的应用程序时,时,CFrameWnd作为主窗口管理视图和文档对象。视图对象作为主窗口管理视图和文档对象。视图对象和控制条都成为和控制条都成为CFrameWnd的子窗口,它们分享客户区,其的子窗口,它们分享客户区,其位置被位置被CFrameWnd有效地排列。有效地排列。CFrameWnd直接支持单文直接支持单文档界面(档界面(SDI),对于多文档界面(),对于多文档界面(MDI)。)。CView视图类是程序设计中使用率最高的窗口对象,
41、它是用户视图类是程序设计中使用率最高的窗口对象,它是用户的主要操作界面。从文档类中将文档中的数据取出后显示给用的主要操作界面。从文档类中将文档中的数据取出后显示给用户;接受用户对文档中数据的编辑和修改;将修改的结果反馈户;接受用户对文档中数据的编辑和修改;将修改的结果反馈给文档类,由文档类将修改后的内容保存到磁盘文件中。给文档类,由文档类将修改后的内容保存到磁盘文件中。1/14/2023294 使用类向导添加映射变量及消息响应使用类向导添加映射变量及消息响应MFC类向导(ClassWizard)是Visual C+6.0中又一个非常有用的工具。它能自动为一个项目添加一个类、进行消息和数据映射、
42、创建OLE Automation(自动化)属性和方法以及进行ActiveX事件处理等。(1)选择“查看”“建立类向导”菜单或直接使用Ctrl+W快捷键。(2)在源代码文件的文档编辑窗口中,右击鼠标,从弹出的快捷菜单中选择“建立类向导”命令。4.1 4.1 ClassWizardClassWizard的使用的使用1/14/202330可以看到ClassWizard对话框包含了5个标签页面,它们各自含义如下:Message Maps(消息映射):用来添加、删除和编程处理消息的成员函数。Member Variables(成员变量):添加或删除与控件相关联的成员变量(或称数据成员),以便与控件进行数据
43、交换。这些控件所在的类一般是从CDialog、CPropertyPage、CRecordView或CDaoRecordView中派生的类。Automation(自动化):为支持Automation的类(如ActiveX控件类)添加属性和方法。ActiveX Events(ActiveX事件):为ActiveX控件类添加触发事件的支持。Class Info(类信息):有关项目中类的其他信息。一般来说,MFC ClassWizard对话框最前两项是用户最关心的,对话框最前两项是用户最关心的,也是最经常使用的,因为几乎所有的代码编写都要利用这两个也是最经常使用的,因为几乎所有的代码编写都要利用这两个
44、标签项。标签项。由于Member Variables功能以后还会详细讨论,因此这里仅讨论Message Maps(消息映射)与类的添加和删除方法。1/14/2023314.2 消息和消息映射消息和消息映射1.消息分类消息分类Windows应用程序中的消息主要有三种类型。应用程序中的消息主要有三种类型。(1)标标注注的的Windows消消息息(Windows message)。这这类类消消息息主主要要是是指指由由WM_开开头头的的消消息息(WM_ COMMAND除除外外),一一般般由由窗窗口口类类和和视视图图类类对对象象来来处处理理。窗窗口口消消息息往往往往带带有有参参数数,以以标标志志处处理理
45、消消息息的的方方法法。又又分分为为:键键盘盘消消息息、鼠鼠标消息、窗口消息。标消息、窗口消息。(2)控控件件的的通通知知消消息息(Control notifications)。当当控控件件的的状状态态发发生生改改变变(例例如如用用户户在在控控件件中中进进行行输输入入)时时,控控件件就就会会向向其其父父窗窗口口发发送送WM_COMMAND通通知知消消息息。应应用用程程序序框框架架处处理理控控件件消消息息的的方方法法和和Windows消消息息相相同同,但但按按钮的钮的BN_CLICKED通知消息除外,它的处理方法与命令消息相同。通知消息除外,它的处理方法与命令消息相同。(3)命命令令消消息息(Co
46、mmand message)。命命令令消消息息主主要要包包括括由由用用户户交交互互对对象象(菜菜单单、工工具具条条的的按按钮钮、快快捷捷键键等等)发发送送的的WM_COMMAND通通知知消消息息。命命令令消消息息的的处处理理方方式式与与其其他他两两种种消消息息不不同同,它它能能够够被被多多种种对对象象接接收收、处处理理,这这些些对对象象包包括括文文档档类类、文文档档模模板板类类、应应用用程程序序本本身身以以及及窗窗口口和和视视类类等等;而而窗窗口口消消息息和和控控件件的的通通知知消消息息是是由由窗窗口口对对象象接接收收并并处处理理的的,这这里里的的窗窗口口对对象象是是指指从从CWnd中中派派生
47、生的的类类的的对对象象,它它包包括括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及从这些类派生的对象等。以及从这些类派生的对象等。1/14/202332键盘消息键盘消息1.WM_KEYDOWN:按下一个按下一个非系统键非系统键时产生的消息时产生的消息wwParam按下键的按下键的虚拟键码虚拟键码,标识按或放。,标识按或放。wlParam记录按键的重复次数、扫描码、转移代码记录按键的重复次数、扫描码、转移代码及先前键的状态等信息。及先前键的状态等信息。相似的消息还有相似的消息还有WM_KEYUP,在放开非系统键时产生在放开非系统键时产生2.
48、WM_ CHAR:按下一个按下一个非系统键非系统键时产生的消息时产生的消息w wParam按下键的按下键的ASCII码。码。w1Param与与WM_KEYDOWN的相同。的相同。1/14/202333鼠标消息鼠标消息此外,类似的此外,类似的鼠标左右键鼠标左右键消息还有:消息还有:wWM_LBUTTONUP:放开左放开左键时产生的键时产生的消息消息;wWM_RBUTTONDOWN:单击右单击右键时产生的键时产生的消息消息;wWM_RBUTTONUP:放开右放开右键时产生的键时产生的消息消息;wWM_LBUTTONDBLCLK:双击左双击左键时产生的键时产生的消息消息;wWM_RBUTTONDBL
49、CLK:双击右双击右键时产生的键时产生的消息消息。1.WM_LBUTTONDOWN:产生单击鼠标左键的消息,附加信息:产生单击鼠标左键的消息,附加信息:wlParam当前光标位置当前光标位置低字节低字节为为X坐标值坐标值高字节为高字节为Y坐标值坐标值wwParam一整数值以标识鼠标键的一整数值以标识鼠标键的按下状态按下状态MK_LBUTTON按下鼠标按下鼠标左左键键MK_MBUTTON按下鼠标按下鼠标中中键键MK_RBUTTON按下鼠标按下鼠标右右键键1/14/202334窗口消息窗口消息1.WM_CREATE:由由CreateWindow函数发出的消息。函数发出的消息。wwParam未用。未
50、用。wlParam个指向个指向CREATESTRUCT数据结构的指针。数据结构的指针。3.WM_DESTROY:由由DestroyWiodow函数发出的消息。函数发出的消息。wwParam和和1Param均未用。均未用。2.WM_CLOSE:关闭窗口时产生的消息。关闭窗口时产生的消息。wwParam和和1Param均未用。均未用。4.WM_QUIT退出应用程序时由退出应用程序时由PostQuitMessage函数发出的消息。函数发出的消息。wwParam退出代码退出代码,标识退出时的有关信息。标识退出时的有关信息。wlParam未用。未用。5.WM_PAINT用户区移动或显示用户区移动或显示用