在任務欄上實現像WORD XP一樣的多窗口

我們有時候要讓每一個窗口在任務欄上有一個按鈕,但不方便的是,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以結束應用程序.說說,還沒時間寫出來^_^


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章