Как восстановить минимизированную модальную форму? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть форма, которая отображается модально от 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 окно - MainForm, а не модальное, как должно.Что я должен сделать, чтобы восстановить приложение с наиболее модальной ориентацией?

1 Ответ

0 голосов
/ 24 сентября 2018

В вашем текущем дизайне у вас есть кнопка на панели задач для свернутого окна, которое отключено из-за модальной формы.Я не думаю, что вы сможете найти разумное решение для этой установки, ни одна форма не получает WM_SYSCOMMAND - модальную форму, потому что она не имеет кнопки панели задач и основной формы, потому что она отключена.

Измените свою стратегию и переключайте кнопки панели задач, когда вы минимизируете модальную форму.То есть у вас будет кнопка на панели задач для модальной формы, а не для основной формы.Затем вы можете перехватить и повернуть в том же обработчике событий, когда получите команду восстановления.Ниже приведен рабочий пример, но я должен отметить, что изменение владельца окна после того, как оно было создано, настоятельно не рекомендуется и фактически уже давно не документируется.

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;
...