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;