WTL消息循环机制实现了消息过滤和空闲处理机制。
消息过滤
首先看一下CMessageLoop的核心逻辑CMessageLoop.Run()的代码:
首先看一下CMessageLoop的核心逻辑CMessageLoop.Run()的代码:
int CMessageLoop.Run() { BOOL bDoIdle = TRUE; int nIdleCount = 0; BOOL bRet; for(;;) { while(!::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE) && bDoIdle) { if(!OnIdle(nIdleCount++)) bDoIdle = FALSE; } bRet = ::GetMessage(&m_msg, NULL, 0, 0); if(bRet == -1) { ATLTRACE2(atlTraceUI, 0, _T("::GetMessage returned -1 (error)/n")); continue; // error, don't process } else if(!bRet) { ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting/n")); break; // WM_QUIT, exit message loop } if(!PreTranslateMessage(&m_msg)) { ::T |