关于自画菜单的问题

I

import

Unregistered / Unconfirmed
GUEST, unregistred user!
首先将菜单的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事件中改变颜色。
 
顶部