建议你用XPBarMenu这个控件,绝对推荐。

解决方案 »

  1.   

    那里有这个控件啊?它不是DELPHI的内部控件吧?
      

  2.   

    CoolMenus Pro
    www.cooldev.com
      

  3.   

    不是,你在相关的delphi网站上搜一下,具体地址我忘了,肯定有的。。完全可以解决你的问题,而且很cool...................
      

  4.   

    CoolMenus Pro
    www.cooldev.com没有XPBarMenu好用(个人之见)
      

  5.   

    xpmenu kingron.myetang.com由下载!
      

  6.   

    菜单项里有bitmap这个属性呀!直接就可以加图标
      

  7.   

    首先利用图像软件建立一个长条型的位图文件(你可以根据你的需要设定图像的高宽比,在我的图像中是10:1)。在Delphi中建立一个新的工程,在Form1中加入一个TImage控件,将控件的AutoSize属性设置为True。然后在Form1中加入一个TMainMenu控件,将它的OwnerDraw属性设置为True(这一点很重要,否则程序无法实现)在该TMainMenu下加入6个TMenuItem对象(鼠标右健点击TMainMenu控件,然后点击弹出菜单的Menu Designer 项,就可以在设计窗口中添加菜单条了),将它们的Name属性分别设置为 Caption1、Caption2、…、Caption6。
     
    unit OwnerMenu;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls, ImgList;
    type
      TForm1 = class(TForm)
      MainMenu1: TMainMenu;
      Main1: TMenuItem;
      Caption1: TMenuItem;
      Caption2: TMenuItem;
      Caption3: TMenuItem;
      Caption4: TMenuItem;
      Caption5: TMenuItem;
     
      Caption6: TMenuItem;
     
      Image1: TImage;
     
      procedure Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
      procedure Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
      procedure Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
      procedure Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
      procedure Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
      procedure Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
      procedure Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
      procedure Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
      procedure Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
      procedure Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
      procedure Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
      procedure Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
      private
     
      { Private declarations }
     
      public
     
      procedure DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;
     
      Selected: Boolean;strOUt:String);
     
      { Public declarations }
     
      end;
     
     
     
    var
     
      Form1: TForm1;
     
      i,iH,Ind,iW,iRate:Integer;
     
      rTemp:TRect;
     
      iG1,iG2:Integer;
     
     
     
    implementation
     
     
     
    {$R *.DFM}
     
     
     
    procedure TForm1.DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;
     
      Selected: Boolean;strOut:String);
     
    var
     
      j:Integer;
     
    begin
     
      i:=ARect.Bottom -ARect.Top; //获得贴图的高度和宽度
     
      Ind:=Sender.MenuIndex;
     
      iH:=Round(Image1.Height/6*Ind); //获得贴图位置
     
      //将Image上相应位置的位图复制到菜单上
     
      StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
     
      Image1.Width,Round(Image1.Height/6),SRCCOPY);
     
     
     
      if Selected then begin //该菜单项被选中
     
      ACanvas.Font.Color := clWhite;
     
      rTemp:=ARect;
     
      rTemp.Left := rTemp.left+iW;
     
      iG1:=Round((rTemp.Right - rTemp.Left)/10);
     
     
     
      rTemp.Right := rTemp.Left +iG1;
     
      for j:= 0 to 9 do begin //通过循环设置色彩渐变效果
     
      ACanvas.Brush.Color := RGB(0,0,j*25);
     
      ACanvas.FillRect(rTemp);
     
     
     
      rTemp.Left := rTemp.Left +iG1;
     
      rTemp.Right := rTemp.Left +iG1;
     
      end;
     
      end
     
      else begin //该菜单项没有被选中
     
      ACanvas.Brush.Color := cl3DLight; //设置背景色为浅灰
     
      rTemp:=ARect;
     
      rTemp.Left := rTemp.left+iW;
     
      ACanvas.FillRect(rTemp);
     
      ACanvas.Font.Color := clBlack;
     
      end;
     
      //设置Canvas的画笔填充模式为透明
     
      ACanvas.Brush.Style:=bsClear;
     
      //在菜单上输出文字
     
      ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
     
    end;
     
     
     
    procedure TForm1.Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
    begin
     
      //在OnMeasureItem事件中改变菜单的宽度和高度,下面5个程序同
     
      //改变菜单的宽度和高度以容纳文本
     
      Height:=ACanvas.TextHeight('Caption1')+5;
     
      Width:=ACanvas.TextWidth('Caption1')+5;
     
      iRate:=Round(Image1.Height/(Height*6));
     
      iW:=Round(Image1.Width /iRate);
     
      Width:=Width+iW; //根据计算改变菜单宽度以容纳附加的文本
     
    end;
     
     
     
    procedure TForm1.Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
    begin
     
      Height:=ACanvas.TextHeight('Caption1')+5;
     
      Width:=ACanvas.TextWidth('Caption1')+5;
     
      iRate:=Round(Image1.Height/(Height*6));
     
      iW:=Round(Image1.Width /iRate);
     
      Width:=Width+iW;
     
    end;
     
     
     
    procedure TForm1.Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
    begin
     
      Height:=ACanvas.TextHeight('Caption1')+5;
     
      Width:=ACanvas.TextWidth('Caption1')+5;
     
      iRate:=Round(Image1.Height/(Height*6));
     
      iW:=Round(Image1.Width /iRate);
     
      Width:=Width+iW;
     
    end;
     
     
     
    procedure TForm1.Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
    begin
     
      Height:=ACanvas.TextHeight('Caption1')+5;
     
      Width:=ACanvas.TextWidth('Caption1')+5;
     
      iRate:=Round(Image1.Height/(Height*6));
     
      iW:=Round(Image1.Width /iRate);
     
      Width:=Width+iW;
     
    end;
     
     
     
    procedure TForm1.Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
    begin
     
      Height:=ACanvas.TextHeight('Caption1')+5;
     
      Width:=ACanvas.TextWidth('Caption1')+5;
     
      iRate:=Round(Image1.Height/(Height*6));
     
      iW:=Round(Image1.Width /iRate);
     
      Width:=Width+iW;
     
    end;
     
     
     
    procedure TForm1.Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
     
      var Width, Height: Integer);
     
    begin
     
      Height:=ACanvas.TextHeight('Caption1')+5;
     
      Width:=ACanvas.TextWidth('Caption1')+5;
     
      iRate:=Round(Image1.Height/(Height*6));
     
      iW:=Round(Image1.Width /iRate);
     
      Width:=Width+iW;
     
    end;
     
     
     
    procedure TForm1.Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
    begin
     
      DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption1');
     
    end;
     
     
     
    procedure TForm1.Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
    begin
     
      DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption2');
     
    end;
     
     
     
    procedure TForm1.Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
    begin
     
      DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption3');
     
    end;
     
     
     
    procedure TForm1.Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
    begin
     
      DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption4');
     
    end;
     
     
     
    procedure TForm1.Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
    begin
     
      DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption5');
     
    end;
     
     
     
    procedure TForm1.Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
    begin
     
      DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption6');
     
    end;
     
     
     
    end.