如何处理禁用控件的加速器?

时间:2009-07-13 05:48:55

标签: c++ windows winapi mfc

我有一个从模板创建的对话框。它按以下顺序在模板中列出了控件:

  • 一些不相关的控件
  • 带有加速器的标签(让我们假装它是 Alt-A
  • 一个编辑框
  • 确定和取消按钮

通常当我按下 Alt-A 时,键盘焦点会转移到编辑框 - 就像需要一样。但是我有时需要禁用编辑框。

如果在禁用编辑框时按 Alt-A ,效果是按下确定按钮,这绝对不是我想要的。在这种情况下,我宁愿不采取任何行动。我该怎么做才能解决这个问题?

4 个答案:

答案 0 :(得分:0)

我对MFC不太熟悉,所以我试图回答一般性问题:

据我所知,发生的事情是你有一个所谓的加速器冲突。 A是编辑框的加速键,而且 - 我猜这里是Apply按钮。

解决方案是避免这种情况。正如您自己发现的那样,不明确的加速键是用户的PITA。因此,在KDE中,我们有一种自动机制,可以根据一些启发式方法在运行时分配加速键。这通常已经足够了,但它偶尔会产生不理想的结果。

如果您使用某种形式的表单设计器来直观地布局控件,这些工具通常可以检查加速键冲突。否则,回到过去,我会在测试时点击所有加速键,看看它们是否按预期工作。

但底线是:不要让重复的加速键发生在同一范围内。

答案 1 :(得分:0)

启用/禁用编辑框时,您也可以使用加速器启用/禁用标签控件,或者只需通过更改窗口文本添加/删除标签上的加速器。两者都应该给你想要的行为。

答案 2 :(得分:0)

我只是尝试了这个并且似乎有效......尽管这是一种偷偷摸摸的方法。

编辑控件后,按下一个按钮(任意大小)。将按钮上的属性更改为“Owner Draw”,但实际上并未实现任何绘图逻辑。另外,请确保它的标签顺序设置为在编辑控件之后。

这会使按钮在运行时不可见。禁用编辑控件时,实际触发隐形按钮无效。

注意:您不能只是从按钮中删除WS_VISIBLE(或以其他方式隐藏或禁用),因为这可能会使控件不可见,但也会阻止控件进入Tab键顺序。

使用此方法,当您在禁用编辑控件时点击加速器时,焦点将消失(因为它位于隐藏按钮上)。如果您不喜欢这样,请在新的隐藏按钮中添加处理程序,以便在禁用编辑控件的情况下将焦点设置为您希望的位置。这样,加速器点击按钮,调用处理程序,将焦点恢复到你想要的位置。

希望这有帮助!

答案 3 :(得分:0)

自从我在MFC和Windows SDK工作以来已经很长时间了,但从架构的角度来看,应该有一个可以挂钩的事件处理程序。在禁用编辑框时保持内部标志。禁用编辑框时,请吃任何Alt-A事件。