delphiDelphi多彩的菜单实例
Delphi多彩的菜单
实例说明
网上的许多应用程序都具有漂亮的菜单。默认情况下,使用Delphi提供的TMainMenu组件只能设置标准的Windows风格菜单,如何能够自定义菜单呢?本实例演示如何自定义菜单,效果如图1.5所示。

1.5Delphi多彩的菜单
技术要点
在Delphi中重新绘制TMainMenu组件,首先需要将OwnerDraw属性设置为True,然后双击TMainMenu组件打开菜单编辑器,添加菜单项。选中菜单项,在对象观察器中编写OnAdvancedDrawItem事件处理过程,OnAdvancedDrawItem事件在菜单项(OwnerDraw属性设置为True)需要绘制时触发。
实现过程
1.新建一个工程,将主窗口命名为Form1。
2.在Form1窗体上放置TImage、TmainMenu和TStatusBar等组件。设置TImage组件的Picture属性,为其加载一幅图像。双击TMainMenu组件,打开菜单编辑窗口,想TMainMenu组件中添加菜单项。
3.程序代码如下:
procedure TForm1.N3AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState);
begin
ACanvas.Brush.Color := clwhite;
if odSelected in State then
begin
ACanvas.Font.Color := clRed;
ACanvas.Pen.Color := clBlue;
ACanvas.Rectangle(Rect(1,(TMenuItem(Sender).Tag-1)*20,ARect.Right-1,(TMenuItem(Sender).Tag-1)*20+15));
NotifyMessage(TMenuItem(Sender).Caption);
end
else
begin
ACanvas.Font.Color := clBlack;
ACanvas.Pen.Color := clWhite;
ACanvas.Rectangle(Rect(1,(TMenuItem(Sender).Tag-1)*20,ARect.Right-1,(TMenuItem(Sender).Tag-1)*20+15));
end;
ACanvas.TextOut(4,(TMenuItem(Sender).Tag-1)*20+2,TMenuItem(Sender).Caption);
end;
procedure TForm1.N1AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState);
begin
SetBkMode(ACanvas.Handle,TRANSPARENT);
if odSelected in State then
begin
ACanvas.Font.Color := clRed;
ACanvas.Pen.Color := clBlue;
ACanvas.Brush.Color := Color;
ACanvas.Rectangle(Rect(TMenuItem(Sender).Tag-2,32,ARect.Right-5,47));
end
else
begin
ACanvas.Font.Color := clBlack;
ACanvas.Pen.Color := Color;
ACanvas.Brush.Color := Color;
ACanvas.Rectangle(Rect(TMenuItem(Sender).Tag-2,32,ARect.Right-5,47));
end;
ACanvas.TextOut(TMenuItem(Sender).Tag,34,TMenuItem(Sender).Caption);
end;