程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 自繪XP風格菜單

自繪XP風格菜單

編輯:Delphi

  這是以前寫的代碼,自繪XP風格的菜單,硬盤壞了後以為沒了,最後寫的一個軟件要自定義風格,“翻箱倒櫃”的終於在我可愛的古董機^_^上找到了一個應用的例子。還是把它放到Blog上來,即可共享又可作為備用 :)
  把主菜單的OnMeasureItem指向MeasureMainItem、OnAdvancedDrawItem指向DrawMainItem,子菜單的OnMeasureItem指向MeasureSubItem、OnAdvancedDrawItem指向DrawSubItem,調整顏色或使用默認顏色即可達到效果

  //調整主菜單項尺寸
  
procedure MeasureMainItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
  begin
    Width := Width + 6;
    Height := Height + 2;
  end;

  //調整子菜單項尺寸
  
procedure MeasureSubItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
  begin
    Width := Width + 20;
    Height := Height + 2;
  end;

  //繪制主菜單內容
  
procedure DrawMainItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
  const
    MainMenuBackColor      : TColor = $DEEDEF;
    MainMenuBorderColor    : TColor = $DEEDEF;
    MainMenuSelectedBackColor  : TColor = $DFA988;
    MainMenuSelectedBorderColor: TColor = $C08000;
    MainMenuHotLightBackColor  : TColor = $DEEDEF;
    MainMenuHotLightBorderColor: TColor = $800080;
    MainMenuGrayedBackColor  : TColor = $DEEDEF;
  var
    BrushColor, PenColor: TColor;
    TextRect: TRECT;
  begin
    if odGrayed in State then
    begin
      BrushColor := MainMenuGrayedBackColor;
      PenColor := MainMenuGrayedBackColor;
    end
    else
      if odHotLight in State then
      begin   //鼠標劃過
  
      BrushColor := MainMenuHotLightBackColor;
        PenColor := MainMenuHotLightBorderColor;
      end
      else
      if odSelected in State then
      begin
        BrushColor := MainMenuSelectedBackColor;
        PenColor := MainMenuSelectedBorderColor;
      end
      else
      begin
        BrushColor := MainMenuBackColor;
        PenColor := MainMenuBackColor;
        if TMenuItem(Sender).Caption = '幫助(&H)' then ARect.Right := ARect.Right + 1600;
      end;
    ACanvas.Brush.Color := BrushColor;
    ACanvas.Pen.Color := PenColor;
    //ACanvas.FillRect(ARect);
  
  ACAnvas.Rectangle(ARect);
    ACanvas.Brush.Style := bsClear;
    //繪出文字
  
  if odGrayed in State then
      ACanvas.Font.Color := clBtnShadow
    else
      ACanvas.Font.Color := clBlack;
    SetRect(TextRect, ARect.left+10, ARect.top+3, ARect.right, ARect.bottom);
    DrawText(ACanvas.Handle, PChar(TMenuItem(Sender).Caption), Length(TMenuItem(Sender).Caption),
         TextRect, DT_LEFT);
  end;

  //繪制子菜單內容
  
procedure DrawSubItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
  const
    SubMenuBackColor      : TColor = $F7F8F9;
    SubMenuBorderColor    : TColor = $DEEDEF;
    SubMenuSelectedBackColor  : TColor = $EED2C1;
    SubMenuSelectedBorderColor: TColor = $C08000;
    SubMenuLineColor      : TColor = $C8D0D4;
    //SubMenuHotLightBorderColor: TColor = $C08000;
  
  SubMenuGrayedBackColor  : TColor = $F7F8F9;//$DEEDEF;
  
var
    BrushColor, PenColor: TColor;
    TextRect: TRECT;
    str: String;
    ImageList: TCustomImageList;
  begin
    if (odGrayed in State) and not(TMenuItem(Sender).IsLine) then
    begin
      BrushColor := SubMenuGrayedBackColor;
      {if odSelected in State then
        PenColor := SubMenuSelectedBorderColor
      else}
        PenColor := SubMenuGrayedBackColor;
    end
    else
      if odSelected in State then
      begin
        BrushColor := SubMenuSelectedBackColor;
        PenColor := SubMenuSelectedBorderColor;
      end
      else
      begin
        BrushColor := SubMenuBackColor;
        PenColor := SubMenuBackColor;
      end;
    ACanvas.Brush.Color := BrushColor;
    ACanvas.Pen.Color := PenColor;
    ACAnvas.Rectangle(ARect);
    if not(odSelected in State) or (odGrayed in State) then
    begin
      ACanvas.Brush.Color := SubMenuBorderColor;
      ACanvas.FillRect(Rect(ARect.Left, ARect.Top, ARect.Left+20, ARect.Bottom));
    end;
    //繪文字和快捷鍵
  
  if TMenuItem(Sender).IsLine then
    begin
      ACanvas.Brush.Color := SubMenuLineColor;
      ACanvas.Pen.Color := SubMenuLineColor;
      ACanvas.FillRect(Rect(ARect.Left+23, ARect.Top+(ARect.Bottom-ARect.Top) div 2-1,
               ARect.Right-2, ARect.Top+(ARect.Bottom-ARect.Top) div 2));
    end
    else
    begin
      ACanvas.Brush.Style := bsClear;
      if odGrayed in State then
        ACanvas.Font.Color := clBtnShadow
      else
        ACanvas.Font.Color := clBlack;
      str := TMenuItem(Sender).Caption;
      SetRect(TextRect, ARect.Left+24, ARect.Top+3, ARect.Right, ARect.Bottom);
      DrawText(ACanvas.Handle, PChar(str), Length(str), TextRect, DT_LEFT);
      str := ShortCutToText(TMenuItem(Sender).ShortCut);
      SetRect(TextRect, ARect.Left+24, ARect.Top+3, ARect.Right-10, ARect.Bottom);
      DrawText(ACanvas.Handle, PChar(str), Length(str), TextRect, DT_RIGHT);
      //
  
    if TMenuItem(Sender).Checked then
      begin
        ACanvas.Font.Charset := DEFAULT_CHARSET;
        ACanvas.Font.Name := 'Webdings';
        if TMenuItem(Sender).RadioItem then
          ACanvas.TextOut(ARect.Left+4, ARect.Top, '=')
        else
        begin
          ACanvas.Font.Height := -16;
          ACanvas.TextOut(ARect.Left+2, ARect.Top, 'a');
        end;
      end;
    end;
    //繪制圖片
  
  ImageList := TMenuItem(Sender).GetImageList;
    if ImageList<>nil then
      if (odSelected in State) and not(odGrayed in State) then
        ImageList.Draw(ACanvas, ARect.left+2, ARect.Top+2, TMenuItem(Sender).ImageIndex)
      else
        ImageList.Draw(ACanvas, ARect.left+3, ARect.Top+3,
                 TMenuItem(Sender).ImageIndex, TMenuItem(Sender).Enabled);
  end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved