《第3章 编写Windows应用程序.ppt》由会员分享,可在线阅读,更多相关《第3章 编写Windows应用程序.ppt(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、消息驱动机制消息驱动机制消息(Message)就是关于发生事件的信息。从程序的观点度看,消息驱动就是由消息来驱动/响应某个函数,消息驱动程序设计是围绕着消息的产生与处理而展开的。而DOS程序则是过程驱动的。Windows系统中已预定义了7000多条消息,用户可在VC的winuser.h中找到这些消息宏定义。如:#defineWM_MOUSEMOVE0 x0200/Mouse移动#defineWM_LBUTTONDOWN0 x0201/Mouse左键按下Windows消息的类型消息的类型:1、KB消息;2、Mouse消息;3、系统消息;13的 系 统 预 定 义 消 息 取 值 范 围 为 0
2、x00000 x03ff和0 x80000 xbfff4(Windows系统保留使用)。3.1 Windows程序的特点程序的特点4、用户自定义消息内部消息:0 x04000 x7fff如:#defineWM_USER0 x400外部消息:0 xc0000 xffff图形设备接口图形设备接口GDI(图形设备接口:GraphicalDeviceInterface)与设备驱动程序实现了与设备无关的操作。(见图所示)图:图形设备接口图中,DC(设备环境/设备上下文:DeviceContext)是物理设备(如显示器、打印机等)的逻辑模型,GDI是DC和设备驱动程序之间的隔离层(或叫做抽象接口)。应用程
3、序DCGDI设备驱动程序物理硬件图形物理设备在MFC程序设计中,文字和图形的输出可由CDC和CgdiObject类的相关成员函数实现。基于资源的程序设计基于资源的程序设计动态链接库技术动态链接库技术许多Windows应用程序广泛采用DLL(动态链接库:DynamicLinkingLibrary)技术。DLL的实质是一个可执行模块,但它本身不能自己运行,使用时将它驻留内存由其它应用程序调用,使用完毕可将其从内存中释放。*.DLL文件的位置可以是:1、Windows/System文件夹2、PATH所指定的文件夹3、当前应用程序所在的文件夹Win32OS中,有三个动态链接库构成了Win32API的核
4、心:1、USER32.DLL负责窗口管理,包括:消息、菜单、光标、通信、定时器及其它控制显示窗口的函数。2、GDI32.DLL管理用户界面的生成和图形绘制,主要包括设备环境、字体、位图等。3、KERNEL32.DLLWindows的核心,它管理内存调度、进程调度等底层功能。扩展的DLL如OPENGL32.DLL(它有15个基本3DAPI函数),许多厂商以OPENGL32为基础开发出了自己的特色产品,比较著名的有:3DStudioMAX动画制作软件、OpenInventor仿真软件、ProEngineerCAM软件、ARCInfoGIS软件。多任务机制多任务机制Windows中多任务机制使用进程
5、(Process)和线程(Thread)的概念。内存管理技术内存管理技术MSDOS和Windows3.2等16Bit操作系统使用分段体系结构进行内存管理。Win32(Windows95及以上版本)采用线性体系结构进行内存管理。开始生成应用程序对象WinMain初始化实例CWinApp:InitinstanceCWinApp:RunMessagePumpWM_QUIT?退出应用程序CWinApp:ExitInstance结束消息循环3.2 MFC Windows应用程序典型执行顺序流程图开始有可用的消息吗?空闲处理有可用的消息吗?有空闲任务吗?等待直到产生消息CWinThread:PumpMes
6、sageGet/Trans/DispatchMessageYYYNNN图:MFCWindows消息循环执行顺序流程图 MFC Windows消息循环消息循环由CWinApp:Run函数实现,消息循环执执行顺序行顺序见图所示。在MFCWindows应用程序中,必须正确地建立消息处理机制。(一一)建立消息处理机制步骤建立消息处理机制步骤如下(可归纳为三步曲):1、声明消息映射声明消息映射若希望能进行消息处理的类具有接收消息的能力,需要在该类的末尾加入消息映射说明。格式:DECLARE_MESSAGE_MAP()2、建立消息与处理函数之间的映射建立消息与处理函数之间的映射格式:BEGIN_MESSA
7、GE_MAP(子类名,父类名)/消消息息映映射射宏宏定定义义或消消息息映映射射语语句句(根据使用消息的多少,一般有若干个)ON_(消息名或控制号,处理函数名)END_MESSAGE_MAP()3.3 MFC Windows应用程序消息处应用程序消息处理机制的建立理机制的建立注:消息映射宏定义将一个消息与一个处理函数关联起来,以便对消息作出响应。3、在进行消息处理的类中定义各消息处理函数在进行消息处理的类中定义各消息处理函数消息处理函数原型消息处理函数原型为:afx_msg类型函数名(WPARAMwParam,LPARAMlParam);例1:MOUSE左键按下消息处理函数左键按下消息处理函数原
8、型为:afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);参数说明:nFlags-按键标志b15b5b4b3b2b1b0该标志取值可以是:MK_CONTROL(b3)标志Ctrl键按下。MK_LBUTTON(b0)标志MOUSE左键按下。MK_MBUTTON(b4)标志MOUSE中键按下。MK_RBUTTON(b1)标志MOUSE右键按下。MK_SHIFT(b2)标志Shift键按下。point-MOUSE光标的位置坐标光标的位置坐标坐标值通常以窗口的左上角为原点计算。例2:当按下键盘非系统键按下键盘非系统键时,依次产生三个消息依次产生三个消息(W
9、M_KEYDOWN:键按下,WM_CHAR:字符消息,WM_KEYUP:键松开)。WM_CHAR所对应的消息处理函数原型所对应的消息处理函数原型为:afx_msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);参数说明:nChar-ANSI字符集代码wParam若用KeyDown消息处理函数,则nChar参数为按键的虚键码。注:虚键码(VirtualKey)是WindowsOS内部建立的与设备无关的键盘代码;nRepCnt-按键重复次数lParam参数的015bit:(LOW)lParam015bit:记录键被按下的次数。nFlags-按键标
10、志lParam参数的1631bit:(HIGH)lParam1623bit:OEM扫描码(OEM:OriginalEquipmentManufacturer),各厂商可能不同。/单击Mouse处理voidCMainFrame:OnLButtonDown(UINTnFlags,CPointpoint)if(nFlags&MK_SHIFT)&(nFlags&MK_CONTROL)/同时按下Ctrl、Shift键的处理CStringstr=Ctrl、Shift、Mouse同时按下;MessageBox(str);CFrameWnd:OnLButtonDown(nFlags,point);/键盘按键处
11、理voidCMainFrame:OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)if(nChar=Y|nChar=y)CStringstr=y键按下;MessageBox(str);CFrameWnd:OnChar(nChar,nRepCnt,nFlags);(二)用ClassWizard(类向导)建立消息映射在编写基于框架结构的MFCWindows程序中,使用最 频 繁 的 工 具 就 是 ClassWizard。程 序 员 利 用ClassWizard填写实施细节,选择把哪些消息映射给哪些类的对象,然后实现这些映射,即利用它管理类和Windows消息。利用C
12、lassWizard可以往AppWizard所产生的应用程序框架中添加新的类和函数,也可以对现存的类进行修改及创建类成员变量等。ClassWizard允许程序员浏览自己应用程序中所有与用户接口对象相关的消息,并且允许为这些消息快速地定义消息处理函数,同时ClassWizard会自动更新消息映射。用户接口对象的类型可分为三类,它们与相应的消息一一对应(见表)。表:对象类型与对应的消息对象类型对应消息窗口类窗口消息如WM_PRECREATEWINDOWWM_CREATE菜单或加速键标识符WM_COMMAND消息(命令处理消息)WM_UPDATE_COMMAND_UI消息(更新命令用户接口消息)控件
13、标识符选中的控件类型的通知消息S如EN_CHANGE消息(P138表4.10)例例:运行VC+的Spy+间谍程序,看看消息的检测。操作步骤:Step 1:开 始-程 序-Microsoft Visual Studio 6.0-MicrosoftVisualStudio6.0Tools-单击Spy+。Step 2:Spy-Messages,弹出MessageOption对话框,将靶状图形(FinderTool:右边的图形)拖到接收消息的窗口。现将其拖到桌面,即让桌面接收消息。Step 3:单击Ok钮关闭MessageOption对话框。接着,操作Mouse就可在Messages对话框中看到产生的
14、消息了。3.4 消息的检测消息的检测3.5.1 常用基本数据类型常用基本数据类型1.BOOL(int)32位布尔值,真用TRUE表示,假用FALSE表示。2.INT(int)32位带符号整数。3.BYTE(unsignedchar)8位无符号数。3.5 VC预定义的预定义的Windows程序扩充数程序扩充数据类型据类型4.COLORREF(unsignedlong)用作表示颜色的32位值。在WindowsAPI中有一个RGB宏,它返回的就是这种类型。格式:COLORREFRGB(BYTEr,BYTEg,BYTEb)返回:用作颜色的32位值(真彩色)。说明:r、g、b分别用于指定红、绿、兰基色的
15、亮度(r、g、b取值范围为0255且为整数)。常见的RGB颜色组合罗列如下:颜色RGB宏红RGB(255,0,0)绿RGB(0,255,0)兰RGB(0,0,255)黄RGB(255,255,0)紫RGB(255,0,255)青RGB(0,255,255)灰RGB(128,128,128)黑RGB(0,0,0)白RGB(255,255,255)5.LPARAM(long)作为参数传给窗口函数的32位整数(MSG结构第4个数据项)。6.WPARAM(unsignedint)作为参数传给窗口函数的32位无符号整数(MSG结构第3个数据项)。7.LONG(long)32位带符号整数。8.UINT(u
16、nsignedint)32位无符号整数。9.LPSTR(char*)指向字符串的32位指针。10.LPCTSTR(constchar*)指向字符串常量的32位指针。11.LPVOID(void*)指向未定义类型的32位指针。12.LRESULT(long)来自窗口函数或回调函数的32位整数。注:由WindowsOS直接调用的函数叫回调函数。13.WORD(unsignedshort)16位无符号整数。14.DWORD(unsignedint)32位无符号整数。15.FARPROC32位指向函数的指针。3.5.2 常用公用句柄类型常用公用句柄类型句柄是对象的标识或是对资源的间接引用(常用资源如M
17、OUSE光标、菜单等)。1.HCURSORMOUSE光标句柄。2.HICON图标句柄。3.HMENU菜单句柄。4.HWND窗口句柄。此数据类型常表示Windows环境中所打开的窗口句柄,使用该句柄相当于引用该窗口。5.HBRUSH画刷句柄。6.HDC设备环境句柄。7.HFONT字体句柄。8.HINSTANCE应用程序实例句柄。9.HPEN指向线型的画笔句柄。10.HANDLE一般的句柄。可用于Windows操作系统所建立的某个对象的句柄。11.HBITMAP位图句柄。用于保存位图的内存区域句柄。12.HDLG对话框句柄。13.HPALETTE用于颜色的调色板句柄。14.HRGN剪切区域句柄。3
18、.5.3 常用结构(体)常用结构(体)1.POINT结构(点结构)POINT结构用于定义一个点的(x,y)坐标。typedefstructtagPOINTintx;(x,y)inty;POINT;xy2.RECT结构(矩形结构)RECT结构用于定义定义一个矩形的左上角坐标和右下角坐标。typedefstructtagRECTintleft;inttop;intright;intbottom;RECT;yx(left,top)(right,bottom)3.SIZE结构(尺寸结构)SIZE结构用于存放窗口、视口(窗口中的矩形绘图区)、文本、位图的尺寸(水平宽度和垂直宽度)。typedefstru
19、cttagSIZEintcx;intcy;SIZE;3.5.4 几个简单的几个简单的MFC数据类型类数据类型类下面介绍的简单MFC数据类型类均为非CObject派生类。1.CString类(字符串类)CString类的使用方法与C风格的字符数组类似,只是多出了成员函数。例:pDC-TextOut(100,100,”Hello,World!”);可由下面两句替换。CStringch=”Hello,World!”;pDC-TextOut(100,100,ch);2.CPoint类(点类)CPoint类的使用方法与WindowsPOINT结构相似。3.CRect类(矩形类)CRect类的使用方法与W
20、indowsRECT结构相似。4.CSize类(尺寸类)CSize类的使用方法与WindowsSIZE结构相似。3.6.1 窗口类窗口类 图:部分窗口类的继承关系CObjectCCmdTargetCWndCFrameWndCCMDIFrameWndCCMDIChildWndCViewCDialogBox3.6 几种类的继承关系几种类的继承关系其中,CCmdTarget(命令目标类)是MFC中拥有消息循环和消息处理机制的基类。关于MFCWindows程序中建立消息处理机制的步骤在后面详细介绍。CWnd类是从CCmdTarget中派生出来的重要类,它是所有窗口类的基类。CWnd类隐藏了消息循环和W
21、ndProc的功能。CCmdTarget间接派生出了文档/视图结构中应用程序框架中的许多重要的类:CWinApp、CFrameWnd、CDocument、CView等(SDI应用程序框架的四个主要的类)。3.6.2 应用程序框架类应用程序框架类图:应用程序框架类的继承关系CWinApp类是从CCmdTarget中派生出来的最重要的类,每个用MFC编写的Windows程序必须有一个它的派生类的对象,它代表一个应用程序,整个程序的运行都由它负责。CWinApp类很大程度上隐藏了APIWindows程序中WinMain函数。CObjectCCmdTargetCWndCDocumentCWinApp3.6.3图形绘制类图形绘制类图:图形绘制类的继承关系图形绘制类的基类是CDC(设备环境类)。CDC类提供了基本的绘图及文本输出函数。CObjectCDCCClientDCCPaintDCCWindowDC3.6.4 图形对象类图形对象类图:部分绘图对象类的继承关系绘图对象类提供给CDC及其派生类在绘图时所需的各种图形对象,如画笔、刷子、字体等。CObjectCGdiObjectCPenCBrushCFont
限制150内