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

隨筆 - 224  文章 - 41  trackbacks - 0
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

享受編程

常用鏈接

留言簿(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之前處理某些消息時(shí),常常要在這里添加代碼. 
      

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

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

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

PeekMessage和GetMessage的區(qū)別:

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

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

因?yàn)橛螒虿荒芸縲indows消息驅(qū)動(dòng),所以要用PeekMessage();

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


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

例子:
按Enter,ESC按是不會(huì)退出了

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)的這個(gè)回車的信息
如果你的編輯框定義如下  
  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 漂漂 閱讀(3001) 評論(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>
            亚洲欧美日韩爽爽影院| 久久久久一本一区二区青青蜜月| 欧美在线视频在线播放完整版免费观看| 亚洲电影在线观看| 午夜精品一区二区三区在线视 | 国产精品福利av| 亚洲国产精品一区二区第一页| 国产精品婷婷午夜在线观看| 亚洲精品色婷婷福利天堂| 亚洲第一视频| 久久久久**毛片大全| 久久不射电影网| 国产精品日韩一区二区| 亚洲精品久久| 一区二区三区不卡视频在线观看| 欧美国产视频一区二区| 欧美大片在线观看| 亚洲国产午夜| 六月婷婷久久| 91久久国产综合久久| 亚洲黄色免费电影| 久久午夜精品一区二区| 久久综合色播五月| 今天的高清视频免费播放成人| 欧美一区91| 裸体素人女欧美日韩| 精品91在线| 免费看亚洲片| 亚洲欧洲综合另类| 99精品黄色片免费大全| 欧美日韩伦理在线| 亚洲少妇自拍| 久久九九久久九九| 激情六月综合| 欧美电影免费观看高清完整版| 欧美激情偷拍| 亚洲视频综合| 国产精品日本精品| 久久国产精品99精品国产| 欧美成人精精品一区二区频| 亚洲国产乱码最新视频| 欧美精品xxxxbbbb| 亚洲一区二区三区免费视频 | 美女精品在线观看| 亚洲国产精品嫩草影院| 欧美日韩国产小视频| 亚洲午夜精品网| 久久久久久久综合日本| 亚洲激情中文1区| 国产精品高潮呻吟| 久久大逼视频| 亚洲日韩视频| 久久久国产视频91| 日韩午夜电影| 国产酒店精品激情| 另类亚洲自拍| 亚洲一二三区精品| 免费成人激情视频| 亚洲午夜一二三区视频| 国内精品久久久久久久影视蜜臀| 欧美成人亚洲成人| 亚洲欧美亚洲| 亚洲国产欧美日韩精品| 羞羞视频在线观看欧美| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美久久久久久蜜桃| 性感少妇一区| 一区二区久久| 亚洲高清资源综合久久精品| 欧美一区二区三区婷婷月色| 亚洲精品在线电影| 国产综合精品一区| 欧美日韩高清在线播放| 久久久高清一区二区三区| av成人免费观看| 欧美激情亚洲一区| 久久成人免费网| 亚洲综合色激情五月| 最新国产拍偷乱拍精品| 韩国福利一区| 亚洲电影免费观看高清完整版在线观看 | 欧美日韩精品一区二区| 欧美在线一区二区三区| 中文日韩电影网站| 亚洲日本乱码在线观看| 麻豆精品在线观看| 欧美一区高清| 亚洲欧美影音先锋| 一区二区日韩伦理片| 亚洲日韩欧美视频一区| 韩曰欧美视频免费观看| 国产欧美精品va在线观看| 欧美日韩在线视频一区二区| 暖暖成人免费视频| 久久午夜影视| 久久久久久久久久久成人| 欧美一级视频| 亚洲欧美在线播放| 午夜国产不卡在线观看视频| 亚洲精品在线免费| 亚洲日本欧美在线| 亚洲精品久久视频| 亚洲美女视频在线免费观看| 亚洲精品一二三区| 亚洲美女少妇无套啪啪呻吟| 亚洲美女在线视频| 亚洲作爱视频| 在线一区免费观看| 亚洲综合色丁香婷婷六月图片| 99国产欧美久久久精品| 一本色道久久综合狠狠躁的推荐| 亚洲精品一区二区三| 一区二区三区国产精华| 亚洲天堂av电影| 欧美一级黄色网| 久久久www| 欧美 日韩 国产精品免费观看| 老司机一区二区三区| 欧美不卡在线| 欧美视频免费在线观看| 国产精品免费看| 国产日韩欧美视频在线| 黄色精品一区二区| 91久久精品国产| 正在播放亚洲一区| 欧美一区二区成人6969| 久久综合狠狠综合久久激情| 免费人成网站在线观看欧美高清 | 亚洲伊人久久综合| 欧美一激情一区二区三区| 久久久久久久综合日本| 欧美激情亚洲激情| 国产精品久久一卡二卡| 精品成人一区二区三区| 亚洲精选视频免费看| 亚洲一区二区三区免费观看| 久久精品视频在线看| 欧美高清在线观看| 亚洲午夜久久久久久久久电影网| 久久成人亚洲| 欧美日韩视频在线第一区| 国产欧美日韩激情| 亚洲久久一区| 久久精品电影| 亚洲人成高清| 久久电影一区| 欧美四级伦理在线| 在线日韩一区二区| 亚洲伊人一本大道中文字幕| 美国成人直播| 亚洲少妇在线| 欧美国产精品| 一区二区三区在线观看视频| 一区二区日韩欧美| 蜜桃久久精品乱码一区二区| 一区二区三区福利| 免播放器亚洲一区| 国产情人节一区| 亚洲少妇中出一区| 免费日韩一区二区| 性欧美办公室18xxxxhd| 欧美日韩免费| 亚洲精一区二区三区| 久久久久一区二区| 亚洲欧美文学| 国产精品久久久久天堂| 日韩亚洲一区二区| 欧美成人官网二区| 久久久999精品视频| 国产精品永久免费在线| 99视频在线观看一区三区| 欧美+亚洲+精品+三区| 小黄鸭精品密入口导航| 国产精品欧美经典| 亚洲一区二区在线免费观看视频 | 亚洲午夜高清视频| 欧美国产日韩一二三区| 久久成人免费电影| 国产午夜一区二区三区| 欧美一区二区三区在线观看视频| 日韩亚洲欧美一区| 欧美另类高清视频在线| 日韩视频永久免费| 欧美黄色aa电影| 久久综合色一综合色88| 亚洲福利视频一区| 蜜乳av另类精品一区二区| 久久精品视频99| 国自产拍偷拍福利精品免费一| 久久福利精品| 欧美制服丝袜第一页| 国产亚洲精品bv在线观看| 久久精品国产91精品亚洲| 亚洲欧美国产毛片在线| 国产欧美视频一区二区三区| 欧美尤物巨大精品爽| 欧美在线free| 在线视频国内自拍亚洲视频| 欧美国产亚洲精品久久久8v| 欧美岛国激情|