代码之家  ›  专栏  ›  技术社区  ›  Marus Gradinaru

如何还原最小化的模态形式?

  •  1
  • Marus Gradinaru  · 技术社区  · 6 年前

    我有一个表格是从 MainForm . 在这个模态形式中,我覆盖了 WM_SYSCOMMAND

    protected
      procedure WMSysCommand(var Msg: TWMSysCommand);  message WM_SYSCOMMAND;
    
    procedure TModalDlg.WMSysCommand(var Msg: TWMSysCommand);
    begin
     if (fsModal in FormState) and (Msg.CmdType and $FFF0 = SC_MINIMIZE)
      then Application.MainForm.WindowState:= wsMinimized
      else inherited;
    end;
    

    ... 当我最小化模态形式时,整个应用程序就最小化了。一切正常,但当我点击任务栏按钮,应用程序恢复,foscused窗口是 主窗体

    1 回复  |  直到 6 年前
        1
  •  1
  •   Sertac Akyuz    6 年前

    在当前的设计中,您有一个用于最小化窗口的任务栏按钮,该窗口由于模式窗体而被禁用。我不认为你将能够为这个设置制定出一个合理的解决方案,两个表单都没有收到一个 WM_SYSCOMMAND -模态窗体,因为它没有任务栏按钮和主窗体,因为它是禁用的。

    在最小化模式窗体时,请更改策略并切换任务栏按钮。也就是说,您将有一个任务栏按钮用于模式窗体,而不是主窗体。然后,当您收到restore命令时,可以在同一事件处理程序中截获和反转。下面是一个工作示例,但我应该注意到,在创建窗口后更改窗口的所有者是非常不鼓励的,事实上,在相当长的一段时间内没有任何文档记录。


    type
      TModalDlg = class(TForm)
        ...
      private
        FParentWnd: HWND;
      protected
        procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
      end;
    
    ...
    
    procedure TModalDlg.WMSysCommand(var Msg: TWMSysCommand);
    begin
      if (fsModal in FormState) then begin
        case Msg.CmdType and $FFF0 of
          SC_MINIMIZE:
            begin
              SetWindowLong(Handle, GWL_EXSTYLE,
                  (GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW));
    
              FParentWnd := GetWindowLong(Handle, GWL_HWNDPARENT);
              if FParentWnd <> 0 then
                ShowWindow(FParentWnd, SW_HIDE);
    
              SetWindowLong(Handle, GWL_HWNDPARENT, 0);
            end;
          SC_RESTORE:
            begin
              SetWindowLong(Handle, GWL_EXSTYLE,
                  (GetWindowLong(Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW));
    
              if FParentWnd <> 0 then begin
                SetWindowLong(Handle, GWL_HWNDPARENT, FParentWnd);
                ShowWindow(FParentWnd, SW_SHOW);
              end;
            end;
        end;
      end;
      inherited;
    end;