WS_GROUP,dialogbox-manager-WndProc和标准控件之间的任何秘密协议?

时间:2015-10-06 04:24:58

标签: winapi win32gui

我正在阅读Charles Petzold Programming Windows 5th-ed,Chapter 11,“Tabs Stops and Groups”部分。我现在有一个很大的问题。

该书说,当某些控件属于同一组时,您可以使用左/右箭头键在它们之间切换焦点,此功能最常用于一组无线电盒。但是其他类型的控制呢?

我尝试将3个按钮控件组合在一起(A,B,C,只有A有WS_GROUP,B和C没有)。然后,我可以确认左/右箭头可以在A,B和C之间切换焦点。

更仔细地观察它,我看到收音机盒和按钮之间的区别 [P1]

  • 对于单选框组,重复按左/右箭头将在该组中的所有单选框之间循环对焦。
  • 对于按钮组,反复按右箭头将使焦点移动并停在按钮C处,同样的左箭头使其停在A处,没有循环行为。

“编辑”控件的情况 [P2] :如果我在一个组中制作3个编辑框,按左/右箭头将永远不会切换焦点,这与行为不同按钮组。

所以,我的问题归结为: Windows内部对话框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上进行实验。

1 个答案:

答案 0 :(得分:4)

你的问题没有意义。您不希望在编辑控件中按左或右光标键将焦点移动到另一个控件,因为编辑控件本身会使用该按键来移动光标。

对话管理器在内部使用GetNextDlgGroupItem()将焦点转移到组中的下一个或上一个控件。这并没有区分控件类型 - 它只关注WS_GROUP样式。但是,如果控件本身不使用密钥,则对话管理器仅调用此函数,这取决于控件对WM_GETDLGCODE消息的响应。