我有一个简单的应用程序2个标签,2个编辑和一个按钮。
如果我按alt + 1或alt + 2,焦点将跳到Edit1或edit2。
如果button1具有焦点,并且我按1(无alt),它将跳转到edit1。
这会带来一些问题。可以禁用它。在borland c ++ 6.0中不是这样。
谢谢
答案 0 :(得分:4)
此行为是设计使然。当不接受输入的控件具有焦点时,按键将被解释为加速键。
答案 1 :(得分:2)
为什么不按Alt键的快捷方式
VCL模拟操作系统行为。对话框navigation topics中将解释其模拟内容:
助记符是按钮标签中选择的字母或数字,或者 在静态控件的文本中。系统将输入焦点移至 无论何时用户使用与助记符关联的控件 按对应于助记符的键或按此键 和ALT键组合。
如您所见,按ALT键不是助记符移动焦点的必要条件。为此,尽管如此,已经集中的控件不应对按下的键感兴趣。进一步解释如下:
当用户按下字母或数字键时,系统将首先显示 确定当前控件是否具有输入焦点 处理密钥。系统将WM_GETDLGCODE消息发送到 控件,以及该控件是否返回DLGC_WANTALLKEYS或 DLG_WANTMESSAGE值,系统将密钥传递给控件。 否则,它将搜索其助记符与 指定的字母或数字。
这是当您按“ 1”时发生的情况。该按钮不处理密钥,因此VCL会搜索控制者。
可以将其禁用
VCL通过在处理TWinControl
消息(变异的CN_CHAR
)时在WM_CHAR
上执行WM_GETDLGCODE
来模拟行为。如果控件的响应不包含DLGC_WANTCHARS
,则控件在父表单上执行CM_DIALOGCHAR
。表单将消息发送到其所有控件,直到/如果其中一个控件想要处理它。
在这里可以覆盖行为,可以测试是否按下了ALT键,如果没有按下,则暂停处理。 CM_DIALOGCHAR
与WM_CHAR
使用相同的结构,因此lParam
的第29位指定是否按下ALT键。
type
TForm1 = class(TForm)
...
protected
procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
...
procedure TForm1.CMDialogChar(var Message: TCMDialogChar);
begin
if Boolean(Message.KeyData shr 29 and 1) then
inherited;
end;