高手们,请问不用任何控件,如何在菜单上加入背景图,请提供详细的实现代码。 你连TMenu也不用吗?那就用API慢慢写吧。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给你一个贴子tcanvans首先将菜单的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事件中改变颜色。 delphi XE2 下spcomm的问题 如何在函数里退出程序并完全释放资源 ●●●【阿日】好走...●●● Delphi连接Sybase问题 PageControl1控件是不是可以改成这样子? 谁有GBK、Big5的码表?给500分!!! 在下数学很不OK,我能成为高手吗? zcvz delphi中dll文件的pchar怎样释放内存?急?在线等 哪位高手有Delphi函数手册???最好是电子版的. delphi6多层问题 哪儿有DREAM的SCRIPT FOR DELPHI6 的下?
tcanvans首先将菜单的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事件中改变颜色。