在Delphi中我們可以靜態或動態地創建窗體,所謂靜態創建窗體是指在設計程序時一並建好窗體,動態創建是指在程序運行時根據需要使用Create方法創建新窗體,然後使用Show方法來顯示窗體。但令人遺憾的是,在顯示非啟動窗體時,不論用戶在程序中創建多少個窗體,每個應用程序只能有一個程序圖標,在Windows的任務條上只顯示一個程序圖標。
在編寫應用程序時,有時我們需要同一應用程序顯示兩個程序圖標,那麼如何實現呢?我們只需重載窗體的CreateParams過程即可實現,下面以一個示例來說明如何使用。
一、應用實例
在Delphi集成環境中創建兩個窗體,其中窗體一為主窗體,即程序啟動窗體,在其上添加顯示窗體二的按鈕。因為要讓窗體顯示的同時在任務欄上再顯示一個程序圖標,為了區別,將窗體二的圖標更換,然後在窗體二的private部分聲明重載CreateParams過程:
unit Unit2;
……
protected
procedure CreateParams(var Params: TCreateParams); override;
最後在單元文件的實現部分(Implementation)添加重載過程的實現代碼:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
Inherited CreateParams(Params);
Params.WndParent := GetDesktopWindow;
end;
運行程序中,當按下啟動窗體中的“顯示窗口二”按鈕時,會顯示窗體二,並且在Windows的任務欄上同時會出現一個新的程序圖標,如圖1所示。
二、程序分析
當程序需要創建一個窗體、向系統發出要創建一個新窗體的WM_CREATE消息時,系統將指示程序調用CreateWnd方法來創建窗體,CreateWnd方法在創建窗體前,需要調用CreateParams過程來獲得窗體的初始化參數,在獲得這些參數後,最後再調用CreateWindowHandle方法創建一個窗體句柄,完成了一個窗體的創建工作。因此,如果我們要使某一窗體在任務欄上顯示程序圖標,就需要修改窗體的初始化參數,重載CreateParams過程。
程序窗口的初始化參數被封裝成一個TCreateParams類型的對象,該類型的定義如下所示:
type
TCreateParams = record
{窗體的標題文字}
Caption: PChar;
{窗體的類型,比如WS_CHILD 、WS_DISABLED等}
Style: DWORD;
{擴展的窗體類型}
ExStyle: DWORD;
{窗體的左上角位置}
X, Y: Integer;
{窗體的寬、高}
Width, Height: Integer;
{該窗體的父窗體句柄}
WndParent: HWND;
{指向WM_CREATE消息LParam參數}
Param: Pointer
{該類包含了一些與窗體有關的信息,如鼠標光標、選單等}
WindowClass: TWndClass;
{該窗體的類名}
WinClassName: array[0..63] of Char;
end;
CreateParams過程是當窗體創建時執行,它初始化窗體創建的參數記錄。所以如果要顯示某一窗體的圖標,必須要提高該窗體的級別,即將它的父窗體置為Windows的桌面,桌面的句柄可以通過API函數GetDesktopWindow來獲得,因此只要我們在重載函數體中添加語句“Params.WndParent
:= GetDesktopWindow;”,就可以實現窗體的圖標顯示,正如上例所演示的那樣。