窗口过程函数是“真正干活的函数”,系统和用户所产生的各种消息,最后都要通过调用这个函数来进行处理。
定义如下:
LRESULT CALLBACK WindowProc
(
HWND hwnd, // 窗口句柄
UINT uMsg, //消息
WPARAM wParam, // 附加信息1
LPARAM lParam // 附加信息2
);
Win32api编程,对窗口的操作,都是应用窗口过程函数这个回调函数进行操作的。通过GetMessage函数获取到了一个消息,然后通过DispatchMessage函数派发出去,WindowProc函数中对接受到的消息进行相应。在窗口过程函数中通过一个switch结构,对不同的消息进行相应的处理,如果没有要处理的消息,就执行DefWindowProc这个默认的窗口过程函数。
<pre name="code" class="cpp">//窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc = NULL; switch(message) { case WM_PAINT://绘图消息 hdc = GetDC(hwnd); TextOut(hdc, 100, 100, L"hello Windows", strlen("hello Windows")); ReleaseDC(hwnd, hdc); break; case WM_KEYDOWN://处理键盘消息 if (wParam == 'Q') DestroyWindow(hwnd); break; case WM_DESTROY://当有关闭消息时 PostQuitMessage(0); break; default: return DefWindowProc(hwnd, message, wParam, lParam);//默认窗口过程函数 } return 0; }
程序运行结果如下图:
消息的形式上一节已经说过,在窗口过程函数中,各种消息都采取WM_XXX的形式表示(即WINDOW MESSAGE),比如WM_PAINT,WM_COMMAND等等。
那么这个消息到底是什么呢,在VS中,我们选中一个消息,点击转到定义处,就可以看到如下的定义:
原来这些消息都是一些十六进制的数字。用这样的一个宏定义,为每个消息定义一个便于我们理解的表示符,这样,我们在编程的时候就不需要记忆那些枯燥无味的数字,而是用这些从字面上就能理解的字符。
窗口过程函数在处理的时候,通switch函数,针对不同的WM_XXX消息,调用不同case中的代码,进而完成各种操作。
对于lParam和wParam,这两个参数中保存的是消息中的附加信息,比如:
WM_LBUTTONDOW这个消息
就需要用lParam参数来传递鼠标位置信息。
<pre name="code" class="cpp"><span style="white-space:pre"> </span>point.x=LOWORD(pMsg->lParam);//LOWORD取低位 后面四位 相对于客户窗体左上角的X偏移值 <span style="white-space:pre"> </span>point.y=HIWORD(pMsg->lParam);//HIWORDs取高位 前面四位 相对于客户窗体左上角的Y偏移值