想写个自定的菜单,但跟踪时发现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;
只执行了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;
mainMenu的OwnerDraw:=true;
的时候才会自己画,你试试看是不是
( 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.看看是不是正确执行了!!!!!!!!!