我正在閱讀Charles Petzold 編程Windows第5版,第11章「選項卡停止和組」部分。我現在有一個很大的問題。本書說,當某些控件屬於同一組時,可以使用左/右箭頭鍵切換它們之間的焦點,而且此功能通常用於一組收音機框。但是其他類型的控件呢?我試着將3個按鈕控件組合在一起(A,B,C,只有A有WS_GROUP,B和C不)。然後,我可以證實左/右箭頭可以A,B和C.WS_GROUP,dialogbox-manager-WndProc和標準控件之間的任何祕密協議?
之間切換焦點更仔細地觀察它,我看到無線電框和按鈕[P1]之間差:
- 對於無線電盒組,反覆按左/右箭頭將在該組中的所有無線電盒之間循環聚焦。
- 對於按鈕組,反覆按右箭頭將焦點移動並停在按鈕C處,同一個左箭頭停在A處,沒有循環行爲。
爲「編輯」控制的情況下[P2]:如果我在一組使3個編輯框,按壓左/右箭頭將永遠不會切換焦點,這是不相同的行爲作爲按鈕組。
所以,我的問題歸結爲:窗戶內部對話框mananger WndProc(只是稱之爲DefDlgProc)專門處理某些類型的控件(如「編輯」)?例如,如果DefDlgProc發現帶有VK_RIGHT的WM_KEYDOWN消息用於「編輯」控件,它將永遠不會採用焦點切換操作,而是將消息傳遞給編輯控件。
是以硬編碼方式還是某種通用的可配置方式完成的特殊處理?我需要知道它,因爲如果我編寫我自己的自定義編輯框控件,我需要一種方法讓DefDlgProc專門爲我的控件處理箭頭鍵,對吧?
示例代碼:對於3-編輯實驗,我用.RC聲明是這樣的:
ABOUTBOX DIALOGEX 32, 32, 180, 100
STYLE DS_MODALFRAME | WS_POPUP
EXSTYLE WS_EX_STATICEDGE
FONT 8, "Tahoma"
BEGIN
EDITTEXT IDC_EDIT0,40,7,40,14, ES_AUTOHSCROLL| WS_GROUP ,WS_EX_CLIENTEDGE
EDITTEXT IDC_EDIT1,90,7,40,14, ES_AUTOHSCROLL ,WS_EX_CLIENTEDGE
EDITTEXT IDC_EDIT2,133,7,40,14,ES_AUTOHSCROLL
CONTROL "OOKK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,7,63,166, 30
ICON "ABOUT3",IDC_STATIC,7,7,20,20
END
這樣在Windows 7上我的實驗
太好了。 ''WM_GETDLGCODE''是我期待的答案。我只是很好奇Windows DefDlgProc如何按照Petzold的書的方式工作。所以,Windows正在採用一種非常通用的方式來完成它的行爲。 –