Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何处理禁用控件的加速器?_C++_Windows_Winapi_Mfc - Fatal编程技术网

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

C++ 如何处理禁用控件的加速器?,c++,windows,winapi,mfc,C++,Windows,Winapi,Mfc,我有一个从模板创建的对话框。它在模板中按以下顺序列出了控件: 一些无关的控件 带有加速器的标签(让我们假设它是Alt-a) 编辑框 确定和取消按钮 通常,当我按下Alt-A键时,键盘的焦点会转移到编辑框中,这是需要的。然而,我有时需要禁用编辑框 如果我在编辑框被禁用时点击Alt-A,效果是按下OK按钮,这绝对不是我想要的。我宁愿在这种情况下不采取任何行动。我能做些什么来解决这个问题呢?我对MFC不太熟悉,所以我试着用一般术语回答: 据我所知,发生的是所谓的加速器冲突A是编辑框的加速键,我猜这

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

  • 一些无关的控件
  • 带有加速器的标签(让我们假设它是Alt-a)
  • 编辑框
  • 确定和取消按钮
通常,当我按下Alt-A键时,键盘的焦点会转移到编辑框中,这是需要的。然而,我有时需要禁用编辑框


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

我对MFC不太熟悉,所以我试着用一般术语回答:

据我所知,发生的是所谓的加速器冲突
A
是编辑框的加速键,我猜这里是
Apply
按钮

解决办法是避免这种情况。正如您自己发现的那样,模糊的加速键对于用户来说是一个PITA。因此,在KDE中,我们有一个自动机制,它基于一些启发式在运行时分配accel密钥。这通常就足够了,尽管它偶尔会产生次优结果

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


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

当您启用/禁用编辑框时,您可以使用加速键启用/禁用标签控件,也可以通过更改窗口文本在标签上添加/删除加速键。这两种方法都能让你表现出你想要的行为。

我刚刚试过这个,它似乎很管用。。。尽管这是一种狡猾的方法

在编辑控件之后,插入一个按钮(大小任意)。将按钮上的属性更改为“Owner Draw”,但实际上不实现任何绘图逻辑。另外,确保其选项卡顺序设置为紧跟编辑控件之后

这将使按钮在运行时不可见。当编辑控件被禁用时,不可见按钮实际上被触发而不起作用

注意:您不能仅从按钮中删除WS_VISIBLE(或隐藏或禁用),因为这可能会使控件不可见,还可以防止控件处于选项卡顺序

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


希望这有帮助

我已经很久没有使用MFC和Windows SDK了,但是从架构的角度来看,应该有一个事件处理程序可以挂接。为禁用编辑框时保留内部标志。当编辑框被禁用时,使用任何Alt-A事件。

我不复制任何内容。问题是加速器会触发下一个未禁用的控件。启用editbox时,它是下一个未禁用的控件。当它被禁用时,“确定”按钮将成为下一个非禁用控件。禁用标签将使其变灰-这在我的情况下不合适。而且调整文本是可怕的-我需要记住我这样调整的每个标签文本的符号和符号的位置。很糟糕,但会起作用。如果您正在使用标签的字符串资源,请使用符号and设置值,启用时使用该值,禁用时只需删除符号and即可。不需要记住位置。我实际上在对话框模板中将标签定义为静态控件。如果我这样做的话,我需要记住安培和的位置,这样当我启用依赖控制时,加速器就可以再次工作了。