【问题标题】:How to deal with accelerators for disabled controls?如何处理禁用控件的加速器?
【发布时间】:2010-04-09 05:31:43
【问题描述】:

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

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

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

如果我在禁用编辑框时按 Alt-A,效果是按下了 OK 按钮,这绝对不是我想要的。我宁愿在这种情况下不采取任何行动。我可以做些什么来解决这个问题?

【问题讨论】:

    标签: c++ windows winapi mfc


    【解决方案1】:

    我对 MFC 不是很熟悉,所以我试图笼统地回答:

    据我所知,发生的情况是您遇到了所谓的加速器冲突。 A 是两个编辑框的加速键,以及 - 我猜这里 - Apply 按钮。

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

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

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

    【讨论】:

    • 我不会复制任何东西。问题是加速器触发了下一个非禁用控制。启用编辑框后,它是下一个未禁用的控件。当它被禁用时,确定按钮成为下一个非禁用控件。
    【解决方案2】:

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

    【讨论】:

    • 禁用标签会使它变灰——这在我的情况下是不合适的。调整文本是可怕的——我需要记住我以这种方式调整的每个标签文本的 & 符号的位置。太可怕了,但会起作用。
    • 如果您为标签使用字符串资源,请使用与号设置值并在启用时使用该值,并在禁用时简单地删除与号。无需记住位置。
    • 我实际上在对话框模板中将标签定义为静态控件。如果我这样做,我需要记住与号的位置,以便当我启用依赖控制时,加速器再次起作用。
    【解决方案3】:

    我刚试过这个,它似乎工作......虽然这是一个偷偷摸摸的方法。

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

    这将使按钮在运行时不可见。当编辑控件被禁用时,隐形按钮真的被触发无效了。

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

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

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-06-01
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        相关资源
        最近更新 更多