当前位置:  开发笔记 > 开发工具 > 正文

菜单加速键未显示(Delphi 2009)

如何解决《菜单加速键未显示(Delphi2009)》经验,为你挑选了2个好方法。

我已经尽了最大努力,无法弄清楚这里发生了什么.它在Delphi 4中运行良好.在升级到Delphi 2009之后,我不知道这是否应该是它应该工作的方式,或者它是否是一个问题:

这是我的程序菜单在Delphi 2009下的设计模式中的样子:

在此输入图像描述

请注意,主菜单和文件子菜单中的每个单词都有一个带下划线的字母.应该是这样的.这个带下划线的字母称为加速键,是Windows应用程序的标准字母,因此您可以使用Alt键和该字母快速选择菜单项,然后使用键盘而不是鼠标快速选择子菜单项.

通过使用"&"字符作为项目标题的一部分,您可以通过这种方式获得它们,例如:Save&As ...

当我运行我的应用程序,并使用鼠标打开文件菜单时,它看起来像这样:

在此输入图像描述

主菜单中的字符带下划线,但"文件"菜单中没有下划线.

相反,我使用Alt-F键打开文件子菜单,然后看起来像这样:

在此输入图像描述

并且所有Accelerator Key字母都有正确的下划线.

我玩过AutoHotKeys选项,但这不是问题.

以前有人遇到过这个问题吗?第二个图像中的示例是否是我不知道的正确行为?或者我可能错过了一些选项或编码错误?


2009年11月(一年后):mghie似乎已经找到了根源,并找出了问题所在.请参阅下面接受的答案.



1> mghie..:

除非按下Alt键,否则标准的Windows设置(在显示属性下)通常会隐藏这些加速器.这可以解释为什么用Alt + F10打开菜单会为你显示它们.也许这就是原因?

[编辑]:不,不是.我刚试过,一个带菜单项的简单TForm显示加速器,但是只要我添加TImageList并设置单个菜单项的ImageIndex,或者只是将OwnerDraw设置为true,加速器下划线就会消失.我猜这真的是VCL中的一个错误.

顺便说一句,这是在Windows XP上.

解决方法:

我在Windows XP 64上使用Delphi 2009调试了这个,并且缺少加速器的根本原因似乎是Windows发送WM_DRAWITEM带有ODS_NOACCEL标志设置的消息,如果系统设置为始终显示加速器,则不应该这样做.所以你可以说它不是VCL错误,而是VCL无法解决的Windows问题.

但是,您可以在自己的代码中解决它,只需要在将消息传递给VCL之前重置标志.覆盖窗口过程

protected
  procedure WndProc(var Message: TMessage); override;

像这样:

procedure TYourForm.WndProc(var Message: TMessage);
const
  ODS_NOACCEL = $100;
var
  pDIS: PDrawItemStruct;
  ShowAccel: BOOL;
begin
  if (Message.Msg = WM_DRAWITEM) then begin
    pDIS := PDrawItemStruct(Message.LParam);
    if (pDIS^.CtlType = ODT_MENU)
      and SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, @ShowAccel, 0)
    then begin
      if ShowAccel then
        pDIS^.itemState := pDIS^.itemState and not ODS_NOACCEL;
    end;
  end;
  inherited;
end;

这只是演示代码,您不应该在SystemParametersInfo()每次WM_DRAWITEM收到消息时调用,而是在程序启动时调用,然后每次程序收到WM_SETTINGCHANGE消息时调用.



2> Jim McKeeth..:

这是Windows 2000引入的"功能":

旧的新事物:为什么Windows默认隐藏键盘加速器和焦点矩形?

似乎Delphi 4不支持此Windows功能.

要让2000和XP菜单显示加速键,请右键单击桌面上的空白点,选择"属性",单击"外观"选项卡,然后在"效果"下,取消选中" 隐藏带下划线的键盘导航字母",直到我按下Alt键.单击确定两次.

不知道如何在Vista中做到这一点.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有