窗口过程
每一个窗口必须有一个窗口过程(window procedure)。窗口过程的名字是用户定义的。示例程序对主窗口使用下面的窗口过程:
LRESULT WINAPI MainWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
因为窗口过程必须由标准的调用规范来声明,所以要是WINAPI标识符。
窗口过程从系统接收消息,这些消息必须是输入消息或者是窗口控制消息。你可以在你的窗口过程中有选择的处理一个消息,或者通过调用DefWindowPro函数把消息传递给系统默认处理。示例程序利用switch语句处理的消息有WM_PAINT,WM_COMMAND和WM_DESTROY,结构如下:
switch( uMsg ) {
case WM_PAINT:
...
case WM_COMMAND:
...
case WM_DESTROY:
...
default:
return( DefWindowProc( hWnd, msg, wParam, lParam ));
}
WM_PAINT消息表明你应该重绘应用程序的全部或部分。利用BeginPaint函数得到一个DC句柄,然后在应用程序窗口内用DC对象绘图,例如你可以使用TextOut函数。利用EndPaint函数释放DC句柄。示例程序用以下的代码在窗口中显示了一个文本字符串:
case WM_PAINT:
hDC = BeginPaint( hWnd, &ps );
TextOut( hDC, 10, 10, "Hello, World!", 13 );
EndPaint( hWnd, &ps );
break;
WM_COMMAND消息表明用户从菜单项目当中选择了一个命令。示例程序用一下的代码去检查About的菜单项目是否被选择:
case WM_COMMAND:
switch( wParam ) {
case IDM_ABOUT:
...
break;
}
大多数的窗口过程处理WM_DESTROY消息。在销毁窗口后,系统会立即把这条消息传递给窗口过程。这条消息给了你机会完成处理过程,并在应用程序消息队列中发布一条WM_QUIT的消息。
示例程序处理WM_DESTROY消息的过程如下:
case WM_DESTROY:
PostQuitMessage( 0 );
break;