在Dialog中button與回車鍵

2021-07-10 14:04:14 字數 2689 閱讀 9051

1,  如果該dialog中,某個button擁有focus,則敲回車鍵時會響應該按鈕;

注:button擁有focus的方法:

(a)使用tab鍵切換到某按鈕;

(b)在建立dialog時設定tab order,把某一button的tab順序設為1,則該dialog初始時,這個button擁有focus;(開啟資源(.rc)檔案,可以發現得到焦點的按鈕總是在最前面)

(c)但是,如果在程式**中 用setfocus()設定某一按鈕擁有focus,再敲回車鍵,該按鈕不能被響應,不知為何?!

2,  如果該dialog中,沒有任何button擁有focus,但是該dialog有default button,則敲回車鍵時會響應該default button;

例如當前的focus在edit控制項上,則此時回車 會響應default button。

一般來講,每個dialog都應該設有乙個default button,且該button最好沒有傷害性(比如刪除、儲存操作);

注:所謂default button,其表現為,在dialog中如果focus不在任何按鈕上,則default button 為黑邊。

3,  如果該dialog中,沒有任何button擁有focus,也沒有default button,則敲回車鍵時:

windows為對話方塊提供了乙個專用的鍵盤介面,專門用於對幾個鍵進行處理,如:

enter鍵,給對話方塊傳送一條wm_command訊息,引數wparam被設定成idok;而esc鍵,給對話方塊傳送一條wm_command的訊息,引數wparam被設定成idcancel。所以敲回車時,會響應idok的處理函式onok(),如果在你的dialog中沒有過載onok(),則會呼叫cdialog::onok(),在這個函式中會呼叫enddialog函式關閉對話方塊。

因此如果想使回車鍵和esc鍵都不關閉對話方塊,則應在你的dialog中過載onok()和oncancel()函式。如下:(方法一)

void cmydlg::onok()

void cmydlg::oncancel()

但是上述方法的缺點時無法用x關閉對話方塊了(可以不過載oncancel()),優點是,當focus在某個button上時,按回車鍵可以響應該button!

// 簡化後的 cwinthread

while (getmessage(...)) else

} cwinthread::pretranslatemessage是個虛函式,在應用中,其預設的實現以相同的名字呼叫另乙個虛函式,cwnd::pretranslatemessage。

所以如果想使回車鍵和esc鍵都不關閉對話方塊,則可以在我們的對話方塊總過載pretranslatemessage,如下:(方法二)

bool cmydlg::pretranslatemessage(msg* pmsg)

else if (pmsg->wparam == vk_escape)

}return cdialog::pretranslatemessage(pmsg);

}上述做法的缺點是:回車鍵徹底無效了,即使某個button擁有focus,按回車也不行去響應他!優點是:可以用x關閉對話方塊!

4,如果想在對話方塊中使用回車鍵,比如使得多個edit控制項響應回車鍵:

首先看一下:

typedef struct tagmsgmsg;

在windows下的程式中,所有的資源都是有唯一標號的,使每個資源物件能唯一的區別於其他資源,所以我們可以通過資源id來對編輯框做出區別,使之完成各自的響應處理。在microsoft visual c++ 6.0下可以通過"view"選單的"id= resource symboles…"查到指定id的資源標識號的實際數值,如在本例中的兩個編輯框idc_edit1和idc_edit2所對應的數值分別為1000和1001,對前面的解析訊息的**做些改動,主要如下所示:

bool cmydialog::pretranslatemessage(msg* pmsg)

if(iid==1001) //第二個編輯框的標識為1001}}

在此通過api函式::getfocus()取得當前游標所處的(即有焦點的)編輯框的控制代碼,然後通過api函式::getdlgctrlid()根據這個控制代碼返回此視窗資源的id 號,該id號是動態獲取的,使之同預先檢視好的編輯框的id作下比較即可區分出是需要哪個編輯框對回車鍵作出響應。

4,  如何解決 某個對話方塊中的child dialog的按鈕擁有focus,但此時回車鍵不能響應它?

問題解釋:此時回車,會產生wm_command訊息,引數是當前擁有focus的按鈕的id,但是由於child dialog沒有訊息迴圈,所以這個訊息被 父dialog截獲。可是,父dialog中並沒有這個button id,所以它也無法響應。(如果父dialog中有這個button id, 則在child dialog中回車會響應父dialog中相同id的button!!)因此,我們要做的是在父dialog無法處理這個訊息的時候,將其返回給child dialog 處理。

示例:bool cparentdialog::oncmdmsg(uint nid, int ncode, void* pextra, afx_cmdhandlerinfo* phandlerinfo)

else if (m_ dlgchild2.iswindowenabled())

else if (m_ dlgchild2.iswindowenabled())

else

return false;

}return true;

}

在Dialog中button與回車鍵

1,如果該dialog中,某個button擁有focus,則敲回車鍵時會響應該按鈕 注 button擁有focus的方法 a 使用tab鍵切換到某按鈕 b 在建立dialog時設定tab order,把某一button的tab順序設為1,則該dialog初始時,這個button擁有focus 開啟資...

在火狐中button標籤與a標籤衝突事件

當我們在button中新增乙個a標籤時,點選button不會點選a,也就是說,button將a覆蓋了。但是在谷歌裡面不會覆蓋 解決方法一 button id btn onclick a.click a id a href value 按鈕 a button 這樣就彌補了火狐的不足,也彌補了空白部分不...

在Dialog中嵌入View的方法

在dialog中嵌入view也沒有想象到的那麼複雜,遵循如下步驟即可。1.create 乙個 child型別的cframewnd,擺正位置。2.正確設定ccreatecontext 3.create 出view與cframewnd關聯 4.show it!看 cwnd pposwnd getdlgi...