六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 33|回复: 0

苛评VCL: 失望的TMenu

[复制链接]

升级  47.05%

629

主题

629

主题

629

主题

探花

Rank: 6Rank: 6

积分
1941
 楼主| 发表于 2013-2-7 03:30:32 | 显示全部楼层 |阅读模式
TMenu是什么?他是VCL中封装的TMainMenu和TPopupMenu的基类。与其说对TMenu失望,其实是对VCL中对TMainMenu和TPopupMenu的失望。
为什么呢?这基本上还得归咎于微软自己。微软在推出Windows的同时,却坚决的在推Office系列产品。而且Office的更新速度和Windows几乎一样快。更重要的是,Office系列产品的界面风格,特别是菜单,和标准Windows的完全不同。
当微软的Office推广地非常好的时候,我们都在渴望也能设计出一样的界面。对于只是外表改变的需求来讲,很自然地可以考虑重新覆盖TMenuItem的Draw方法。
可是,当你真的想这么干的时候,你会发现两件事,一件让你高兴,一件让你失望。先说高兴的事吧:
负责Draw工作的两个方法:AdvancedDrawItem和MeasureItem都是声明的Virtual类型的函数。也就是说,我们完全可以通过覆盖这些方法的方式去实现。而且,显然的,TMenuItem的设计者,显然已经考虑到这样的扩展了。
而且,通过观察AdvancedDrawItem的实现,你更可以发现你需要修改的代码点。
<blockquote><div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 95%; padding-top: 4px;">if(ParentMenu<>nil)and(ParentMenu.OwnerDrawor(ImageList<>nil))and
(Assigned(FOnAdvancedDrawItem)orAssigned(FOnDrawItem))then
begin
DrawItem(ACanvas,ARect,Selected);
ifAssigned(FOnAdvancedDrawItem)then
FOnAdvancedDrawItem(Self,ACanvas,ARect,State);
end
else
if(ParentMenu<>nil)and(notParentMenu.IsRightToLeft)then
NormalDraw
else
BiDiDraw;
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表