菜单加速键无法显示(德尔福2009)
我已经尽力而为,无法弄清楚这里发生了什么。它在Delphi 4中运行良好。在升级到Delphi 2009之后,我不知道它是否应该工作,或者是否有问题:菜单加速键无法显示(德尔福2009)
这是我的程序菜单在设计模式下的样子2009年德尔福下:
alt text http://www.beholdgenealogy.com/img/menu1.gif
请注意,在主菜单中的每一个字和文件子菜单有一个下划线的字母。它应该是这样的。此带下划线的字母称为加速键,它是Windows应用程序的标准配置,因此您可以使用Alt键和该字母快速选择菜单项,然后使用键盘快速选择子菜单项,而不是使用鼠标。
你让他们这样使用“&”字符作为项目的标题的一部分,例如:保存&为...
当我运行我的应用程序,并使用鼠标打开在文件菜单,它看起来像这样:
alt text http://www.beholdgenealogy.com/img/menu2.gif
的字符强调在主菜单中,但在文件菜单不加下划线。
相反,如果我使用Alt-F键打开文件子菜单,然后它看起来是正确的是这样的:
alt text http://www.beholdgenealogy.com/img/menu3.gif
,所有的加速键字母正确下划线。
我玩过AutoHotKeys选项,但这不是问题。
有人遇到过这个问题吗?第二张照片中的例子是否正确,我不知道?还是有一些选项或编码错误,我可能错过了?
2009年11月(一年后):mghie似乎已经找到了这个问题的根源,并找出了问题所在。见下面他接受的答案。
除非按住Alt键,否则标准Windows设置(显示属性下)通常隐藏这些加速键。这可以解释为什么用Alt + F10打开菜单为你显示它们。也许这是原因?
[编辑]:不,它不是。我刚刚尝试过,并且带菜单项的简单TForm显示加速器,但只要添加TImageList并设置单个菜单项的ImageIndex,或者只需将OwnerDraw设置为true,则加速器下划线消失。我想这真的是VCL中的一个错误。
顺便说一下,这是在Windows XP上。
解决方法:
我有这个采用Delphi 2009年在Windows XP 64,而根本原因丢失的加速器似乎是Windows发送WM_DRAWITEM
消息以ODS_NOACCEL
标志设置,它不该”调试t如果系统设置为始终显示加速器。所以你可以说这不是一个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;
这只是演示代码,你不应该每次收到WM_DRAWITEM
邮件时调用SystemParametersInfo()
,但一旦程序开始,然后每次您的程序收到一条消息。
我不认为这是一个德尔福生成的错误,因为你有与Vista上的记事本相同的行为。另外在德尔福本身BTW ...
我必须承认,我没有注意你的问题之前。感谢您指出。
不。在Delphi 2009中,对于我来说,即使我用鼠标选择菜单,所有子菜单项都会显示加速键。 这就是为什么我认为这是我的一些设置,而不是德尔福或操作系统。 这绝对是一个stramge之一,我已经花了大约4个小时已经试图解决它。 – lkessler 2008-11-11 09:10:44
这是一个“功能” Windows 2000引入:
旧事新:Why does Windows hide keyboard accelerators and focus rectangles by default?
这样看来,德尔福4不支持这个Windows功能。
要有2000和XP的菜单显示快捷键,在桌面上右键单击空白处,选择属性,单击外观选项卡,效果,下取消隐藏带下划线的字母键盘导航,直到我按下Alt键。单击确定两次。
不知道如何在Vista中做到这一点。
正如Jim McKeeth在上面(正确地)指出的那样,这是“按设计”行为。如果通过键盘操作触发菜单,则应显示加速器,但如果通过鼠标触发加速器故意不显示。
我有我的XP配置为随时显示加速器,但使用该选项的快速测试更改确认菜单不应显示下划线(Visual Studio按我的预期作出响应,使用鼠标时不会出现下划线)。但是,Microsoft Office忽略此设置并始终显示下划线。所以它看起来像是在Delphi中如何绘制菜单的一个错误(我自己并没有使用Delphi的经验)。
我发现Vista的选项还有:http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html
您可以访问中心新的轻松启用该选项(进入控制 面板,单击轻松访问,然后单击轻松访问中心)。在 “轻松访问中心”中,单击“让键盘更易于使用”,并在最下方选择“下划线”键盘快捷键并访问 键复选框。
虽然做进一步的研究,我发现德尔福论坛此相关的bug:http://qc.codegear.com/wc/qcmain.aspx?d=37403
它看起来像你的情况的子窗口(绘制菜单)没有得到或没有从处理WM_UIUPDATESTATE消息他们的父窗口,这是什么导致与加速器重绘。
我也在Windows XP上。在这些答案和我的想法以及你的帮助之后,我确实认为这可能是VCL中的一个错误。我会报告它。 – lkessler 2008-11-11 22:48:08
报告为Embarcadero的错误:http://qc.codegear.com/wc/qcmain.aspx?d=68816 – lkessler 2008-11-11 23:03:18
顺便说一句,我得到了与德尔福2007年相同的行为。 – mghie 2008-11-15 09:25:04