Delphi中Menu设置Images属性后快捷按键下划线被隐藏解决方法
现象:
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属性后快捷按键下划线被隐藏解决方法的更多相关文章
- MVC dropdownlist 后端设置select属性后前端依然不能默认选中的解决方法
-----------------------------------来自网上的解决方法--------------------------------------------- ASP.Net MV ...
- nginx 自动忽略request中header name包含下划线参数的解决方法
使用nginx过程中遇到了个问题,就是request中的header name中如果包含下划线会自动忽略掉,导致服务器接收不到该字段的内容,以下为解决方法: nginx默认request的header ...
- dedecms设置文章分页后,标题会带有序号的解决方法
至于删除分页后标题后面的序号,找到include/arc.archives.class.php 打开,找到 if($i>1) $this->Fields['title'] = $this- ...
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
- ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决【转】
编写Winform程序,遇到comboBox的绑定事件和索引项变更事件的冲突问题,就是“设置 DataSource 属性后无法修改项集合”的错误问题,网上查了很多,大多说在索引项变更是进行非空判断,还 ...
- C# LIstbox 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题
解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题 分类: winform2008-05-24 02:33 2592人阅读 评论(11) 收藏 举报 winf ...
- 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”
解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合” 最近更新: 2013-2-15 587 很少写WinForm程序第一次使用ListBox控件就遇到了比 ...
- 元素设置disabled属性后便无法向后台传值
元素设置disabled属性后便无法向后台传值
- 解决BootstrapTable设置height属性后,表格不对齐的问题
解决BootstrapTable设置height属性后,表格不对齐的问题 2018年03月06日 09:56:54 nb7474 阅读数 5920 一般在使用BootstrapTable 插件 ...
随机推荐
- Quartz 入门详解 专题
Cron-Expressions are used to configure instances of CronTrigger. Cron-Expressions are strings that a ...
- 【序列操作III】线段树
题目描述 给出序列 a1,a2,…an(0≤ai≤109),有关序列的四种操作: 1. al,al+1,…,ar(1≤l≤r≤n)加上 x(-103≤x≤103) 2. al,al+1,…,ar(1≤ ...
- DirectX11学习笔记
一.假定每种颜色的原始点是不同,表面的这样的原始颜色将被指定为每种颜色用线性内插值传授,这个被称为高洛德着色(Gouraud Shading).也称为平滑阴影: 二.三维图元:Direct3D中.使用 ...
- Hexo里如何添加广告
前期先用Hexo做个人网站,模板可以用https://github.com/828768/maupassant-hexo,关于如何加入广告,可以看一下https://sobaigu.com/hexo- ...
- Cordova/PhoneGap 安卓开发环境搭建
此文为个人原创作品,如有不正确之处,恳请大家指出,并请您谅解,转载请说明出处. 准备阶段: 必备: JDK(根据自己的开发平台下载相应的安装包,可能需要FQ) Nodejs (根据自己的开发平台下载 ...
- Arraylist 和 linkedlist || hashset 和treeset. || hashMap 和 TreeMap
参考:http://liuyuan418921673.iteye.com/blog/2256120 1. ArrayList和LinkedList的区别和使用场景 ArryList 与linked ...
- C#实现通过拼多多分享微信公众号实现查询优惠券、佣金比率
主要实现功能:关注公众号的用户发送拼多多商品链接,后台程序通过链接查找商品优惠券或返佣情况. 说明:使用了niltor 封装的拼多多接口 github地址 ,但是需要注意可能会存在返回模型无法正确解析 ...
- 数学思想方法-python计算战(8)-机器视觉-二值化
二值化 hreshold Applies a fixed-level threshold to each array element. C++: double threshold(InputArray ...
- 分类算法SVM(支持向量机)
支持向量机(Support Vector Machine ,SVM)的主要思想是:建立一个最优决策超平面,使得该平面两侧距离该平面最近的两类样本之间的距离最大化,从而对分类问题提供良好的泛化能力.对于 ...
- 距离北京奥运还有359天,发布WPF版本的北京2008标志(上)
原文:距离北京奥运还有359天,发布WPF版本的北京2008标志(上) 效果图: XAML代码:<Canvas Width="343.581055" Height=" ...