第三章 窗口和消息
窗口创建的四个步骤
设计窗口
注册窗口
创建窗口
显示和更新窗口
LoadIcon() 在取得预定义图示的句柄,可以将第一个参数设定为NULL。在加载自定义图标是,这个参数应该被设定为执行实体句柄。
Typedef stuct tagMSG
{
HWND hwnd;//接收消息的窗口
UINT message;//接收到的消息ID
WPARAM wParam;
LPARAM lParam;
DWORD time;//消息放入消息队列中的时间
POINT pt;//消息放入消息队列时的鼠标坐标
}
MSG,*PMSG
只要从消息队列中取出消息的message字段不为WM_QUIT,GetMessage就传回一个非零值。WM_QUIT消息导致GetMessage传回0。
TranslateMessage(&msg);//将msg结构传给windows,进行一些键盘转换。
该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或
PeekMessage时被读出。
DispatchMessage(&msg);//又将msg结构回传给windows。
该函数分发一个消息给窗口程序,通常消息从GetMessage函数获得。消息被分发到回调函数,作用是消息传递给操作系统,然后操作系统去调用我们的回调函数。
处理完消息之后,wndproc传回windows,此时,windows还停留在DispatchMessage中。
WM_PAINT
在移动窗口以致其相互重叠时,windows不保存一个窗口中被另一个窗口所掩盖的内容,在这一部分不在被遮盖之后,它就被标志为无效。窗口消息处理程序接收到一条WM_PAINT消息,以更新窗口内容。
该消息是一个无效区域变得有效。
对于WM_PAINT的处理几乎总是从一个BeginPaint开始,EndPaint结束。
队列化消息与非队列化消息
队列化的消息被发送给消息队列,而非队列化的消息则发送给窗口消息处理程序。