2014-04-27 36 views
2

如果您隱藏主窗體(Form1)並顯示另一個窗體(Form2),則在任務欄中沒有應用程序圖標。有沒有辦法糾正這一點,所以我也有孩子形式的應用程序圖標呢?如何安排一個非主窗體與任務欄按鈕相關聯?

+0

你分配給Form2.Icon嗎? 'Form2.Icon:= Application.Icon' –

+0

有但沒有顯示在任務欄中。 – user763539

+0

我以爲你錯過了一個圖標,看起來像你缺少任務欄按鈕。 –

回答

2

在下文中,我指的是所有者,我的意思是Windows概念,而不是VCL概念。

據我所知,你問如何讓你的其他表單在任務欄上有一個按鈕。對於頂層窗口安排的辦法有一個按鈕在任務欄是:

  1. 使該窗口可見,和無主,或
  2. 使該窗口可見,並有WS_EX_APPWINDOW擴展窗口風格。

您的應用程序的主要形式Form1是無主的。當它可見時,它在任務欄上有一個按鈕。

您的應用程序中的其他表單擁有所有者。因此他們沒有任務欄上的按鈕。

爲了讓您的其他表單在任務欄上有按鈕,您需要確保上述任一選項適用。這涉及重寫CreateParams

type 
    TForm2 = class(TForm) 
    .... 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    .... 
    end; 
.... 
procedure TForm2.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    Params.WndParent := 0; 
end; 

以上爲您提供了選項1.選項2,你會寫這樣的:

procedure TForm2.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; 
end; 

你問的意見在何處放置此代碼。那麼,VCL表格是在Win32之上實現的。這意味着VCL表單被實現爲頂級窗口。 Windows通過對接收各種參數的CreateWindowEx的調用創建。 Windows可能會在表單的生命週期中重新創建,這需要一些腳手架。

該腳手架的一部分是Windows VCL控件的一種機制,用於提供傳遞給CreateWindowEx的參數。這些參數在受保護的虛擬方法CreateParams中提供。你永遠不會調用這個方法,你可以選擇實現它。該框架在需要知道CreateWindowEx所需的參數時調用它。

通常VCL屬性映射到傳遞給CreateWindowEx的參數(例如窗口樣式)。但是,對於我上面描述的兩個選項,都沒有這樣的VCL屬性。所以你需要實現CreateParams

+0

心靈告訴我在哪裏實施這一切? – user763539

+0

在你的表格中。你必須重寫CreateParams。你知道嗎? –

+0

@ David Heffernan - 不,戴夫...從來沒有那樣.... – user763539

相關問題