您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第二章应用程序基本结构与运行方式
第二章应用程序基本结构与运行方式管理模式窗口的构造由应用程序完成,但窗口的管理由应用程序和Windows系统共同协作实施。事件驱动模式事件驱动应用程序在设计过程中围绕事件进行,并通过事件产生的消息驱动相应的处理函数(过程)完成操作过程。所谓消息是描述事件发生的信息。例如:鼠标键按下或者键盘产生键编码输出的信息。因此这种类型的程序的执行顺序取决于事件发生的顺序,或者说由消息的产生决定。2.1消息2.1.1组织结构Windows消息由消息号和参数两个部分组成。1.消息号Windows操作系统通过32位整数标识一条Windows消息,称为消息号。Windows消息的消息号具有以下三个特点:(1)唯一性唯一性是指对于Windows操作系统中的每一条消息存在且只存在一个消息号与之相对应。(2)直观性消息号在形式上表现为消息名。例如:WM_LBUTTONDOWN直观地反映了单击所产生的消息。(3)可自定义Windows系统定义了一系列的消息号和消息名,程序员可以使用这些系统消息,也可以使用自定义的窗口的消息。其形式如下:#define消息名消息号在消息号的定义中通常采用如下形式:WM_USER+n例如消息名为“MESSAGE_1”和“MESSAGE_2”可采用如下形式:#defineMESSAGE_1WM_USER+1#defineMESSAGE_2WM_USER+22.参数Windows的消息具有以下两参数:(1)字参数(wParam)(2)长参数(lParam)字参数和长参数都是32位整数,用于提供消息号的附带信息,是消息传递过程中的参数的载体。2.1.2分类宏观上按消息的产生可将消息分为以下四种:1.外界输入事件产生的消息。2.Windows系统向应用程序发送的消息。3.应用程序之间发送的消息。4.其他。根据消息产生的具体对象,可进一步将消息分为:1.窗口管理消息。2.初始化消息。3.输入消息。4.系统消息。5.剪贴板消息。6.系统信息消息。7.控件处理消息。8.控件通知消息。9.滚动条消息。10.非用户区消息。11.MDI消息。12.DDE消息。13.应用程序自定义的消息。2.1.3常用消息1.WM_LBUTTONDOWN产生:单击参数:wParam:包含一个整数值,以标识鼠标键按下的状态。lParam:低位字包含当前光标的X坐标,高字节包含当前光标的Y坐标。相似的消息有:WM_LBUTTONUP:放开鼠标左键时产生。WM_RBUTTONDOWN:单击时产生。WM_RBUTTONUP:放开鼠标右键时产生。WM_LBUTTONDBLCLK:双击时产生。WM_RBUTTONDBLCLK:双击鼠标右键时产生。2.WM_KEYDOWN产生:按下一个非系统键时产生。参数:wParam:按下虚拟键的键码。lParam:按键的重复次数,扫描码,转移代码,先前键的状态等信息。相似的消息有:WM_KEYUP:放开非系统键时产生。3.WM_CHAR产生:按下一个非系统键时产生。参数:wParam:按键的ASCII码。lParam:按键的重复次数,扫描码,转移代码,先前键的状态等信息。4.WM_CREATE产生:由CreateWindow函数发出。参数:wParam:未用。lParam:包含一个指向CREATESTRUCT数据结构指针,该结构是传递给CreateWindow函数的参数的副本。5.WM_CLOSE产生:关闭当前窗口时产生。参数:wParam:未用。lParam:未用。6.WM_DESTROY产生:消除窗口时由Destroyindow函数发出。参数:wParam:未用。lParam:未用。7.WM_QUIT产生:退出应用程序时由PostQuitMessage函数发出。参数:wParam:含有退出代码,退出代码标识应用程序退出运行时的有关信息。lParam:未用。2.1.4消息队列应用程序对消息的管理通过消息对队实现。如图所示:2.2应用程序的基本框架包括以下三个部分:1.Windows数据结构和数据类型。2.入口函数WinMain。3.窗口函数。2.2.1数据结构和数据类型1.数据类型常用数据类型及说明如下:发送到应用程序的消息消息队列调用处理函数进行处理处理函数消息队列在应用程序消息接收和处理中的作用数据类型说明BYTE8位无符号整数WORD16位无符号整数LONG32位有符号整数DWORD32位无符号整数HANDLE句柄UINT32位无符号整数FLOAT32位有符号浮点数BOOL布尔值LPTSTR指向字符串的32位指针LPCTSTR指向字符串的32位常量指针常用句柄类型及其说明:类型说明HWND标识窗口句柄HDC标识设备环境句柄HINSTANCE标识当前实例句柄HBITMAP标识位图句柄HCURSOR标识光标句柄HICON标识图标句柄HFONT标识字体句柄HMENU标识菜单句柄HBRUSH标识画刷句柄2.数据结构(1)MSG数据结构结构MSG中包含一个完整的消息信息结构,是消息发送的格式,也是Windows编程中最基本的数据结构之一,定义如下:typedefstructtagMSG{HWNDhwnd;//接收消息的窗口句柄UINTmessage;//消息号LPARAMlparam;//包含消息的附加信息WPARAMwparam;//包含消息的附加信息DWORDtime;//传送消息的时间POINTpt;//传送消息时的光标位置}MSG;(2)WNDCLASS数据结构结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一。应用程序通过定义一个窗口类确定一类窗口的属性,其定义如下:typedefstructtagWNDCLASS{UNITstyle;//窗口类的风格WNDPROClpfnWndProc;//指向窗口函数的指针IntcbClsExtra;//分配在窗口类结构后的字节数IntcbWndExtra;//分配在窗口实例后的字节数INSTANCEhinstance;//定义窗口类的应用程序的实例句柄HICONhIcon;//窗口类的图标HCURSORhCursor;//窗口类的光标HBRUSHhbrBackground;//窗口类的背景刷LPCTSTRlpszMenuName;//窗口类菜单资源名LPCTSTRlpszClassName;//窗口类名}WNDCLASS;(3)POINT数据结构POINT结构定义了屏幕上或窗口中的一个点的X,Y坐标。POINT结构也是应用程序中最常用的结构之一,其定义如下:typedefstructtagPOINT{LONGx;LONGy;}POINT;(4)RECT数据结构RECT结构定义了一个矩形区域,其中包含该矩形区域的左上角和右下角两个点的X,Y坐标。其定义如下:typedefstructtagRECT{LONGleft;LONGrigth;LONGtop;LONGbottom;}RECT;(5)CREATESTRUCT数据结构CREATESTRUCT结构中包含应用程序窗口的初始化参数,其定义如下:typedefstructtagCREATESTRUCT{LPVOIDlpCreateParams;//指向窗口创建数据的指针HINSTANCEhInstance;//标识拥有该窗口的模块HMENUhMenu;//标识该窗口所采用的菜单HWNDhwndParent;//标识该窗口的父窗口intcy;//标识该窗口的高度intcx;//标识该窗口的宽度inty;//标识窗口左上角y轴坐标intx;//标识窗口左上角x轴坐标LONGstyle;//标识窗口类型LPCTSTRlpszName;//标识窗口类名称LPCTSTRlpszClass;//标识窗口类名DWORDdwExStyle;//标识窗口的扩展类型}CREATESTRUCT;2.2.2入口函数WinMainWinMain函数是Windows应用程序的主体,称为应用程序的入口函数。实现以下功能:1.调用初始化函数,注册窗口类,建立窗口及执行任何其它必要的初始化工作。2.创建并启动消息循环,根据从应用程序消息队列接受的消息并将消息发往相应的消息处理函数。3.当检索到WM_QUIT消息时终止程序运行。WinMain函数有三个基本组成部分:函数说明,程序初始化和消息循环。1.函数说明intWINAPIWinMain(HINSTANCEhInstance,//应用程序当前实例句柄HINSTANCEhPrevInst,//应用程序其它实例句柄LPSTRlpszCmdLine,//指向程序命令行参数的指针IntnCmdShow//窗口显示方式的整数值标识)2.程序初始化(1)窗口类定义每一个窗口类必须经过注册(调用RegisterClass)才可使用。窗口类定义通过给窗口类数据结构WNDCLASS赋值完成,应用程序在为数据结构WNDCLASS赋值过程中常调用以下函数:HICONLoadIcon(HINSTANCEhInstance,LPCTSTRlpIconName)HCURSORLoadCursor(HINSTANCEhInstance,LPCTSTRlpCursorName)HBRUSHGetStockObject(intnBrush)(2)注册窗口类窗口类的注册由函数RegisterClass()实现,其形式为:RegisterClass(&wndclass)(3)创建窗口实例由函数CreateWindows()实现。在实际应用中,可以定义组合式的窗口风格,例如:WM_HSCROLL|WM_VSCROLL|WM_POPUP(4)显示窗口应用程序调用ShowWindow函数在屏幕上显示窗口:ShowWindow(hwnd,nCmdshow);显示窗口后,应用程序常常调用UpdateWindow()函数更新并绘制用户区,同时发出WM_PAINT消息。UpdateWindow(hwnd)3.消息循环启动消息循环的常见格式如下:MSGMsg;……while(GetMessage(&Msg,NULL,0,0)){TranslateMessage(&Msg);DispatchMessage(&Msg);}GetMessage(lpMSG,hwnd,nMsgFilterMin,nMsgFilterMax);TranslateMessage(lpMAG);DispatchMessage(lpMSG);2.2.3窗口函数窗口函数的一般形式如下:LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){……switch(message){case……:……break;……caseWM_DESTROY:PostQuitMessage(0);default:returnDefWindowProc(hwnd,message,wparam,lparam);}return(0);}2.2.4窗口示例
本文标题:第二章应用程序基本结构与运行方式
链接地址:https://www.777doc.com/doc-2186519 .html