窗口程序创建的过程
创建窗口类
1 | WNDCLASS wndclass; |
注册窗口类
1 | RegisterClass(&wndclass); |
创建窗口
1 | hwnd = CreateWindow(...); |
显示窗口
1 | ShowWindow(hwnd,iCmdShow); |
更新窗口
1 | UpdateWindow(hwnd); //产生第一条WM_PATINT消息 |
消息循环
1 | while(GetMessage(&msg,NULL,0,0)) //获取消息,只要消息类型不为WM_QUIT,返回值是非零值 |
窗口过程
窗口过程在处理消息时,必须返回0。窗口过程不予处理的所有消息应该被DefWindowProc函数处理
1 | LRESULT CALLBACK WinProctor(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); |
1 | 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消息后,就退出循环,结束程序。