欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
PreTranslateMessage作用和使用方法
http://blog.csdn.net/danforn/archive/2008/04/18/2304412.aspx
PreTranslateMessage作用和使用方法           by深邃天空藍色海洋
PreTranslateMessage是消息在送給TranslateMessage函數之前被調用的,絕大多數本窗口的消息都要通過(guò)這里,比較常用,當需要在MFC之前處理某些消息時(shí),常常要在這里添加代碼.
MFC消息控制流最具特色的地方是CWnd類(lèi)的虛擬函數PreTranslateMessage(),通過(guò)重載這個(gè)函數,可以改變MFC的消息控制流程,甚至可以作一個(gè)全新的控制流出來(lái)。只有穿過(guò)消息隊列的消息才受PreTranslateMessage()影響,采用SendMessage()或其他類(lèi)似的方式向窗口直接發(fā)送的而不經(jīng)過(guò)消息隊列的消息根本不會(huì )理睬PreTranslateMessage()的存在。
是否調用TranslateMessage()和DispatchMessage()是由一個(gè)名稱(chēng)為PreTranslateMessage()函數的返回值決定的,如果該函數返回TRUE,則不會(huì )把該消息分發(fā)給窗口函數處理。
傳給PreTranslateMessage()的消息是未經(jīng)翻譯過(guò)的消息,它沒(méi)有經(jīng)過(guò)TranslateMessage()處理??梢栽谠摵瘮抵惺褂?pMsg->wParam==VK_RETURN)來(lái)攔截回車(chē)鍵。wParam中存放的是鍵盤(pán)上字符的虛擬碼。
PeekMessage和GetMessage的區別:
GetMessage在沒(méi)有消息的時(shí)候等待消息,cpu當然低   PeekMessage沒(méi)有消息的時(shí)候立刻返回,所以cpu占用率高。   因為游戲不能靠windows消息驅動(dòng),所以要用PeekMessage();
PretranslateMessage的實(shí)現,不得不談到MFC消息循環(huán)的實(shí)現。MFC通過(guò)CWinApp類(lèi)中的Pumpmessage函數實(shí)現消息循環(huán),但是實(shí)際的消息循環(huán)代碼位于CWinThread中,CWinApp只是從CWinThread繼承過(guò)來(lái)。其簡(jiǎn)化后的代碼大概如下:
BOOL CWinThread::PumpMessage()
{
_AFX_THREAD_STATE *pState = AfxGetThreadState();
::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL))
if (!AfxPreTranslateMessage(&(pState->m_msgCur)))
{
::TranslateMessage(&(pState->m_msgCur));
::DispatchMessage(&(pState->m_msgCur));
}
return TRUE;
}
可以看到,PumpMessage在實(shí)際的TranslateMessage和DispatchMessage發(fā)生之前會(huì )調用AfxPreTranslateMessage,AfxPreTranslateMessage又會(huì )調用CWnd::WalkPreTranslateTree(雖然也會(huì )調用其他函數,但是這個(gè)最為關(guān)鍵),其代碼如下:
BOOL PASCAL CWnd::WalkPreTranslateTree(HWND hWndStop, MSG* pMsg)
{
ASSERT(hWndStop == NULL || ::IsWindow(hWndStop));
ASSERT(pMsg != NULL);
// walk from the target window up to the hWndStop window checking
// if any window wants to translate this message
for (HWND hWnd = pMsg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd))
{
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
if (pWnd != NULL)
{
// target window is a C window
if (pWnd->PreTranslateMessage(pMsg))
return TRUE; // trapped by target window (eg: accelerators)
}
// got to hWndStop window without interest
if (hWnd == hWndStop)
break;
}
return FALSE; // no special processing
}
可以看到,代碼還是很直接的。從接受到消息的窗口層層往上遍歷,并調用PretranslateMessage看是否返回TRUE,是則結束,否則繼續。
這里有一個(gè)地方非常關(guān)鍵:CWnd *pWnd = CWnd::FromHandlePermanent(hWnd) 這一句代碼從當前AfxModuleThreadState拿到Permanent句柄表,從而找到hWnd對應的CWnd
MFC中PreTranslateMessage是GetMessage(...)函數的下一級操作,即GetMessage(...)從消息隊列中獲取消息后,交由PreTranslateMessage( )處理,若其返回FALSE則再交給TranslateMessage和DispatchMessage處理(進(jìn)入WindowProc);
如果用SendMessage,   則消息直接交到WindowProc處理,所以GetMessage不會(huì )取得SendMessage的消息,當然PreTranslateMessage也就不會(huì )被調用。
如果用PostMessage,則消息進(jìn)入消息隊列,由GetMessage取得,PreTranslateMessage就有機會(huì )進(jìn)行處理。
發(fā)表于 @ 2008年04月18日 15:01:00
(#)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Windows消息機制的流程及PreTranslateMessage作用和使用方法
MFC 自繪
GetDlgItem
VC進(jìn)程間通信之消息傳遞PostMessge()或SendMessage()
MFC程序逆向 – 消息篇(上)[轉自看雪]
BBSHARE - VisualC++ - [轉帖]深入探討MFC消息循環(huán)和消息泵 - powered by Discuz!
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久