Delphi製作帶圖示的彈出式選單 (轉)

worldblog發表於2007-12-06
Delphi製作帶圖示的彈出式選單 (轉)[@more@]杏

  介面的一大特色就是顯示豐富多彩的圖示,圖示不僅美化了Windows的桌面,而且便於直觀的操作,給帶來了極大的方便。在設計介面時,Windows風格是很好的參考。

  一般提供兩種設定圖示的方法,一個是在Project Options 中指定應用程式的圖示,另一個是在 Inspector 的properties頁中提供Icon特性。如果想設計出像Windows開始選單那樣美麗的彈出選單,就要自己編寫程式碼了。

  我們知道大多數Windows應用程式本身帶有圖示,只要將程式本身所帶的圖示取出,調整圖示的大小加入到彈出選單中,一個美麗的選單就完成了。

  首先用ExtractAssociatedIcon從某一程式中獲取圖示,而圖示的尺寸大小不一,不一定能直接新增到選單中,同時Delphi沒有提供調整圖示大小的功能,這就必須將圖示轉化成位件,然後調整點陣圖檔案的大小,最後用點陣圖檔案取代選單專案即可。其如下:

  type

   TForm1 = class(TForm)

   MainMenu1: TMainMenu;

   File1: TMenuItem;

  /**** 選單條中的專案****/

   Open1: TMenuItem;

  /****選單檔案中的專案 ****/

  procedure FormCreate(Sender: TObject);

  procedure FormShow(Sender: TObject);

   private

   {區域性引數宣告}

   public

   {全域性引數宣告}

   Icn, Txt, MnuItm: TBitmap;

   end;

  procedure TForm2.FormCreate(Sender: TObject);

  var R: TRect;

   HIcn: HIcon;

   Ic: TIcon;

   Index: ;

   FileName: PChar;

  begin

   /**從某一程式中獲取圖示**/

   Ic:=TIcon.Create;

   Ic.Handle:=ExtractAssociatedIcon(Hinstance, /*檔名稱及其路徑*/, Index);

   /** 建立點陣圖**/

   Txt:=TBitmap.Create;

   with Txt do

   begin

   Width:=Canvas.TextWidth(' Test');

   Height:=Canvas.TextHeight(' Tes');

   Canvas.TextOut(0,0,' Test');

  end;

   /**將圖示複製到上述建立的點陣圖中,並調整它的尺寸 **/

   Icn:=TBitmap.Create;

   with Icn do

   begin

   Width:=32;

   Height:=32;

   Brush.Color:=clBtnFace;

   Canvas.Draw(0,0,Ic);

   end;

   /** 建立最後的點陣圖檔案**/

   MnuItm:=TBitmap.Create;

   with MnuItm do

   begin

   Width:=Txt.Width+18;

   Height:=18;

   with Canvas do

   begin

   Brush.Color:=clBtnFace;

   Pen.Color:=clBtnFace;

   Brush.Style:=bsSolid;

   Rectangle(0,0,Width,Height);

   CopyMode:=cmSrcAnd;

   StretchDraw(Rect(0,0,16,16),Icn);

   CopyMode:=cmSrcAnd;

   Draw(16,8-(Txt.Height div 2),Txt);

   end;

   end;

   end;

  procedure TForm2.FormShow(Sender: TObject);

  var

   ItemInfo: TMenuItemInfo;

   hBmp1 : THandle;

  begin

   HBmp1:=MnuItm.Handle;

   with ItemInfo do

   begin

   cbSize:= SizeOf( ItemInfo );

   fMask:= MIIM_TYPE;

   fType:= MFT_BITMAP;

   dwTypeData:= PChar(MakeLong( hBmp1, 0 ));

   end;

   /** 用點陣圖取代選單專案Open1 **/

  SetMenuItemInfo( GetSubMenu( MainMenu1.Handle, File1.MenuIndex ),

  Open1.MenuIndex, true, ItemInfo );

   end;

  以上程式在Windows98、Delphi 4.0環境下透過

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988874/,如需轉載,請註明出處,否則將追究法律責任。

相關文章