我们的应用程序中有一系列对话框,这些对话框的对话框模板在屏幕底部定义了4个按钮。 但是(取决于应用程序在哪个硬件版本上运行),有时我们会另外创建2个按钮,然后在底部排列6个按钮(模板中的4个按钮,通过调用CButton :: Create()创建的2个按钮)。
我的问题是通常用户可以使用向左/向右箭头键在这些按钮之间移动焦点(没有鼠标或触摸屏,只有受限的键盘)。 正如您期望模板中的4个按钮一样,这遵循控制TAB顺序。 但是,这2个动态创建的控件似乎是在TAB顺序的开头插入的,这意味着(因为它们位于屏幕的右侧),直到它们位于“错误”顺序为止。光标键消失了。 换句话说,当焦点移至左侧按钮(TAB顺序1)时,按左箭头会将焦点跳转至右侧的按钮,这简直是令人困惑。
Z顺序(我可以用SetWindowPos()
影响)和TAB顺序之间似乎存在某些联系,但这似乎不是简单的一对一:通过更改Z顺序,我可以移动序列以便按钮完全按错误的顺序排列,因此我可以更改Z顺序,但无法弄清楚如何按正确的顺序排列它们。
任何人都可以对TAB顺序的工作原理以及运行时如何控制控件顺序进行简要说明吗?
编辑:下面建议使用SetWindowPos()
设置Z顺序的kol。 我之前曾尝试过此操作,但它不能让光标键按预期控制焦点。
但是,通过进行组装,我可以使用TAB(作为测试-这对于最终用户解决方案不切实际),我发现kol的解决方案确实可以解决TAB顺序。 我的问题是,这是不一样的光标键使用的顺序!
因此,修改后的问题是:如何指定控件之间向左/向右光标键移动焦点的顺序?
解决方案:在kol和MarkRansom的帮助下,我现在开始工作了。
我按照kol的建议使用SetWindowPos()
将新按钮按TAB顺序放在现有按钮之后,然后(如Mark所建议的)制成第一个按钮WS_GROUP | WS_TABSTOP
WS_GROUP | WS_TABSTOP
但从其他按钮清除了这些标志。
但是,这还不足以解决问题,当使用箭头键(而非TAB)移动时,这两个新按钮似乎仍然出现在第一个按钮之前,而不是第二个按钮之后。
我看着我的对话框模板,就像这样:
IDD_QUERY DIALOG 0, 0, 156, 34
STYLE DS_SETFONT | WS_POPUP | WS_CAPTION
FONT 8, "MS Sans Serif"
BEGIN
PUSHBUTTON "+++Skey1+++",IDC_SKEY_1,1,21,36,12
PUSHBUTTON "+++Skey2+++",IDC_SKEY_2,40,21,37,12
PUSHBUTTON "+++Skey3+++",IDC_SKEY_3,79,21,36,12
PUSHBUTTON "+++Skey4+++",IDC_SKEY_4,118,21,36,12
LTEXT "Static",IDC_QUERY_MSG,2,1,153,15
END
因此,用于向用户显示信息的静态IDC_QUERY_MSG
模板中的第四个按钮之后 。 要解决这个问题,让我感动IDC_QUERY_MSG
第一个按钮( 前 IDC_SKEY_1
):这意味着6个按键不是由静态其间分手了,并且已经解决了这个问题。
感谢大家的帮助!