Windows程序设计基础

窗口程序创建的过程


创建窗口类

1
WNDCLASS wndclass;

注册窗口类

1
RegisterClass(&wndclass);

创建窗口

1
hwnd = CreateWindow(...);

显示窗口

1
ShowWindow(hwnd,iCmdShow);

更新窗口

1
UpdateWindow(hwnd);  //产生第一条WM_PATINT消息

消息循环

1
2
3
4
5
while(GetMessage(&msg,NULL,0,0))  //获取消息,只要消息类型不为WM_QUIT,返回值是非零值
{
TranslateMessgae(&msg); //翻译消息
DispatchMessage(&msg); //分发消息到窗口过程
}

窗口过程

窗口过程在处理消息时,必须返回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消息后,就退出循环,结束程序。