《白手起家 Win32SDK 应用程序》第 8 篇 关闭窗口的同时退
出程序
第 8 篇 关闭窗口的同时退出程序
白云小飞
还记得上篇中最后说到一个问题吗?当我们关闭程序窗口时,窗口确实是关闭了,可是
程序并没有退出啊。为什么呢???
一. 理解程序的退出条件:
首先,我们要先明白程序退出的条件,看上篇中的这段代码:
while(GetMessage(&msg, NULL, 0, 0)) //获取一个消息,成功后会放在 msg 中。
{
TranslateMessage(&msg); //消息进行必要的预处理转换。
DispatchMessage(&msg); //调用 WinProc 回调函数,将 msg 传递给 WinProc 函数
}
如果程序一直在这个消息循环中,程序就没能退出。只有当 GetMessage 收到一个
WM_QUIT 的消息,则返回值才会为零,退出循环,程序得以结束。(这个道理应该好理
解吧?)
二. 点关闭按钮时,发生了什么
当我们点窗口右上角的关闭按钮时,到底发生了什么事呢?(请边看源代码,边体会下
面的分析噢!)
第一. 它并没有(或最终没有导致)发出 WM_QUIT 的消息。因此 GetMessage 函数
不会收到 WM_QUIT 消息,就没法跳出循环了。(那么又产生了什么消息呢?)
第二. 点关闭按钮时,产生 WM_CLOSE 的消息。GetMessage 会收到 WM_CLOSE 消
息的 MSG 结构信息。
第三. 按前篇所述的消息处理流程可知:DespatchMessage 会调用 WinProc 回调函数,
并把 WM_CLOSE 消息的相关信息传递给 WinProc 函数参数中。
第四. 现在我们的 WinProc 里只有一句:
LRESULT CALLBACK WinProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
//这里可以添加你的消息处理代码
return DefWindowProc(hwnd, msg, wparam, lparam);
}
它将 WM_CLOSE 继续传递给缺省窗口过程函数 DefWindowProc。
第五. 在 DefWindowProc 函数里,判断是 WM_CLOSE 消息后,就会对参数 hwnd 所
代表的窗口进行销毁。(看吧,销毁窗口的事也是由 DefWindowProc 来完成了。)
第六. 成功销毁窗口后,DefWindowProc 里接着还会发一个 WM_DESTROY 的消息到
消息队列中(表示说窗口已经被销毁了)。然后 DefWindowProc 函数才结束。