我正在阅读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] :
“编辑”控件的情况 [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上进行实验。
答案 0 :(得分:4)
你的问题没有意义。您不希望在编辑控件中按左或右光标键将焦点移动到另一个控件,因为编辑控件本身会使用该按键来移动光标。
对话管理器在内部使用GetNextDlgGroupItem()
将焦点转移到组中的下一个或上一个控件。这并没有区分控件类型 - 它只关注WS_GROUP
样式。但是,如果控件本身不使用密钥,则对话管理器仅调用此函数,这取决于控件对WM_GETDLGCODE
消息的响应。