想写个自定的菜单,但跟踪时发现TMyMenuItem.DrawItem里面的代码没有执行,
只执行了TMenuItem.DrawItem,不知何故???type
  TMyMenuItem = class(TMenuItem)
    procedure DrawItem(ACanvas: TCanvas; ARect: TRect; Selected: Boolean); override;
  end;var
  MyMenu: TMainMenu;
procedure TForm1.Button1Click(Sender: TObject);
var
  item: TMyMenuItem;
  subItem: TMyMenuItem;
begin
  mymenu := TMainMenu.Create(Self);
  item := TMyMenuItem.Create(nil);
  item.Caption := 'ok';
  mymenu.Items.Add(item);  subItem := TMyMenuItem.Create(nil);
  subItem.Caption := 'one';
  item.Add(subitem);  Mymenu.OwnerDraw := true;
  Self.Menu := MyMenu;
end;//没有执行下面的过程,为什么???
procedure TMyMenuItem.DrawItem(ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
begin
  if Selected then
  begin
    ACanvas.Brush.Color := clBlack;
    ACanvas.FrameRect(ARect);
    ACanvas.TextRect(ARect, ARect.Left + 5, ARect.Top + 2, Caption);
  end
  else begin
    ACanvas.TextRect(ARect, ARect.Left + 5, ARect.Top + 2, Caption);
  end;
end;

解决方案 »

  1.   

    OwnerDraw你忘记设置为true吧
    mainMenu的OwnerDraw:=true;
    的时候才会自己画,你试试看是不是
      

  2.   

    procedure DrawItem(ACanvas: TCanvas; ARect: TRect; Selected: Boolean); override;
      

  3.   

    初看这段代码觉得没什么问题,就我在我机器就试了一下,还真是不能正确运行。什么原因呢?哎,试了几次都不行。看VCL。  if ( ParentMenu <> nil ) and ( ParentMenu.OwnerDraw or ( ImageList <> nil ) ) and
        ( Assigned( FOnAdvancedDrawItem ) or Assigned( FOnDrawItem ) ) then
      begin
        DrawItem( ACanvas, ARect, Selected );
        if Assigned( FOnAdvancedDrawItem ) then
          FOnAdvancedDrawItem( Self, ACanvas, ARect, State );
      end于是找到如上代码,就是说 FOnAdvancedDrawItem 或 FOnDrawItem 必须有一个被Assign才能DrawItem。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, StdCtrls, Buttons;
    type  TMyMenuItem = class( TMenuItem )
        procedure DrawItem( ACanvas: TCanvas; ARect: TRect; Selected: Boolean ); override;
      end;  TForm1 = class( TForm )
        Button1: TButton;
        procedure Button1Click( Sender: TObject );
      private
        mymenu: TMainMenu;
        item: TMyMenuItem;
        subItem: TMyMenuItem;
      public
       procedure MyDrawItem(Sender: TObject; ACanvas: TCanvas;
          ARect: TRect; Selected: Boolean); //我新加的   -----------
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TMyMenuItem }procedure TMyMenuItem.DrawItem( ACanvas: TCanvas; ARect: TRect;
      Selected: Boolean );
    begin
      //inherited;
      ShowMessage( 'TMyMenuItem.DrawItem' );
    end;procedure TForm1.Button1Click( Sender: TObject );
    begin  mymenu := TMainMenu.Create( Self );
      Mymenu.OwnerDraw := true;  item := TMyMenuItem.Create( nil );
      item.Caption := 'ok';  mymenu.Items.Add( item );  subItem := TMyMenuItem.Create( nil );  subItem.OnDrawItem:=  MyDrawItem;  //加了这一句   -----------  subItem.Caption := 'one';
      item.Add( subitem );  Self.Menu := MyMenu;
    end;procedure TForm1.MyDrawItem(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; Selected: Boolean);
    begin
     //  这里什么都不做   ----------------
    end;end.看看是不是正确执行了!!!!!!!!!