WTL的訊息機制 (轉)
WTL的訊息機制
/">高歌
一、SDI流程
Run全域性執行緒
1、 Module.AddMessageL(&theLoop), 儲存CMessageLoop與一個執行緒id的對應,Module是全域性變數。
2、 wndMain的構造,初始化變數
3、 wndMain的CreateEx
wndMain的Create
註冊視窗類(視窗過程的地址是StartWindowProc)
基類CframeWindowImplBase的Create:namespace prefix = o ns = "urn:schemas--com::office" />
儲存例項的this到_module中_Module.AddCreateWndData(&m_thunk.cd, this);
的CreateWindow
CreateWindow將觸發第一個WM_XXX訊息,從而呼叫StartWindowProc
StartWindowProc主要是初始化一個thunk程式碼,並將視窗過程修改為thunk的開始處,thunk程式碼先將堆疊中儲存HWND的位值中放入this指標,然後用jmp跳到WndProc函式進行處理
4、呼叫wndMain.ShowWindow(nCmdShow);
5、int nRet = theLoop.Run();
6、_Module.RemoveMessageLoop();
執行緒結束
二、訊息迴圈
// theLoop.Run();
int 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) "));
continue; // error, don't process
}
//bRet是0表示收到WM_QUIT
else if(!bRet)
{
ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting "));
break; // WM_QUIT, exit message loop
}
//PreTranslateMessage遍歷CMessageFilter如果有一個則呼叫並返回TRUE
//如果在視窗類中定義這個函式並且加入了filter他將不被髮到視窗過程中去。
//注意這個函式是虛擬函式
if(!PreTranslateMessage(&m_msg))
{
::TranslateMessage(&m_msg);
::DispatchMessage(&m_msg);
}
if(IsIdleMessage(&m_msg))
{
bDoIdle = TRUE;
nIdleCount = 0;
}
}
return (int)m_msg.wParam;
}
三、ProcessMessage
ProcessMessage是一個虛擬函式,由派生類中透過宏定義實現被
WndProc呼叫。
參考文章
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-959093/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- OC訊息機制,訊息轉發機制
- 深度剖析訊息反射機制 (轉)反射
- Windows訊息機制初談 (轉)Windows
- 訊息機制
- iOS 訊息轉發機制Demo解析iOS
- MFC訊息響應機制分析 (轉)
- 分析與理解訊息反射機制 (轉)反射
- 深入VCL 理解BCB的訊息機制 (一) (轉)
- iOS訊息機制iOS
- SAP訊息機制
- Android的訊息機制Android
- WebRTC中的訊息機制Web
- iOS進階之訊息轉發機制iOS
- 訊息機制篇——初識訊息與訊息佇列佇列
- JMS java 訊息機制Java
- Windows訊息機制概述Windows
- Android訊息機制Message訊息池Android
- 【RocketMQ】訊息的刷盤機制MQ
- RabbitMQ訊息佇列(九):Publisher的訊息確認機制MQ佇列
- Rabbitmq可靠訊息投遞,訊息確認機制MQ
- Android訊息傳遞之Handler訊息機制Android
- flutter 訊息傳遞機制Flutter
- android訊息機制—HandlerAndroid
- RabbitMQ 訊息確認機制MQ
- 理解 Android 訊息機制Android
- 重拾 ObjC 訊息機制OBJ
- 簡析Windows訊息機制Windows
- Kafka 訊息儲存機制Kafka
- Android訊息機制HandlerAndroid
- Android 之訊息機制Android
- Handler訊息傳遞機制
- Android的Handler訊息機制 解析Android
- Android非同步訊息機制Android非同步
- Android訊息機制Handler用法Android
- runtime那些事(訊息機制)
- Android 訊息機制詳解Android
- MFC學習(四) 訊息機制
- windows訊息機制與例項Windows