我正在阅读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
消息的响应决定的。