【发布时间】:2010-04-09 05:31:43
【问题描述】:
我有一个从模板创建的对话框。它在模板中按以下顺序列出了控件:
- 一些不相关的控件
- 带有加速键的标签(假设它是 Alt-A)
- 编辑框
- 确定和取消按钮
通常当我按下 Alt-A 时,键盘焦点会转移到编辑框 - 就像需要一样。但是我有时需要禁用编辑框。
如果我在禁用编辑框时按 Alt-A,效果是按下了 OK 按钮,这绝对不是我想要的。我宁愿在这种情况下不采取任何行动。我可以做些什么来解决这个问题?
【问题讨论】:
我有一个从模板创建的对话框。它在模板中按以下顺序列出了控件:
通常当我按下 Alt-A 时,键盘焦点会转移到编辑框 - 就像需要一样。但是我有时需要禁用编辑框。
如果我在禁用编辑框时按 Alt-A,效果是按下了 OK 按钮,这绝对不是我想要的。我宁愿在这种情况下不采取任何行动。我可以做些什么来解决这个问题?
【问题讨论】:
我对 MFC 不是很熟悉,所以我试图笼统地回答:
据我所知,发生的情况是您遇到了所谓的加速器冲突。 A 是两个编辑框的加速键,以及 - 我猜这里 - Apply 按钮。
解决方案是避免这种情况。正如您自己发现的那样,模棱两可的加速键是用户的 PITA。因此,在 KDE 中,我们有一种自动机制,可以根据一些启发式方法在运行时分配加速键。这通常就足够了,尽管它偶尔会产生次优结果。
如果您使用某种形式的表单设计器来直观地布置控件,这些工具通常可以检查加速键冲突。否则,回到过去,我会在测试时单击所有加速键以查看它们是否按预期工作。
但底线是:不要让重复的加速键发生在同一范围内。
【讨论】:
当您启用/禁用编辑框时,您也可以使用加速键启用/禁用标签控件,或者通过更改窗口文本来简单地添加/删除标签上的加速键。两者都应该给你想要的行为。
【讨论】:
我刚试过这个,它似乎工作......虽然这是一个偷偷摸摸的方法。
在编辑控件之后,放入一个按钮(任意大小)。将按钮上的属性更改为“Owner Draw”,但实际上并未实现任何绘图逻辑。另外,请确保它的 Tab 键顺序设置为紧跟在编辑控件之后。
这将使按钮在运行时不可见。当编辑控件被禁用时,隐形按钮真的被触发无效了。
注意:您不能只从按钮中删除 WS_VISIBLE(或以其他方式隐藏或禁用),因为这可能会使控件不可见,而且还会阻止控件处于 Tab 键顺序。
使用此方法,当您在禁用编辑控件时按下加速键时,您的焦点将消失(因为它位于一个不可见的按钮上)。如果您不喜欢这样,请将处理程序添加到新的不可见按钮,以便在禁用编辑控件的情况下将焦点设置到您想要的位置。这样,加速器单击按钮,调用处理程序,将焦点恢复到您想要的位置。
希望这会有所帮助!
【讨论】:
自从我从事 MFC 和 Windows SDK 工作以来已经有很长时间了,但是从架构的角度来看,应该有一个可以挂钩的事件处理程序。为禁用编辑框时维护一个内部标志。当编辑框被禁用时,吃掉任何 Alt-A 事件。
【讨论】: