青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 224  文章 - 41  trackbacks - 0
<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

享受編程

常用鏈接

留言簿(11)

隨筆分類(159)

隨筆檔案(224)

文章分類(2)

文章檔案(4)

經(jīng)典c++博客

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

原文地址:http://blog.csdn.net/wzyzb/archive/2009/03/05/3959564.aspx
PreTranslateMessage是消息在送給TranslateMessage函數(shù)之前被調(diào)用的,絕大多數(shù)本窗口的消息都要通過這里,比較常用,當(dāng)需要在MFC之前處理某些消息時,常常要在這里添加代碼. 
      

       MFC 消息控制流最具特色的地方是CWnd類的虛擬函數(shù)PreTranslateMessage(),通過重載這個函數(shù),可以改變MFC的消息控制流程,甚至可以作一個全新的控制流出來。只有穿過消息隊列的消息才受PreTranslateMessage()影響,采用SendMessage()或其他類似的方式向窗口直接發(fā)送的而不經(jīng)過消息隊列的消息根本不會理睬PreTranslateMessage()的存在。 

       是否調(diào)用TranslateMessage()和DispatchMessage()是由一個名稱為PreTranslateMessage()函數(shù)的返回值決定的,如果該函數(shù)返回TRUE,則不會把該消息分發(fā)給窗口函數(shù)處理。

傳給PreTranslateMessage()的消息是未經(jīng)翻譯過的消息,它沒有經(jīng)過TranslateMessage()處理??梢栽谠摵瘮?shù)中使用(pMsg->wParam==VK_RETURN)來攔截回車鍵。wParam中存放的是鍵盤上字符的虛擬碼。

PeekMessage和GetMessage的區(qū)別:

GetMessage在沒有消息的時候等待消息,cpu當(dāng)然低

PeekMessage沒有消息的時候立刻返回,所以cpu占用率高。

因為游戲不能靠windows消息驅(qū)動,所以要用PeekMessage();

     PretranslateMessage 的實現(xiàn),不得不談到MFC消息循環(huán)的實現(xiàn)。MFC通過CWinApp類中的Pumpmessage函數(shù)實現(xiàn)消息循環(huán),但是實際的消息循環(huán)代碼位于 CWinThread中,CWinApp只是從CWinThread繼承過來。其簡化后的代碼大概如下:
  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在實際的TranslateMessage和DispatchMessage發(fā)生之前會調(diào)用 AfxPreTranslateMessage,AfxPreTranslateMessage又會調(diào)用 CWnd::WalkPreTranslateTree(雖然也會調(diào)用其他函數(shù),但是這個最為關(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
  }
  
  可以看到,代碼還是很直接的。從接受到消息的窗口層層往上遍歷,并調(diào)用PretranslateMessage看是否返回TRUE,是則結(jié)束,否則繼續(xù)。
  這里有一個地方非常關(guān)鍵:CWnd *pWnd = CWnd::FromHandlePermanent(hWnd) 這一句代碼從當(dāng)前AfxModuleThreadState拿到Permanent句柄表,從而找到hWnd對應(yīng)的CWnd


MFC 中PreTranslateMessage是GetMessage(...)函數(shù)的下一級操作,即GetMessage(...)從消息隊列中獲取消息后,交由PreTranslateMessage()處理,若其返回FALSE則再交給TranslateMessage和 DispatchMessage處理(進入WindowProc);  
如果用SendMessage,   則消息直接交到WindowProc處理,所以GetMessage不會取得SendMessage的消息,當(dāng)然PreTranslateMessage也就不會被調(diào)用。   [Page]
如果用PostMessage,則消息進入消息隊列,由GetMessage取得,PreTranslateMessage就有機會進行處理。

例子:
按Enter,ESC按是不會退出了

BOOL CComboBoxExDlg::PreTranslateMessage(MSG* pMsg)
{
if(WM_KEYDOWN == pMsg->message )
{
UINT nKey = (int) pMsg->wParam; 
if( VK_RETURN == nKey || VK_ESCAPE == nKey )
return TRUE ;
}

return CDialog::PreTranslateMessage(pMsg);
}

編輯框,如何響應(yīng)的這個回車的信息
如果你的編輯框定義如下  
  CEdidt   m_cName;       //ID號為IDC_E_NAME  
   
  BOOL   CSecondDlg::PreTranslateMessage(MSG*   pMsg)    
  {  
  //   TODO:   Add   your   specialized   code   here   and/or   call   class  
   
                if   (pMsg->message==WM_KEYDOWN)  
  {  
          //CWnd   *p=GetDlgItem(IDC_E_NAME);  
  CWnd   *   hWnd=GetFocus();  
  //if(pMsg->wParam==13   &&   pMsg->hwnd==m_cName)  
  if(pMsg->wParam==13   &&   hWnd==&m_cName)  
  {  
  處理函數(shù)  
  return   TRUE;  
  }  
  else  
  {  
                                                          處理函數(shù)  
  }  
  }  
  return   CDialog::PreTranslateMessage(pMsg);  
  }

posted on 2010-01-18 09:22 漂漂 閱讀(2992) 評論(0)  編輯 收藏 引用 所屬分類: 深入vc++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            黄色一区二区三区| 亚洲国产精品久久久久婷婷884| 免费影视亚洲| 欧美三区视频| 亚洲福利视频网| 午夜精品久久久久99热蜜桃导演| 欧美二区在线播放| 久久国产精品久久久久久久久久 | 欧美四级电影网站| 亚洲国产另类精品专区| 久久女同精品一区二区| 午夜亚洲精品| 国产亚洲欧美日韩在线一区 | 亚洲精选一区二区| 欧美激情导航| 日韩网站在线| 日韩写真在线| 国产精品区一区| 欧美在线观看视频在线| 欧美与黑人午夜性猛交久久久| 国产欧美韩日| 久久人91精品久久久久久不卡| 亚洲在线一区二区三区| 国产精品美腿一区在线看| 亚洲欧美国产77777| 亚洲视频香蕉人妖| 国产亚洲视频在线| 免费观看国产成人| 欧美激情小视频| 亚洲一区欧美激情| 午夜精品av| 亚洲第一福利在线观看| 欧美激情a∨在线视频播放| 蜜桃av一区二区| 中文精品一区二区三区| 亚洲私人影院| 国产在线观看一区| 亚洲电影免费| 欧美三级中文字幕在线观看| 欧美一区二区视频观看视频| 欧美在线日韩精品| 亚洲精品久久久久久久久久久久 | 久久日韩粉嫩一区二区三区| 亚洲国产精品va在线看黑人动漫 | 国产精品手机在线| 久久免费国产| 欧美黄免费看| 久久av资源网站| 欧美成熟视频| 久久www成人_看片免费不卡| 欧美综合国产精品久久丁香| 国产精品vvv| 久久精选视频| 欧美大片18| 久久爱www| 欧美成人一区二区三区| 欧美一级黄色网| 欧美大尺度在线| 久久蜜桃av一区精品变态类天堂| 美日韩在线观看| 小黄鸭精品密入口导航| 欧美91大片| 久久人人精品| 国产精品二区影院| 亚洲第一区在线| 国产一区日韩二区欧美三区| 亚洲国产日韩美| 激情成人在线视频| 亚洲性图久久| 亚洲精品色图| 久久本道综合色狠狠五月| 99精品视频一区| 另类春色校园亚洲| 久久国产一二区| 国产精品久久久久久久一区探花| 亚洲国产成人精品久久| 狠狠爱www人成狠狠爱综合网| 在线一区亚洲| 在线视频亚洲| 欧美国产三区| 欧美成人精品三级在线观看| 国产曰批免费观看久久久| 亚洲视频网站在线观看| 亚洲免费成人av电影| 久久综合伊人| 欧美 日韩 国产在线| 一区二区在线观看av| 欧美一区在线视频| 久久精品日韩欧美| 国产一区91| 久久国产福利国产秒拍| 久久精品视频导航| 国产一区二区三区在线观看视频| 午夜性色一区二区三区免费视频| 欧美一区二区在线看| 国产农村妇女精品一二区| 亚洲伊人一本大道中文字幕| 亚洲专区在线| 国产欧美欧美| 性一交一乱一区二区洋洋av| 久久久999精品| 在线观看欧美精品| 欧美成人亚洲成人日韩成人| 91久久久在线| 亚洲一区二区三区四区五区黄| 欧美特黄视频| 亚洲欧美在线一区二区| 久久婷婷激情| 亚洲欧洲精品天堂一级| 欧美久久电影| 日韩亚洲一区二区| 午夜精品久久久| 好吊妞**欧美| 欧美激情91| 亚洲一区三区电影在线观看| 久久国产主播| 亚洲欧洲在线一区| 欧美午夜精品久久久久免费视| 国产情侣久久| 欧美成熟视频| 一区二区三区免费网站| 国产精品一区二区三区四区五区| 午夜欧美精品| 免费视频最近日韩| 一本久道久久综合中文字幕| 欧美性大战久久久久| 欧美一级片一区| 亚洲电影av| 欧美一区二区三区视频在线 | 悠悠资源网亚洲青| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲国产天堂久久综合网| 亚洲一区免费| 136国产福利精品导航网址| 欧美日韩在线精品| 久久久久99| 国产精品99久久久久久久久久久久| 久久久另类综合| 亚洲午夜羞羞片| 亚洲激情另类| 国产色爱av资源综合区| 欧美精品一区二区蜜臀亚洲| 午夜精品久久久久久久男人的天堂 | 美腿丝袜亚洲色图| 亚洲一区二区在线观看视频| 精品1区2区3区4区| 国产精品久久久99| 欧美二区在线看| 欧美在线观看一区二区| 在线视频一区二区| 欧美激情第10页| 久久久久综合网| 先锋影音国产一区| 中文网丁香综合网| 亚洲黄色成人久久久| 国产一区二区三区久久久| 欧美视频一区二区三区| 女主播福利一区| 久久精品一区二区三区中文字幕 | 欧美一区二区三区久久精品茉莉花| 亚洲欧洲在线视频| 免费不卡视频| 久久精品亚洲一区二区| 亚洲综合电影| 99国产精品视频免费观看一公开 | 中文国产成人精品久久一| 亚洲国产精品一区二区尤物区| 国产欧美短视频| 国产精品久久久一区二区三区| 欧美日韩免费一区| 欧美精品一区二区三区高清aⅴ| 久久婷婷麻豆| 久久精品在线播放| 久久精品欧洲| 久久精品国产欧美亚洲人人爽| 欧美刺激性大交免费视频| 亚洲精品一区二区三区婷婷月| 国产日韩欧美91| 国产嫩草一区二区三区在线观看 | 午夜精品久久久久影视| 一区二区三区欧美| 亚洲视频导航| 亚洲综合清纯丝袜自拍| 亚洲欧美中文日韩v在线观看| 亚洲一区欧美激情| 欧美一区二区三区免费看| 午夜视频一区二区| 欧美专区在线| 久久一区二区三区超碰国产精品| 久久精品免费| 麻豆成人在线| 亚洲国产精品专区久久| 91久久久久久久久久久久久| 亚洲人成网站影音先锋播放| 日韩一级片网址| 亚洲欧美综合精品久久成人 | 亚洲欧洲在线观看| 亚洲视频香蕉人妖| 欧美在线视频不卡| 欧美成人精品影院|