程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi制作帶圖標的彈出式選單

Delphi制作帶圖標的彈出式選單

編輯:Delphi

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

Delphi一般提供兩種設置圖標的方法,一個是在Project Options 中指定應用程序的圖標,另一個是在Object 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: Word;
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環境下調試通過

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