国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

自繪XP風格菜單

2019-11-18 18:19:51
字體:
來源:轉載
供稿:網友

  這是以前寫的代碼,自繪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;


上一篇:中文轉碼器的工作原理

下一篇:大自然的BUG、人的BUG、軟件的疑難雜癥

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 桓台县| 敖汉旗| 嘉荫县| 小金县| 吴江市| 宿松县| 长白| 呼伦贝尔市| 馆陶县| 元氏县| 含山县| 百色市| 岳阳县| 石楼县| 澎湖县| 桑日县| 晋城| 新宾| 南川市| 永济市| 苍山县| 澄城县| 阳泉市| 东至县| 云霄县| 贵港市| 珠海市| 周宁县| 鹤山市| 平潭县| 五家渠市| 绥阳县| 寿光市| 衡阳市| 武汉市| 波密县| 环江| 璧山县| 乐平市| 柳河县| 柳河县|