MFC處理回車視窗消失

2021-06-20 21:59:20 字數 2884 閱讀 6023

我的方法是:找到自己設計的按鈕,在屬性-風格中選擇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() 

void   cexdlg::onclickedok() 

5.編譯並測試程式。 

重新編譯程式,然後測試一下enter鍵,你會發現按下enter鍵後將沒有任何動作,而單擊ok按鈕則仍然會和以前一樣。 

三、   oncancel的處理 

正如enter鍵可以觸發對onok函式的呼叫一樣,esc鍵也可以觸發對oncancel函式的呼叫。它將導致控制從對話方塊中退出。不過讀者可以像對ok按鈕一樣處理,通過設定乙個無效的oncancel函式來防止這一情況的出現 

第三個方法 

bool   c***dlg::pretranslatemessage(msg*   pmsg)  } 

return   cdialog::pretranslatemessage(pmsg); 

}1. 在vc++中如何在對話方塊函式中獲得edit控制項的「按下回車鍵」的訊息?

處理wm_keydown 訊息,其中的wparam 為vk_return 即是回車訊息。

case wm_keydwon:}}

break;

2.我以前的做法是做乙個pretranslatemessage,在裡面裡感應到msg,是回車就該怎麼樣就怎麼樣,呵呵,現在有個情況,在對整 個dlg的情況下用pretranslatemessage判斷回車不太適合,是否有可能從edit控制項接收到回車就如何如何呢?

有什麼做法?

重寫edit控制項並新增 wm_keydown 和wm_char的處理函式能夠攔截普通按鍵訊息,但都不能攔截回車訊息。

建議你還是使用pretranslatemessage,具體參考

這個寫的更簡單些

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==wm_keydown   &&   pmsg-> wparam==vk_return) 

return   cdialog::pretranslatemessage(pmsg); 

} es_wantreturn風格只對multiple-line的edit才有效。還是用wade_vc(我命由我不由天)的方法,在pretranslatemessage函式中處理

註明:**

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);

MFC處理回車視窗消失

我的方法是 找到自己設計的按鈕,在屬性 風格中選擇default button 如果沒有自己設計的button,按照以下方法 預設焦點在確定按鈕上,回車就觸發這個按鈕的onok事件,預設按回車是觸發onok事件,看看有沒有無效斷點 注釋掉onok 或重設tab鍵順序 取消onok的defaultbu...

mfc按鈕名稱怎麼換行 MFC處理回車視窗消失

我的方法是 找到自己設計的按鈕,在屬性 風格中選擇default button 如果沒有自己設計的button,按照以下方法 預設焦點在確定按鈕上,回車就觸發這個按鈕的onok事件,預設按回車是觸發onok事件,看看有沒有無效斷點 注釋掉onok 或重設tab鍵順序 取消onok的defaultbu...

MFC視窗程式exc和回車關閉視窗解決辦法

mfc對話方塊程式 遮蔽esc和enter鍵關閉對話方塊的方法 或許還有其它更好的辦法,但下面這個肯定有用,主要就是過載pretranslatemessage 函式,在這個函式裡捕捉esc和enter鍵按下時的訊息,然後什麼都不做,或是新增 完成你自己想要實現的功能。1.完全遮蔽esc鍵與enter...