|
[VC++学习]《精通MFC》——第二章(v) 读书笔记
|
BOOL TranslateMessage(
CONST MSG *IpMsg //消息循环
);
每当用户按下键时,系统产生两个虚拟键消息(WM_KEYDOWN和WM_KEYUP)。虚拟按键消息中包含了用户所按键的键代码,但没有包含键值。TranslateMessage将把虚拟键消息翻译为字符消息(WM_CHAR),并把该消息投递到消息队列中。
DispatchMessage将调用目标窗口(由MSG的hwnd成员所指)的窗口过程来处理消息。如果MSG的hwnd成员为NULL,DispatchMessage不会对该消息作任何处理;如果hwnd为HWND_TOPMOST,DispatchMessage向系统中所有顶层窗口发送该消息。
GetMessage的定义:
BOOL GetMessage(
LPMSG lpMsg, //输出参数,容纳检索到的消息
HWND hWnd, //窗口句柄
UINT wMsgFilterMin, //第一个消息
UINT wMsgFiterMax //最后一个消息
);
在上面的代码中,hWnd设定为NULL,这时将检索该线程的消息队列中的任何消息,包括窗口消息以及通过PostThreadMessage投送的线程消息。若hWnd设置为特定窗口,那么就仅会检索属于该窗口的消息。后两个参数则可限定待检索的消息的范围。无论如何规定这两个参数,GetMessage总会检索WM_QUIT消息。GetMessage不会从消息队列中移出WM_PAINT消息,直到该消息被处理为止。
PeekMessage的定义:
BOOL GetMessage(
LPMSG lpMsg, //消息
HWND hWnd, //窗口句柄
UINT wMsgFilterMin, //第一个消息
UINT wMsgFiterMax //最后一个消息
UINT wRemoveMsg //是否移出
);
如果将wRemoveMsg设为PM_NOREMOVE,则在读出消息后不会从消息队列中移出该消息;如为PM_REMOVE,则读出消息后还会从消息队列中移出该消息。
PeekMessage与GetMessage的重要出别:GetMessage只有等到消息队列中有满足过滤条件的消息时才会返回;而PeekMessage则总是会立即返回而不管是否有满足过滤条件的消息。
1 窗口过程
窗口过程的作用就是处理窗口消息。
窗口过程的名字是任意的,但其签名时固定的:
LRESULT CALLBACK [窗口过程名](HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
窗口过程的返回类型为LRESULT,调用转化方式为CALLBACK。在SDK头文件中CALLBACK被定义为_stdcall型,参数从右到左压栈,被调用的函数负责清理堆栈。窗口过程有四个参数,第一个参数为处理该消息的窗口的句柄,第二个参数为消息标志符,第三和第四个参数为处理该消息的数据。实例中的窗口过程的主体是一个switch语句,它根据消息标志符解释传来的数据,并进行特定的处理。
2.5 窗口应用框架
窗口应用框架包括:创建主窗口的代码、一个消息循环。而为了创建窗口又要准备相应的窗口结构。
下面一段代码是窗口应用的主函数:
演示代码: P58
_tWinMain是每个窗口应用的入口。它主要完成准备窗口结构、创建主窗口、消息循环等。
准备窗口结构任务在MyRegisterClass中完成:
演示代码: P59
MyRegisterClass的主体是设定WNDCLASSEX类型的wcex的各个成员,最后调用RegisterClassEx注册该结构的实例。
在InitInstance中完成创建主窗口的任务:
演示代码: P60 |
|
|
|