在任务栏上实现像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以结束应用程序.说说,还没时间写出来^_^


 

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