2015-10-06 21 views
0

我正在閱讀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上我的實驗

回答

4

你的問題沒有引起太大的意義。您不希望按下編輯控件中的左側或右側光標鍵將焦點移至另一個控件,因爲編輯控件本身會消耗該按鍵以便移動光標。

內部對話框管理器使用GetNextDlgGroupItem()將焦點轉移到組中的下一個或上一個控件。這不區分控制類型 - 它只看WS_GROUP風格。但是,如果控件本身不消耗密鑰,則對話管理器只會調用此函數,這由控件對WM_GETDLGCODE消息的響應決定。

+0

太好了。 ''WM_GETDLGCODE''是我期待的答案。我只是很好奇Windows DefDlgProc如何按照Petzold的書的方式工作。所以,Windows正在採用一種非常通用的方式來完成它的行爲。 –

相關問題