WS_GROUP,dialogbox-manager-WndProc 和标准控件之间有什么秘密协议吗?

WS_GROUP, any secret protocol between dialogbox-manager-WndProc and standard control?

我正在阅读 Charles Petzold 编程 Windows 第 5 版第 11 章 "Tabs Stops and Groups" 部分。我现在有个大问题。

书上说,当一些控件属于同一组时,可以使用left/right箭头键在它们之间切换焦点,这个功能最常用于一组单选框。但是其他类型的控件呢?

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

仔细观察,发现单选框和按钮的区别[P1]:

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

所以,我的问题归结为:windows 内部对话框管理器 WndProc(简称为 DefDlgProc)是否专门处理某些类型的控件(如 "edit")? 例如,如果 DefDlgProc 发现带有 VK_RIGHT 的 WM_KEYDOWN 消息发往 "edit" 控件,它永远不会采取焦点切换操作,而是将消息传递给"edit"老老实实控制。

这种特殊处理是以硬编码方式完成的还是以某种通用的、可配置的方式完成的?我需要知道它,因为如果我编写自己的自定义编辑框控件,我需要一种方法让 DefDlgProc 专门为我的控件处理箭头键,对吗?

示例代码:对于 3-edit 实验,我使用这样的 .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.

上做我的实验

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

对话管理器在内部使用 GetNextDlgGroupItem() to shift the focus to the next or previous control in the group. This doesn't distinguish between control types - it only looks at the WS_GROUP style. However, the dialog manager only calls this function if the control itself doesn't consume the key, and this is determined by the control's response to the WM_GETDLGCODE 消息。