窗口程序创建的过程
- 创建窗口类
WNDCLASS wndclass;
- 注册窗口类
RegisterClass(&wndclass);
- 创建窗口
hwnd = CreateWindow(...);
- 显示窗口
ShowWindow(hwnd,iCmdShow);
- 更新窗口
UpdateWindow(hwnd); //产生第一条WM_PATINT消息
- 消息循环
while(GetMessage(&msg,NULL.0.0)) //获取消息,只要消息类型不为WM_QUIT,返回值是非零值
{
TranslateMessgae(&msg); //翻译消息
DispatchMessage(&msg); //分发消息到窗口过程
}
- 窗口过程
窗口过程在处理消息时,必须返回0。窗口过程不予处理的所有消息应该被DefWindowProc函数处理
LRESULT CALLBACK WinProctor(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
SendMessage(...);//程序可以直接调用自己的窗口过程
总结:窗口过程与一个窗口类相关联,窗口类是程序调用RegisterClass注册的。基于该类创建的窗口使用这个窗口过程来处理窗口的所有消息。Windows通过调用窗口过程来给窗口发送一个消息
窗口消息
WM_PAINT
该消息使得客户区域重绘,以下几种情况会导致客户区域重绘,即产生WM_PAINT消息。
1、UpdateWindow(hwnd);
2、放大或者是缩小窗口(窗口类风格具有CS_HREDRAW,CS_VREDRAW)。
3、窗口最小化后,再复原。
4、窗口被其他窗口覆盖后,再复原。
5、使用ScrollWindow或ScrollDC函数滚动客户区的一部分。
6、使用InvalidateRect或InvalidateRgn函数显示产生WM_PAINT消息。WM_DESTROY
该消息使得窗口清除关闭。一般在获取该消息后,添加PostQuitMessage(0); 即,在消息队列中添加一条WM_QUIT消息。上文提到,消息循环中当遇到WM_QUIT消息后,就退出循环,结束程序。