我想把菜单搞得漂亮些。

解决方案 »

  1.   

    moudy(勇士(绝对盗版)) :想起来了么??  任务栏右键菜单!
      

  2.   

    可以用 DeleteMenu(mymenu, 0, MF_BYPOSITION);
          DeleteMenu(mymenu, 0, MF_BYPOSITION); //把系统的菜单一个个去掉。
      

  3.   

    我在Delphi7下(delphi7不是可以搞成 xp 样式的菜单格式么?) 我想把popumenu1的菜单 或者mainmenu菜单放到任务栏菜单里)
      

  4.   

    给你参考一下unit FMain;interfaceuses
      Windows,  Graphics,  Forms,  Menus,  Classes;type
      TfrmMain = class(TForm)
        mnuPopup: TPopupMenu;
        MainMenu1: TMainMenu;
        sdfsdf1: TMenuItem;
        sdfsdf2: TMenuItem;
        dfgdfg1: TMenuItem;
        dfgdfg2: TMenuItem;
        N1: TMenuItem;
        werwer1: TMenuItem;    procedure DrawMenu(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
        procedure MeasureMenu(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      end;var
      frmMain: TfrmMain;
      bmp1:tbitmap;
    implementation{$R *.DFM}procedure TfrmMain.DrawMenu(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
    var
      cTemp:  TCanvas;
      sText:  String;
      mWnd:   HWND;
      rMenu:  TRect;begin  ACanvas.BrushCopy(ARect, bmp1, ARect, clBlack);
      ACanvas.Brush.Style := bsclear;
      sText := TMenuItem(Sender).Caption;
      acanvas.Font.Color:=clred;
      with ACanvas do begin
          if odSelected in State then begin
          pen.Style:=psInsideFrame;
          Brush.Color := RGB(110, 131, 184);
          Pen.Color   := RGB(47, 60, 93);
          Rectangle(ARect);
          end;     if sText = '-' then begin
          // Draw line
          ACanvas.Pen.Color := RGB(0, 0, 0);
          MoveTo(ARect.Left, ARect.Top + ((ARect.Bottom - ARect.Top) div 2));
          LineTo(ARect.Right, ARect.Top + ((ARect.Bottom - ARect.Top) div 2));
        end else begin
          // Draw text
          Inc(ARect.Left, 12);
          DrawText(Handle, PChar(sText), Length(sText), ARect, DT_LEFT or DT_VCENTER or DT_SINGLELINE);
        end;
      end;
      // 画边框的,效果是平面的
      mWnd := WindowFromDC(ACanvas.Handle);  if mWnd <> Self.Handle then begin
        cTemp := TCanvas.Create();
        cTemp.Handle := GetDC(0);    Windows.GetWindowRect(mWnd, rMenu);    cTemp.Brush.Color := RGB(120, 120, 120);
        cTemp.FrameRect(rMenu);    InflateRect(rMenu, -1, -1);
        cTemp.Brush.Color := RGB(240, 240, 240);
        cTemp.FrameRect(rMenu);    InflateRect(rMenu, -1, -1);
        cTemp.FrameRect(rMenu);    ReleaseDC(0, cTemp.Handle);
        cTemp.Free();  end;end;procedure TfrmMain.MeasureMenu(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
    begin
      Inc(Width,50);//调整菜单的宽度  inc(height,15);//调整每一个item的高度,这一句可以不要,使用默认值
    end;procedure TfrmMain.FormCreate(Sender: TObject);
    begin
     bmp1:=tbitmap.Create;
     bmp1.loadfromfile('e:\aaa.bmp');
    end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    bmp1.Free;
    end;end.
      

  5.   

    好, 多谢。 搞定了别忘了通知我一下![email protected]
      

  6.   

    这个我自己实现了,和你的要求不大相同,也能起到美化的效果。希望对你会有帮助。
    记得要把owerdraw设为true。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, Menus;type
      TForm1 = class(TForm)
        Image1: TImage;
        MainMenu1: TMainMenu;
        aa1: TMenuItem;
        bb1: TMenuItem;
        cc1: TMenuItem;
        procedure aa1MeasureItem(Sender: TObject; ACanvas: TCanvas;var Width, Height: Integer);
        procedure bb1MeasureItem(Sender: TObject; ACanvas: TCanvas;var Width, Height: Integer);
        procedure cc1MeasureItem(Sender: TObject; ACanvas: TCanvas;var Width, Height: Integer);
        procedure aa1DrawItem(Sender: TObject; ACanvas: TCanvas;ARect: TRect; Selected: Boolean);
        procedure bb1DrawItem(Sender: TObject; ACanvas: TCanvas;ARect: TRect; Selected: Boolean);
        procedure cc1DrawItem(Sender: TObject; ACanvas: TCanvas;ARect: TRect; Selected: Boolean); 
      private
        { Private declarations }
      public
        { Public declarations }
      procedure DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect; Selected: Boolean;strOUt:String);
       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.aa1MeasureItem(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.bb1MeasureItem(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.Cc1MeasureItem(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.aa1DrawItem(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; Selected: Boolean);
    begin
      DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'aa');
    end;procedure TForm1.bb1DrawItem(Sender: TObject; ACanvas: TCanvas;
     
      ARect: TRect; Selected: Boolean);
     
    begin
      DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'bb');
     
    end;
    procedure TForm1.cc1DrawItem(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; Selected: Boolean);
    begin
      DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'cc');
    end;end.