Windoows窗口程序五
程序执行机制 过程驱动-程序的执行过程是按照预订好的顺序执行。 事件驱动-程序的执行是无序,用户可以根据需要随机触发相应的事件。 Win32窗口程序就是采用事件驱动方式执行,也就是消息机制。
当系统通知窗口工作时,就采用消息的方式派发给窗口。
消息组成:
窗口句柄
消息ID
消息的两个参数
消息产生的时间
消息产生时的鼠标位置
//消息结构体 typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG, *PMSG, *LPMSG;
每个窗口都必须具有窗口处理函数 LRESULT WindowProc( HWND hwnd,//窗口句柄 UINT uMsg,//消息ID WPARAM wParam,//消息参数 LPARAM lParam//消息参数 ); 当系统通知窗口时,会调用窗口处理函数同时将消息ID和消息参数传递给窗口处理函数。 在窗口处理函数中,不处理的消息,使用缺省窗口处理函数,例如DefWindowProc。
//获取消息 BOOL WINAPI GetMessage( LPMSG lpMsg,//存放获取到的消息buffer HWND hWnd,//窗口句柄(如果设置为NULL,表示抓取本进程内所有窗口的消息) UINT wMsgFilterMin,//获取消息的最小ID UINT wMsgFilterMax//获取消息的最大ID ); lpMsg-当获取到消息后,将消息的参数存放到MSG结构中。 hWnd-获取到hWnd所指定窗口的消息 wMsgFilterMin和wMsgFilterMax-只能获取到由他们指定的消息范围内的消息,如果都为0,表示没有范围。
TranslateMessage--翻译消息。将按键消息翻译成字符消息 BOOL TranslateMessage( _In_ const MSG *lpMsg//要翻译的消息地址 ); 检查消息是否是按键消息,如果不是按键消息,不做任何处理,继续执行。
DispatchMessage--派发消息。将消息派发到该消息所属窗口的窗口处理函数上。 LRESULT WINAPI DispatchMessage( _In_ const MSG *lpmsg//要派发的消息 );
WM_DESTROY-窗口被销毁是的消息,无消息参数。常用于在窗口被销毁之前,做相应的善后处理,例如释放资源、内存等。 WM_SYSCOMMAND-系统命令消息,当点击窗口的最大化、最小化、关闭等命令时,收到这个消息。常用于窗口关闭时,提示用户处理。 消息参数:wParam-具体点击位置,例如关闭SC_CLOSE等。 消息参数:lParam-鼠标位置 LOWORD 低字节-水平位置 HIWORD 高字节-垂直位置
WM_SYSCOMMAND消息在WM_DESTROY消息之前执行
WN_CREATE-在窗口创建成功还未显示之前,收到这个消息。常用于初始化窗口的参数、资源等,包括创建子窗口等。 WPARAM-不使用 LPARAM-是CREATESTRUCT结构的指针,保存了CreateWindowEx的12个参数。 WM_SIZE-在窗口的大小发生变化后,会收到WM_SIZE。常用于窗口大小变化后,调整窗口内各个部分的布局。 WPARAM-窗口大小变化的原因 LPARAM-变化窗口客户区的大小 LOWORD-变化后的宽度 HIWORD-变化后的高度