1625-5 王子昂 总结《2018年1月3日》 【连续第460天总结】
A. SDK基础知识
B.
窗口结构体
创建窗口之前要初始化窗口结构体
WNDCLASS wndclass;
最关键的参数是窗口类型名spszClassName
操作系统通过窗口的类名来区分不同的窗口
创建之前进行注册
RegisterClass(&wndclass);
然后就可以用CreateWindow()创建并用ShowWindow()显示窗口了
消息循环
while(GetMessage(&msg, NULL, 0, 0))
{
TranslagetMessage(&msg);
DispatchMessage(&msg);
}
GetMessage的第二个参数为窗口句柄,因此每个GetMessage构成的消息循环都只针对一个窗口
换言之,一个应用程序如果拥有多个窗口,那么就会有多个消息循环
另外,如果多个窗口不属于同一注册类型的窗口,即窗口类名不同,那么该应用程序就会有多个窗口过程函数
GetMessage分为三种情况:
1. 取到WM_QUIT时,返回值为0,则退出消息循环
2. 如果消息队列中没有消息,则该线程将挂起,等待消息
3. 如果接到消息,将调用TranslateMessage来转换消息
Translate将两个或以上的虚拟键值转换为更确定的字符消息,即将WM_KEYDOWN、WM_KEYUP转换为WM_CHAR消息。例如在菜单项上左键按下和左键弹起两个消息会被转换为菜单消息WM_COMMAND
DispatchMessage会将消息分派给操作系统。操作系统来调用窗口过程函数进行处理消息。
窗口过程函数
窗口过程函数WndProc通过结构体来注册
wndclass.lpfnWndProc = WndProc;
在窗口过程函数中通过switch…case…结构来处理消息
原型为LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
第一个参数为句柄,第二个为消息值,第三、四个参数则是消息附加信息
值得一提的消息有以下3个
1. WM_CREATE
窗口创建成功,还没有显示之前就会响应WM_CREATE消息
2. WM_PAINT
窗口重绘消息。当窗口大小、位置、显示内容等发生改变时,会向窗口的消息队列中投递一个WM_PAINT消息,要求窗口重绘
3. WM_DESTROY
在关闭窗口时调用DestroyWindows函数后,会向窗口的消息队列投递一个WM_DESTROY消息。在响应该消息时调用PostQuitMessage函数,向消息队列中投递一个WM_QUIT消息来终止消息循环
C. 明日计划
看书