我們有時候要讓每一個窗口在任務欄上有一個按鈕,但不方便的是,DELPHI爲我們做得太多,
甚至有些過份了點,呵,還好有辦法解決.
首先,看VCL源碼
procedure TCustomForm.WMSysCommand(var Message: TWMSysCommand);
begin
with Message do
begin
if (CmdType and $FFF0 = SC_MINIMIZE) and (Application.MainForm = Self) then
Application.WndProc(TMessage(Message))
else if (CmdType and $FFF0 <> SC_MOVE) or (csDesigning in ComponentState) or
(Align = alNone) or (WindowState = wsMinimized) then
inherited;
if ((CmdType and $FFF0 = SC_MINIMIZE) or (CmdType and $FFF0 = SC_RESTORE)) and
not (csDesigning in ComponentState) and (Align <> alNone) then
RequestAlign;
end;
end;
可以得知,MainForm的一些消息被傳給了應用程序對象Application,我們要做的就是截取這
些消息,幹我們自己想幹的.
1.在主窗體unit中
聲明
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
procedure CreateParams(var Params:TCreateParams); override;
實現
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
case message.CmdType of
SC_MAXIMIZE,SC_MINIMIZE,SC_RESTORE: //這幾個消息自己處理
DefWindowProc(Self.Handle,message.Msg,message.CmdType,0)
else
inherited; //交給DELPHI
end;
end;
procedure TForm1.CreateParams(var Params:TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW ;//讓主窗體出現在任務欄上
end;
好了,這樣主窗體就會出現在任務欄上,而且最小化也不會消失,現在要做的就是
讓Application在任務欄上的按鈕消失,用以下代碼
procedure TForm1.FormShow(Sender: TObject);
begin
showwindow(Application.Handle ,sw_hide);
end;
其它的窗體想出現在任務欄,只要像主窗體一樣重載CreateParams方法,並用相同的代碼,
因爲是非MainForm,所以不用截取那幾個消息.
這樣就實現了一個應用程序有多個任務欄按鈕,而且不會相互影響.
////////////
之後想出一個更好的辦法,即建立一個MainForm並不讓它可見,也不顯示在任務欄,當然,
也要把Application從任務欄去掉,其它窗體用上面的方法讓它顯示在任務欄上,當然,爲了
方便可以寫一個基類,在這個基類的OnClose事件中判斷是否爲最後一個本類的實例,是則
關閉MainForm以結束應用程序.說說,還沒時間寫出來^_^