Delphi的有关菜单的Owner-draw 技术

xiaoye 2000-09-11 10:44:00
我在一本讲述Delphi技术的书上看到有关菜单的Owner-draw 技术,讲得并不复杂。
于是我试验了一个Color菜单,它有三个菜单项:Red,Blue,Green。按书上介绍的程序
运行时应该由三种颜色来代替文字。

在Form 的public部分定义两个消息响应过程:
procedure WmMeasureItem(var Msg: TWmMeasureItem);
message wm_MeasureItem;
procedure WmDrawItem(var Msg: TWmDrawItem);
message wm_DrawItem;

在implementation段编写消息响应过程,还有OnCreate过程,程序如下(按书中所写):

procedure TForm1.FormCreate(Sender: TObject);
var
I: integer;
begin
for I:=0 to Color1.Count-1 do
begin
ModifyMenu(Color1.Handle,Color1.Items[I].menuIndex,
mf_ByPosition or mf_OwnerDraw,Color1.Items[I].Command,
Pointer(I));
end;
end;

procedure TForm1.WmMeasureItem(var Msg: TWmMeasureItem);
begin
inherited;
with Msg.MeasureItemStruct^ do
if CtlType =odt_Menu then
begin
ItemWidth:=80;
ItemHeight:=30;
Msg.Result :=1;
end;
end;

procedure TForm1.WmDrawItem(var Msg: TWmDrawItem);
var
Canvas1: TCanvas;
begin
inherited;
with Msg.DrawItemStruct^ do
if CtlType =odt_Menu then
begin
//create a canvas for painting
Canvas1:=TCanvas.Create;
Canvas1.Handle :=hDC;
try
//set the background color and draw it
if (ods_Selected and ItemState<>0) then
Canvas1.Brush.Color :=clHighlight
else
Canvas1.Brush.Color :=clMenu;

Canvas1.FillRect(rcItem);
case ItemData of
0: Canvas1.Brush.Color :=clRed;
1: Canvas1.Brush.Color :=clGreen;
2: Canvas1.Brush.Color :=clBlue;
end;
Canvas1.Rectangle(rcItem.left +5, rcItem.top +5,
rcItem.Right -10, rcItem.Bottom -10);
finally
Canvas1.Free;
end;
end;
end;

我照着做了却没有预期效果,不知是何原因?
...全文
165 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
PoolD 2000-09-12
  • 打赏
  • 举报
回复
不需要这么麻烦的。
只需要将TMainMenu的OwnerDraw设为true,再响应MenuItem的OnDrawItem事件就可以了。
菜单项的Canvas、Rect等等都在参数里有。Selected参数可以判断鼠标位置是否在菜单项上。很方便。只是快捷键不太好显示(下划线)。
Putao 2000-09-12
  • 打赏
  • 举报
回复
关注
zcw 2000-09-12
  • 打赏
  • 举报
回复
我想不应在create里写,应在OnPaint里写。
制作固定大小的Form   固定的Form像一个对话框,何不试试下面的语句   巧用Delphi制作溅射屏幕   精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splash screen)。利用一点儿小小的内容,即可给程序的显示添加不少色彩   LED数码管仿真显示程序   在电子设备上广泛地使用LED数码管显示数据,在许多应用软件中也经常模拟LED数码管显示数据,使程序画面看起来很有特色   菜单设计   DELPHI中自适应表单的实现   我们知道,屏幕分辨率的设置影响着表单布局,假设你的机器上屏幕分辨率是800*600,而最终要分发应用的机器分辨率为640*480,或1024*768,这样你原先设计的表单在新机器上势必会走样   作非常规程序菜单掌握delphi高级秘籍   大家可能见过诸如金山毒霸,瑞星杀毒,以及五笔输入法等等在系统托盘(即右下角有时间和输入法图标的地方)在的控制菜单,而在正常的任务栏(即屏幕最下方的“开始”按钮的右边的各式各样)中却不出现按钮的程序,即我们常说的在后台运行的程序   用Delphi制作动态菜单   所谓动态菜单是指菜单项随着程序的操作变化而变化。现在,我们用Delphi来实现这一功能,具体步骤如下   工具栏和状态条   为Windows窗口标题栏添加新按钮   对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮,最小化按钮和关闭按钮。你想不想在Windows的窗口标题栏上添加一个新的自定义按钮   用Delphi4实现风Word97格的工具栏   用过Word97的人对它的工具栏印象很深刻,因为它的风格很“酷”,同样IE4.0的工具栏也有类似的风格,Win98的出现,使这种风格的工具栏得到了推广   如何隐藏和显示Windows的任务条   如果隐藏和显示Windows的任务条?仅仅调用以下的函数就可以.   其他技巧   Delphi利用Windows GDI实现文字倾斜   在Delphi开发环境中,文字的输出效果一般都是头上脚下的"正统"字符,如何输出带有一定倾斜角度的文字以达到特殊的显示效果呢   Delphi之三十六计之界面篇   设置状态栏面板对象的Style为OwnerDraw,并在状态栏对象的DrawPanel事件中书写以下代码   利用COM技术实现外壳扩展的属性页   当用户在资源管理器中调用右键菜单时,会显示一个"属性"菜单项,点击属性菜单项会显示一个属性页,用户可以获得甚至修改文件信息

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧