你连TMenu也不用吗?那就用API慢慢写吧。

解决方案 »

  1.   

    给你一个贴子
    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事件中改变颜色。