原来的代码
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
这个是能正常关闭的
但我加了个循环后,其它没变动:
while (GetMessage(&msg, NULL, 0, 0))
{
while( msg.message != WM_QUIT )
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
tNow = GetTickCount();
if(tNow-tPre >= 20)
MyPaint(hdc);
}
}
}
while (GetMessage(&msg, NULL, 0, 0))貌似没法检测到 WM_QUIT ,点右上角叉叉关闭只能关掉窗口,调试并没停止,只能强行shift+F5。
请问怎么让改能让其正常关闭
WM_QUIT以后GetMessage就返回0了,直接跳出while
你应该检测WM_DESTROY或者WM_CLOSE,根据你的需要应该是检测WM_DESTROY
点小叉叉所引发的消息链是这样的:
点叉叉,收到一个WM_CLOSE消息,一般这个消息自己不处理,所以送入DefWindowProc,默认的WM_CLOSE处理是送出一个WM_DESTROY消息,然后你收到,这个时候的一般处理是PostQuitMessage,送出一个WM_QUIT消息,GetMessage收到WM_QUIT就返回0,所以while就直接结束了,接下来的逻辑无法完成。
这是MSDN上对GetMessage返回值的解释:
Return Value
If the function retrieves a message other than WM_QUIT, the return value is nonzero.
If the function retrieves the WM_QUIT message, the return value is zero.
If there is an error, the return value is -1. For example, the function fails if hWnd is an invalid window handle or lpMsg is an invalid pointer. To get extended error information, call GetLastError.
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息