自画菜单的问题

字体大小: 中小 标准 ->行高大小: 标准
首先将菜单的ownerdraw属性设置为true;然后在菜单项的drawitem中写入代码即可。

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

ARect: TRect; Selected: Boolean);

begin

acanvas.Font.Color:=clred;

if selected then

SetBkColor(acanvas.handle,clgreen)

else

setBkcolor(acanvas.handle,clblue);

acanvas.TextRect(arect,0,0,new1.caption);

end;

你是否发现了,当对菜单上一个按键的菜单项的drawitem写下如上代码后,其它的按键不写,是可以的,但只能写了的按键会变色。当对所有的按键都写的话,就只有一个按键是正常的,其它按键的caption都不见了,就是说是些没有字显示的空键,虽然能也变色,但上面不显示菜单项的文字!!真是怪了,昨晚发现的。

你早上 不在吧?下午我再发上来,希望你在。

 回复人:Kingron(WinAPI) (2001-3-14 15:45:00) 得0分

上午来了一下,匆匆地走了。

呵呵,我一般只测试第一个,既然你提出了这个问题,应该不难解决!

你的问题是因为坐标计算有误:

acanvas.TextRect(arect,0,0,new1.caption);

修改如下:

acanvas.TextRect(arect,arect.Left,arect.Top,(sender as tmenuitem).Caption);

还有一点要提醒你的是,必须自己处理好Caption中快捷方式字母的显示问题,这个你自己应该可以搞定,我就不多说了。

************

先 PopupMenu1.OwnerDraw := True; 用 OnMeasureItem 事件设置好菜单项 n1 的大小后,再用 n1 的 OnDrawItem 事件中添入 ACanvas.Draw(1, 1, Image1.Picture.Graphic);

再将 n2.Break := mbBreak;

n3.Caption := '-';

为什么运行后菜单中图片被水平分割条“-”无情地穿透了??

还有:在 FormCreate 中添加一句 Screen.MenuFont.Color := clRed; 对于 PopupMenu1 没有任何反应,而添加一句 Screen.MenuFont.Style := [fsBold]; 却有效果??

 

一看就知道你想编个左边带有图像条的菜单,就和“开始”菜单中的一样,不是吗?

原因是这样的:在画完N1后,即画完了你指定的图像后,才开始画其它的菜单,包括菜单的分隔线,所以会出现这样的情况。建议你将画图像的那一句放在N3的OnDrawItem事件中,这样就保证此图像是最后画的,而不会被覆盖。

至于第二个问题,相信你是没有查看过Screen对象的源代码,因为在其Paint方法中又重新设置了字体的颜色,所以无论你设置为什么颜色也不会有效果的。建议你创建一个Screen的派生类,只重写其Paint事件即可。当然,最好的方法还是在OnDrawItem事件中改变颜色。

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/68435.html