程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [MFC]解決回車鍵 ESC 默認關閉窗口的一般方法,mfcesc

[MFC]解決回車鍵 ESC 默認關閉窗口的一般方法,mfcesc

編輯:C++入門知識

[MFC]解決回車鍵 ESC 默認關閉窗口的一般方法,mfcesc


在一般情況下編寫的對話框程序,用戶在運行的時候,如果不注意按下了ENTER或者ESC鍵,程序就會立刻退出,之所以會這樣,是因為按下Enter鍵時,Windows就會自動去找輸入焦點落在了哪一個按鈕上,當獲得焦點的按鈕的四周將被點線矩形包圍。如果所有按鈕都沒有獲得輸入焦點,Windows 就會自動去尋找程序或資源所指定的默認按鈕(默認按鈕邊框較粗)。如果對話框沒有默認按鈕,那麼即使對話框中沒有OK按鈕,OnOK函數也會自動被調用,對於一個普通的對話框程序來說,OnOK函數的調用,以為著程序會立刻退出。為了使Enter鍵無效,最簡單的辦法就是將CExDlg的OnOK函數寫成空函數,然後針對OK按鈕寫一個新的函數來響應。ESC鍵的原理也是如此,它是默認和OnCancel函數映射在一起的。對於ESC鍵,需要自己重載 CDialog類的PreTranslateMessage函數,當發現是ESC鍵的時候,過濾掉這個消息或者是替換掉這個消息。

以下是簡單的代碼示例:  

   
  【方法1】  
  可以先重載OnOK函數  
  voidCTestDlg::OnOK()  
  {     //裡面什麼也不寫}  
   
  然後重載PreTranslateMessage函數  
  把ESC鍵的消息,用RETURN鍵的消息替換,這樣,按ESC的時候,也會執行剛才的OnOK函數,這樣問題就可以解決了。  
   
  BOOL   CxxxDlg::PreTranslateMessage(MSG*   pMsg)    
  {  
    if(pMsg->message==WM_KEYDOWN   &&   pMsg->wParam==VK_ESCAPE)    
    {    
    pMsg->wParam=VK_RETURN;   //將ESC鍵的消息替換為回車鍵的消息,這樣,按ESC的時候  
                                                                                      //也會去調用OnOK函數,而OnOK什麼也不做,這樣ESC也被屏蔽  
      }    
    return   CDialog::PreTranslateMessage(pMsg);  
   
  }  
   
  【方法2】  
   
  直接在重載的PreTranslateMessage函數中屏蔽回車和ESC的消息,和以上方法大同小異:  
   
  BOOL   CxxxDlg::PreTranslateMessage(MSG*   pMsg)    
  {  
    if(pMsg->message==WM_KEYDOWN   &&   pMsg->wParam==VK_ESCAPE)     return   TRUE;  
    if(pMsg->message==WM_KEYDOWN   &&   pMsg->wParam==VK_RETURN)   return   TRUE;    
    else    
          return   CDialog::PreTranslateMessage(pMsg);  
  }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved