|
个视窗讯息处理程式总是与呼叫RegisterClass注册的特定视窗类别相关联。CreateWindow函式根据特定视窗类别建立一个视窗。但依据一个视窗类别,可以建立多个视窗。
视窗讯息处理程式总是定义为如下形式:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
注意,视窗讯息处理程式的四个参数与MSG结构的前四个栏位是相同的。第一个参数hwnd是接收讯息的视窗的代号,它与CreateWindow函式的传回值相同。对於与HELLOWIN相似的程式(只建立一个视窗),这个参数是程式所知道的唯一视窗代号。如果程式是依据同一视窗类别(同时也是同一视窗讯息处理程式)建立多个视窗,则hwnd标识接收讯息的特定视窗。
第二个参数与MSG结构中的message栏位相同,它是标识讯息的数值。最後两个参数都是32位元的讯息参数,提供关於讯息的更多资讯。这些参数包含每个讯息型态的详细资讯。有时讯息参数是两个存放在一起的16位元值,而有时讯息参数又是一个指向字串或资料结构的指标。
程式通常不直接呼叫视窗讯息处理程式,视窗讯息处理程式通常由Windows本身呼叫。通过呼叫SendMessage函式,程式能够直接呼叫它自己的视窗讯息处理程式。我们将在後面的章节讨论SendMessage函式。
处理讯息
视窗讯息处理程式所接受的每个讯息均是用一个数值来标识的,也就是传给视窗讯息处理程式的message参数。Windows表头档案WINUSER.H为每个讯息参数定义以「WM」(视窗讯息)为字首开头的识别字。
一般来说,Windows程式写作者使用switch和case结构来确定视窗讯息处理程式接收的是什么讯息,以及如何适当地处理它。视窗讯息处理程式在处理讯息时,必须传回0。视窗讯息处理程式不予处理的所有讯息应该被传给名为DefWindowProc的Windows函式。从DefWindowProc传回的值必须由视窗讯息处理程式传回。
在HELLOWIN中,WndProc只选择处理三种讯息:WM_CREATE、WM_PAINT和WM_DESTROY。视窗讯息处理程式的结构如下:
switch (iMsg) { case WM_CREATE : 处理WM_CREATE讯息 return 0 ; case |