PeekMessage返回TRUE的条件是有消息,如果没有消息返回FALSE。
GetMessage返回TRUE的条件是有消息且该消息不为WM_QUIT。返回FALSE的条件是有消息且该消息为WM_QUIT。
另外再明确三个消息的区别:
WM_CLOSE,WM_DESTROY,WM_QUIT
WM_CLOSE:一个窗口被关闭时发出的消息,被关闭时通常需要有“提醒用户保存”等操作。
WM_DESTROY:窗口正在关闭时发出的消息,这时候窗口已经从视觉上消失,应用程序在没有窗口的条件下运行。
WM_QUIT:应用程序结束时发出的消息,一般可以看成进程被kill的情况。
我们关闭一个程序的过程是这样的:
发送WM_CLOSE,然后调用DestroyWindow函数,调用DestroyWindow函数时系统会向程序发送WM_DESTROY消息,WM_DESTROY消息调用PostQuitMessage函数,发送WM_QUIT消息。终止整个进程。
程序通常这样写:
while( GetMessage(&msg,0,0,0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
while( TRUE )
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE) == TRUE )
{
if(msg.message == WM_QUIT )
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
}
}
switch(uMsg)
{
caseWM_CLOSE:
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
default:
break;
}