杏
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環境下除錯通過