现象:
MainMenu设置Images属性后,看不到快捷按键的下划线,如:新建(&N)

分析:
VCL中Menus.pas单元的代码,看到如下语句
procedure TMenuItem.AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect;
  State: TOwnerDrawState; TopLevel: Boolean);
//...
if Win2K and (odNoAccel in State) then
  DrawStyle := DrawStyle or DT_HIDEPREFIX;
//...

DT_HIDEPREFIX就是隐藏下划线 //用DrawText()测试一下就知道

在设置Images属性后(odNoAccel in State)为真

看来需要自绘菜单,响应OnAdvancedDrawItem事件

当然,自绘菜单的代码写起来就多了,还好AdvancedDrawItem()声明在protected部分
我们可以通过继承TMenuItem来访问AdvancedDrawItem()
type
  TMenuItemAccess = class(TMenuItem);

现在就要想办法使那个条件不成立,先从Win2K入手
当Images设置后"Win2K and (odNoAccel in State)"这个条件成立

分析单元中Win2K变量是这样得到的
Win2K := (Win32MajorVersion > 4) and (Win32Platform = VER_PLATFORM_WIN32_NT);

那么我们就可以通过修改Win32MajorVersion或者Win32Platform常量使其不成立

参考代码:

type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

ImageList1: TImageList;

MenuItemFile: TMenuItem;

MenuItemNew: TMenuItem;

MenuItemOpen: TMenuItem;

PopupMenu1: TPopupMenu;

MenuItemCopy: TMenuItem;

MenuItemPaste: TMenuItem;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

procedure MenuItemAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;

ARect: TRect; State: TOwnerDrawState);

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

 

{$R *.dfm}

 

type

TMenuItemAccess = class(TMenuItem);

procedure TForm1.MenuItemAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;

ARect: TRect; State: TOwnerDrawState);

var

vWin32Platform: Integer;

begin

vWin32Platform := PInteger(@Win32Platform)^;

PInteger(@Win32Platform)^ := -1;

TMenuItemAccess(Sender).OnAdvancedDrawItem := nil;

try

TMenuItemAccess(Sender).AdvancedDrawItem(ACanvas, ARect, State,

TMenuItemAccess(Sender).GetParentComponent is TMainMenu);

finally

TMenuItemAccess(Sender).OnAdvancedDrawItem := MenuItemAdvancedDrawItem;

PInteger(@Win32Platform)^ := vWin32Platform;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

var

I: Integer;

begin

for I := 0 to ComponentCount - 1 do

if Components[I] is TMenuItem then

TMenuItem(Components[I]).OnAdvancedDrawItem := MenuItemAdvancedDrawItem

else if Components[I] is TMenu then

TMenu(Components[I]).OwnerDraw := True;

end;

http://blog.csdn.net/zswang/article/details/1653340

Delphi中Menu设置Images属性后快捷按键下划线被隐藏解决方法的更多相关文章

  1. MVC dropdownlist 后端设置select属性后前端依然不能默认选中的解决方法

    -----------------------------------来自网上的解决方法--------------------------------------------- ASP.Net MV ...

  2. nginx 自动忽略request中header name包含下划线参数的解决方法

    使用nginx过程中遇到了个问题,就是request中的header name中如果包含下划线会自动忽略掉,导致服务器接收不到该字段的内容,以下为解决方法: nginx默认request的header ...

  3. dedecms设置文章分页后,标题会带有序号的解决方法

    至于删除分页后标题后面的序号,找到include/arc.archives.class.php 打开,找到 if($i>1) $this->Fields['title'] = $this- ...

  4. Delphi中TStringList类常用属性方法详解

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...

  5. ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决【转】

    编写Winform程序,遇到comboBox的绑定事件和索引项变更事件的冲突问题,就是“设置 DataSource 属性后无法修改项集合”的错误问题,网上查了很多,大多说在索引项变更是进行非空判断,还 ...

  6. C# LIstbox 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题

    解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题 分类: winform2008-05-24 02:33 2592人阅读 评论(11) 收藏 举报 winf ...

  7. 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”

    解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合” 最近更新: 2013-2-15    587   很少写WinForm程序第一次使用ListBox控件就遇到了比 ...

  8. 元素设置disabled属性后便无法向后台传值

    元素设置disabled属性后便无法向后台传值

  9. 解决BootstrapTable设置height属性后,表格不对齐的问题

    解决BootstrapTable设置height属性后,表格不对齐的问题 2018年03月06日 09:56:54 nb7474 阅读数 5920     一般在使用BootstrapTable 插件 ...

随机推荐

  1. const常量用extern声明定义的问题(extern变量不能在使用类里初始化)

    test.h #ifndef TEST_H_ #define TEST_H //常量声明和定义采取这种方法即可 const int a = 20;  //不报错,因为const变量链接属性默认是内部链 ...

  2. 从研究try catch 捕获不到异步错误谈谈学习方法的问题

    先看下面的代码,思考一下输出 try { throw new Error(3) } catch (e) { console.log(e) } try { setTimeout(function () ...

  3. SecureCRT 向多个终端发送相同命令

    选中view,选择command windows 在下方出现的窗口中右键,接下来在窗口中输入命令即可,可以一定程度上代替分发脚本,具体请参考https://www.cnblogs.com/tele-s ...

  4. hadoop 3.x 单机集群配置/启动时的问题处理

    一.修改配置文件(hadoop目录/etc/hadoop/配置文件) 1.修改hadoop-env.sh,指定JAVA_HOME 修改完毕后 2.修改core-site.xml <configu ...

  5. JIL 编译与 AOT 编译

    JIT:Just-in-time compilation,即时编译:AOT:Ahead-of-time compilation,事前编译. JVM即时编译(JIT) 1. 动态编译与静态编译 动态编译 ...

  6. 纯洁CSS3实现图片墙

    预赛 DIV+CSS基金会 CSS3的transform 和 transition说明 主要用于transform的rotate/scale 动画过渡的几个參数(transition-property ...

  7. 2.RabbitMQ的quick start

    1.首先要安装 RabbitMQ Client 2.创建一个控制台项目 取名 Publisher代码如下: using RabbitMQ.Client; using System; using Sys ...

  8. Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...

  9. Matlab Tricks(十八)—— 矩阵间元素距离的计算

    两个矩阵间元素(向量)距离的度量,首先想到的是遍历,循环的方式,显然 matlab 下的编程并不推荐,matlab 下矩阵向量化编程效率尤高. 先考虑两个向量距离的计算: ∥x−y∥2=∥x∥2+∥y ...

  10. 使用python3的base64编解码实现字符串的简易加密解密

    import base64 copyright = 'Copyright (c) 2012 Doucube Inc. All rights reserved.' def main(): #转成byte ...