MFC處理回車窗口消失

我的方法是:找到自己設計的按鈕,在屬性-風格中選擇default button;
如果沒有自己設計的button,按照以下方法:

默認焦點在確定按鈕上,回車就觸發這個按鈕的OnOK事件,默認按回車是觸發OnOK事件,看看有沒有無效斷點; 註釋掉OnOK();或重設tab鍵順序;取消ONOK的defaultbutton屬性;

一、原因 
        當用戶按下Enter鍵時,Windows就會自動去找輸入焦點落在了哪一個按鈕上,當獲得焦點的按鈕的四周將被點線矩形包圍。如果所有按鈕都沒有獲得輸 入焦點,Windows就會自動去尋找程序或資源所指定的默認按鈕(默認按鈕邊框較粗)。如果對話框沒有默認按鈕,那麼即使對話框中沒有OK按 鈕,OnOK函數也會自動被調用。 我把對話框上面的二個按鈕全刪掉掉,再編譯運行還是按下回車鍵會自動關閉程序啊。mfc 默認響應enter鍵的啊
二、解決辦法 
        爲了使Enter鍵無效,最簡單的辦法就是將CExDlg的OnOK函數寫成空函數,然後針對OK按鈕寫一個新的函數來響應。下面是具體步驟: 
        首先建立一個以Ex爲名的基於對話框的程序。 
        1.用ClassWizard映射IDOK按鈕到OnOK虛函數。 
        在ClassWizard中,從CExDlg的Object   Ids列表中選擇IDOK,然後單擊BN_CLICKED,這樣即產生了OnOK函數的原形和框架。 
        2.利用對話框編輯器改變OK按鈕的ID。 
        選擇OK按鈕,將它的ID由IDOK改爲IDC_OK,並去掉Default   Button屬性的複選標記。這樣OnOK函數即被分離出來。 
        3.用ClassWizard創建一個OnClickedOK成員函數。 
        在ClassWizard中,從CExDlg的Object   Ids列表中選擇IDC_OK,然後單擊BN_CLICKED,函數名用OnClickedOK,產生了OnClickedOK函數的原形和框架。 
        4.編輯代碼。 
        void   CExDlg::OnOK() 
        { 
                //   TODO:   Add   extra   validation   here 
                //   CDialog::OnOK(); 
        } 

        void   CExDlg::OnClickedOk() 
        { 
                //   TODO:   Add   your   control   notification   handler   code   here 
                CDialog::OnOK(); 
        } 
        5.編譯並測試程序。 
        重新編譯程序,然後測試一下Enter鍵,你會發現按下Enter鍵後將沒有任何動作,而單擊OK按鈕則仍然會和以前一樣。 
三、   OnCancel的處理 
        正如Enter鍵可以觸發對OnOK函數的調用一樣,Esc鍵也可以觸發對OnCancel函數的調用。它將導致控制從對話框中退出。不過讀者可以像對OK按鈕一樣處理,通過設置一個無效的OnCancel函數來防止這一情況的出現 
第三個方法 
BOOL   CxxxDlg::PreTranslateMessage(MSG*   pMsg) 

        //   修改回車鍵的操作反應 
        if(pMsg-> message==WM_KEYDOWN   &&   pMsg-> wParam==VK_RETURN) 
        { 
                UINT   nID   =   GetFocus()-> GetDlgCtrlID(); 
                if(ctButton   !=   GetCtrlType(nID)) 
                { 
                        NextDlgCtrl(); 
                        int   nFocusID   =   GetFocus()-> GetDlgCtrlID(); 
                        if(nFocusID   ==   1001) 
                                ((CComboBox*)(GetFocus()-> GetParent()))-> ShowDropDown(); 
                        else   if(ctComboBox   ==   GetCtrlType(nFocusID)) 
                                ((CComboBox*)GetFocus())-> ShowDropDown(); 

                        return   TRUE; 
                } 
        } 
        return   CDialog::PreTranslateMessage(pMsg); 
}

1. 在VC++中如何在對話框函數中獲得edit控件的“按下回車鍵”的消息?

處理WM_KEYDOWN 消息,其中的wParam 爲VK_RETURN 即是回車消息。

case WM_KEYDWON:
{
  if ( VK_RETURN == msg.wParam )
  {
    // 按下回車
    // 獲取焦點句柄
    HWND hFocus = GetFocus();
    if ( hFocus == hEdit )
    {
       // 處理你的邏輯
    }
  }
}
break;

2.我以前的做法是做一個PreTranslateMessage,在裏面裏感應到MSG,是回車就該怎麼樣就怎麼樣,呵呵,現在有個情況,在對整 個Dlg的情況下用PreTranslateMessage判斷回車不太適合,是否有可能從EDIT控件接收到回車就如何如何呢?
有什麼做法?

重寫edit控件並添加 wm_keydown 和wm_char的處理函數能夠攔截普通按鍵消息,但都不能攔截回車消息。
建議你還是使用PreTranslateMessage,具體參考
http://tech.163.com/05/0906/09/1SV5EEQF00091589.html 
這個寫的更簡單些
http://hi.baidu.com/albertdiao/blog/item/3183ab47d0c0182f879473bf.html

3.我的VS2008對話框程序怎麼沒有PreTranslateMessage消息
用類嚮導生成的基於對話框的MFC程序,在屬性的message裏看了。全是WM開頭的。都找了。沒找着。。。汗。。。
怎麼回事?

呵呵,不是在類的message裏面,而是在類的overrides裏面哦…就在classview裏面,不是有兩上類了嗎?點那個對話框類,在“屬性”窗口裏,點“重寫”選項卡,裏面列了所有可以重載的函數。

4.在我用MFC生成的對話框後,用ESC鍵就可以關閉對話框,我的程序不想要這個功能,請教各位,如何去除? 
我嘗試了截取WM_CHAR和WM_KEYDONWN以及WM_SYSKEYDOWN,但都沒有觸發.

一開始的cancel按扭不要去掉,雙擊它加入命令OnCancel(),把OnCancel中調用父類去掉 
直接返回,這就沒問題了 如果你已經把按鈕刪掉,那就得手工加這個命令,但效果一樣

5.你有沒有把文本編輯框屬性裏的want   return選上

//對鍵盤消息控制 
BOOL   CSetupDlg::PreTranslateMessage(MSG*   pMsg)   

if   (pMsg-> message==UM_RETURN) 

//讓組合框響應回車獲取文本 
GetComboEditText(); 

//處理回車消息 
if   (pMsg-> message==WM_KEYDOWN   &&   pMsg-> wParam==VK_RETURN) 

//響應回車爲tab鍵 
pMsg-> wParam=VK_TAB; 


return   CDialog::PreTranslateMessage(pMsg); 

ES_WANTRETURN風格只對multiple-line的Edit纔有效。還是用wade_vc(我命由我不由天)的方法,在PreTranslateMessage函數中處理

註明:轉自http://blog.csdn.net/bing_bing/archive/2011/03/18/6258636.aspx

MFC::
CWnd *pWnd = GetFocus(); 
if(pWnd == NULL)
;//no focus
else
UINT nID = pWnd->GetDlgCtrlID();

SDK:
HWND hWnd = ::GetFocus();
if(hWnd == NULL)
;//no focus 
else
UINT nID = ::GetDlgCtrlID(hWnd);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章