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

Delphi實用代碼:自繪XP風格菜單

編輯:Delphi

 這是以前寫的代碼,自繪XP風格的菜單,硬盤壞了後以為沒了,最後寫的一個軟件要自定義風格,“翻箱倒櫃”的終於在我可愛的古董機^_^上找到了一個應用的例子。

  把主菜單作以下調整:

 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