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



我正在阅读Charles Petzold Programming Windows第5版,第11章,"制表符停止和组"部分。我现在有一个大问题。

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

我试着有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-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()将焦点转移到组中的下一个或上一个控件。这并没有区分控件类型——它只关注WS_GROUP风格。然而,对话管理器只在控件本身不使用键时调用此函数,这是由控件对WM_GETDLGCODE消息的响应决定的。

最新更新