熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

特效處理:Delphi中制作特效菜單

2013-11-11 21:04:46  來源: Delphi編程 
菜單是應用程序中常見的用戶界面之一Delphi具有功能強大的菜單設計器可以很快地實現標准的菜單但有時候應用程序需要實現特定類型的菜單我們常用的如金山毒霸的彈出式菜單就是一例可以在菜單項裡顯示自己定義的圖片自己設置的文字以及自設置的菜單項大小這種菜單稱為自繪制菜單(Ownerdraw MenuItem)當然功能不止於此我們還可以實現更好的菜單下面就一起來做一個顯示大圖片和大文字的菜單吧!
  
  一程序思路
  Delphi在繪制每個菜單時采用一個比較獨特的方法首先Delphi會通過菜單的OwnerDraw屬性來判定在菜單中是否允許自繪制菜單若OwnerDraw屬性為真(TRUE)則Delphi首先會觸發每個菜單項的OnMeasureItem事件來獲取自繪制菜單項的大小(WidthHeight)然後觸發OnDrawItem事件允許用戶在這裡繪制自己的菜單
  
  二實現菜單
  第一步創建一個新的項目並添加相應的組件
  
  啟動Delphi新建一個應用此時出現一個窗體將其Name屬性改為frmSample添加一個彈出式菜單到窗體frmSample並將此菜單Name屬性設置為mnuOwnerDraw
  
  設置窗體frmSample的PopupMenu屬性為mnuOwnerDraw這時運行程序你會發現除了彈出式菜單仍然顯示為空的菜單繼續往窗體上添加一個TactionList對象雙擊以設計這一ActionList對象往其中增加一個Action對象並設置其Name屬性為actSample往窗體上放置一個Label對象其Name屬性為Label調整Label的字體大小以便在利用Label顯示數據時可以清楚地觀察到
  
  現在往程序的變量聲明部分(VAR)添加要用到的聲明
  
  ePic:TPicture;      //用於裝載程序要用到的圖像
  
  miSample:TMenuItem;    //菜單項的聲明用於動態生成菜單項
  
  I:integer;        //當多次右擊鍵時記錄右單擊次數從而生成不同的菜單項
  
  首先在程序的初始化部分初始化擊鍵次數為
  
  initialization
  
  i:=;
  
  第二步實現OnMeasureItem和OnDrawItem
  
  往窗體frmSample的實現(Implementation)部分添加如下過程聲明
  
  AMeasureItem (Sender: TObject; ACanvas: TCanvas; var Width Height: Integer);
  
  ADrawItem (Sender: TObject; ACanvas: TCanvas; ARect: TRect;Selected: Boolean);
  
  往往手工輸入比較麻煩比較現實的做法是利用菜單設計器添加一個菜單項設置其Name屬性為A然後選擇OnMeasureItem和 OnDrawItem事件雙擊即可Delphi會為你自動輸入如上代碼
  
  往AMeasureItem中添加如下代碼
  
  Begin
  
  Width: =; //設置菜單項的寬度
  
  Height: =; //設置菜單項的高度
  
  End;
  
  往ADrawItem中添加如下代碼
  
  Begin
  
  If I= then
  
  begin
  
  ePic:=TPictureCreate;//創建一個用於裝載圖片的Tpicture對象
  
  ePicLoadFromFile(abmp);//從項目所在目錄裝載圖片
  
  acanvasDraw(arectLeftarectTopePicGraphic); //將圖片在菜單項中繪制出來
  
  acanvasFontSize:=;//設置菜單項的字體大小
  
  acanvasFontColor:=clPurple; //設置菜單項字體顏色
  
  acanvasTextOut(arectLeft+arectTop+A ); //在菜單項中輸出文字A
  
  end;
  
  if i= then
  
  begin
  
  ePic:=TPictureCreate; //創建一個用於裝載圖片的Tpicture對象
  
  ePicLoadFromFile(bbmp);   //從項目所在目錄裝載圖片
  
  acanvasDraw(arectLeftarectTopePicGraphic); //將圖片在菜單項中繪制出來
  
  acanvasFontSize:=;     //設置菜單項的字體大小
  
  acanvasFontColor:=clblue;     //設置菜單項字體顏色
  
  acanvasTextOut(arectLeft+arectTop+B); //在菜單項中輸出文字A
  
  end;
  
  if i= then
  
  begin
  
  ePic:=TPictureCreate;
  
  ePicLoadFromFile(cbmp);
  
  acanvasDraw(arectLeftarectTopePicGraphic);
  
  acanvasFontSize:=;
  
  acanvasFontColor:=clred;
  
  acanvasTextOut(arectLeft+arectTop+C);
  
  end;
  
  End;
  
  下面我們實現菜單項的在被單擊時的行為即實現actSample對象的OnExcute事件如下所示
  
  actSampleExecute(Sender: TObject);
  
  begin
  
  labelCaption:=inttostr(i);
  
  end;
  
  第三步將菜單項動態添加到菜單中
  
  I:=I+;//計算程序中的擊鍵次數
  
  miSample:=TMenuItemCreate(form);   //動態創建菜單項
  
  miSampleOnClick :=actSampleOnExecute; //為菜單項添加動作
  
  miSampleOnDrawItem := ADrawItem;    //為菜單項設置顯示方式
  
  miSampleOnMeasureItem := aMeasureItem; //為菜單項設置大小
  
  mnuOwnerDrawItemsInsert(miSample); //將菜單項添加到菜單中
  
  三程序效果
  現在可以應用程序了你會發現只要你在窗體上單擊右鍵窗體會有一個彈出式菜單顯示出來而且每一個菜單項都隨著右鍵單擊次數的不同而不同當次數大於菜單顯示為一系列的空菜單項但是不論何時你單擊任何一個菜單項Label的都會顯示你當前的右鍵在窗體上單擊的次數值
  
  四程序加強
  如果我們在程序中為我們所動態創建的每一個菜單項都實現不同的OnMeasureItem和OnDrawItem事件的話那麼每一個菜單項都有自己的大小處理與顯示處理那我們就可以實現一些更好的功能例如可以實現大小不同的菜單項第一個菜單項可以比較小以後的菜單項可以比較大同樣還可以在一些菜單中實現更好的功能每個菜單顯示自己圖標和特定字體的文字
  
  但是利用這種方法制作自定義菜單的功能還是受到了一定的限制我們只能對OnAdvancedDrawItemOnClickOnDrawItemOnMeasureItem等有限幾個事件作出反應並對菜單項進行定制我們沒有辦法對鼠標事件作出反應利用鼠標事件當鼠標滑過菜單項時我們可以實現諸如加亮漸變或其他的菜單項顯示技術顯然這是十分有意義的
  
  要實現上述技術我們需要從TcustomMenuItem中繼承並定義一個新類並重新聲明OnMouseMove事件並給出實現諸如加亮或漸變等技術的代碼即可
From:http://tw.wingwit.com/Article/program/Delphi/201311/8434.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.