Правильная обработка поведения модального окна «Свернуть»

У меня следующая проблема: мы создаем довольно большое приложение (win32, Delphi 6 Enterprise). В некоторых частях приложения используются модальные окна, обычно содержащие подробности выбора главного окна.

Мы включили модификацию обработки сообщений WM_SYSCOMMAND, так что, если окно является модальным, то SW_SHOWMINNOACTIVE сообщение будет отправлено в главное окно приложения. Это приводит к сворачиванию всего приложения, а не только модальной формы.

Однако в конкретном случае возникает проблема: если вызывающее окно настроено на полноэкранный режим, то при восстановлении появится модальное окно ПОД (отключенным) развернутым главным окном (похоже, это происходит в Windows 7)

Моя проблема состоит из двух частей:

Во-первых, я больше не получаю сообщения syscommand, когда приложение восстанавливается, поэтому я не могу ввести код для восстановления Z-порядка, потому что не знаю, куда его поместить. Во-вторых, мне кажется, что если все приложение свернуто, нажатие кнопки приложения на панели задач должно восстановить его в том же состоянии, а не с модальным окном под ним. Есть ли способ исправить это?

Edit: мы провели дополнительное тестирование и, кажется, действительно можем обнаружить проблему в обработчике WM_ACTIVATE для основной формы. На этом этапе мы также можем идентифицировать модальное окно. Однако я не могу найти способ восстановить его в верхней части Z-порядка.

Edit2: вот код, который минимизирует приложение, когда модальная форма свернута:

procedure TfmGITForm.WMSysCommand(var Message: TWMSysCommand);
begin
  if (fsModal in FormState) or
      not Application.MainForm.Visible then
  begin
    case Message.CmdType of
      SC_MINIMIZE:
      begin
        ShowWindow(Application.Handle, SW_SHOWMINNOACTIVE);
      end;
      SC_RESTORE:
      begin
        ShowWindow(Application.Handle, SW_SHOWNORMAL);
        inherited;
      end;
    else
      inherited;
    end;    // case
  end
  else
    inherited;
end;

Все наши формы происходят от этой формы. .

6
задан Stephane 10 June 2011 в 15:26
поделиться