Минимизируйте все приложение, когда дочерняя модальная форма свернута - PullRequest
4 голосов
/ 26 января 2012

В другом вопросе рядом с этим я получаю ответ, чтобы получить модальные формы для хранения внутри рабочей области внутри основной формы.Способ, которым я могу сделать это (спасибо снова Дэвиду), ловит WMSizing, WMMoving, WMGetMaxMinInfo, и для моих porpuose сообщений WMShowwindow.Я не закрыта для обработки сообщений, и я думаю, что, скорее всего, я управляю сообщениями, потому что я не получаю нужный мне результат.

Все формы в моем приложении являются модальными.Но вы можете открыть много в одном и том же потоке выполнения.(Mainform, form1, form2, form3 ... formN).Вся форма (1..N) перемещается внутри рабочей области в моей основной форме.Максимизировать, восстановить, изменить размер, переместить ... все между пределами этой рабочей области.

Но я не могу управлять тем, как свести к минимуму все приложение, затем нажмите активную кнопку минимизации модальной формы и нажмите кнопку на панели задач.Приложение будет использоваться в XP и W7 ... я разрабатываю в DelphiXE.

Проект можно скачать отсюда ( Файлы проекта - Mainform, панель, кнопка, SecondaryForm, единица измерения, ничего более), просто чтобы увидеть, что я пробую все предложения, которые я нашел, прежде чем спросить здесь.

Это исходный код исходного модуля, который сохраняет модальные формы внутри рабочей области.

unit uFormularios;

interface

uses Classes, SysUtils, Windows, Messages, Forms, DBGrids, StdCtrls, Menus, Graphics, ComCtrls, Math;

type
  TForm_en_ventana = class(TForm)
  private
    inicializada: boolean;
    bCentrada     : boolean;
    bMaximizada   : boolean;
    ancho_original: integer;
    alto_original : integer;
    procedure WMShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW;
    procedure WMSizing(var msg: TMessage); message WM_SIZING;
    procedure WMMoving(Var msg: TMessage); message WM_MOVING;
    procedure WMGetMinMaxInfo(Var msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
  public
    constructor Create(AOwner: TComponent); override;
    property centrada: boolean read bCentrada write bCentrada;
    property maximizada: boolean read bMaximizada write bMaximizada;
  end;

procedure MaximizarFormulario(var F; MaximaAltura: integer = 0; MaximoAncho: integer = 0; Centrado: boolean = TRUE);
procedure InicializarVentanaTrabajo(const izq, der, arr, aba: integer);

var
  ESPACIO_DE_TRABAJO, VENTANA_DE_TRABAJO: TRect;

implementation

constructor TForm_en_ventana.Create(AOwner: TComponent);
begin
  inherited;
  centrada     := TRUE;
  maximizada   := false;
  inicializada := false;
end;

Procedure TForm_en_ventana.WMGetMinMaxInfo(Var msg: TWMGetMinMaxInfo);
begin
  inherited;
  with msg.MinMaxInfo^.ptMaxPosition do
    begin
      x := VENTANA_DE_TRABAJO.Left;
      y := VENTANA_DE_TRABAJO.Top;
    end;
  with msg.MinMaxInfo^.ptMaxSize do
    begin
      x := VENTANA_DE_TRABAJO.Right - VENTANA_DE_TRABAJO.Left;
      y := VENTANA_DE_TRABAJO.Bottom - VENTANA_DE_TRABAJO.Top;
    end;
  with msg.MinMaxInfo^.ptMaxTrackSize do
    begin
      x := VENTANA_DE_TRABAJO.Right - VENTANA_DE_TRABAJO.Left;
      y := VENTANA_DE_TRABAJO.Bottom - VENTANA_DE_TRABAJO.Top;
    end;
  with msg.MinMaxInfo^.ptMinTrackSize do
    begin
      x := ancho_original;
      y := alto_original;
    end;
end;

procedure TForm_en_ventana.WMSizing(var msg: TMessage);
var
  R: PRect;
begin
  R        := PRect(msg.LParam);
  R.Left   := Max(R.Left, VENTANA_DE_TRABAJO.Left);
  R.Right  := Min(R.Right, VENTANA_DE_TRABAJO.Right);
  R.Top    := Max(R.Top, VENTANA_DE_TRABAJO.Top);
  R.Bottom := Min(R.Bottom, VENTANA_DE_TRABAJO.Bottom);
  Caption  := 'Ancho: ' + inttostr(ancho_original) + ' - Alto: ' + inttostr(alto_original);
end;

procedure TForm_en_ventana.WMMoving(var msg: TMessage);
var
  R     : PRect;
  dx, dy: integer;
begin
  R  := PRect(msg.LParam);
  dx := 0;
  dy := 0;
  if R.Left < VENTANA_DE_TRABAJO.Left then
    dx := VENTANA_DE_TRABAJO.Left - R.Left;
  if R.Right > VENTANA_DE_TRABAJO.Right then
    dx := VENTANA_DE_TRABAJO.Right - R.Right;
  if R.Top < VENTANA_DE_TRABAJO.Top then
    dy := VENTANA_DE_TRABAJO.Top - R.Top;
  if R.Bottom > VENTANA_DE_TRABAJO.Bottom then
    dy := VENTANA_DE_TRABAJO.Bottom - R.Bottom;
  OffsetRect(R^, dx, dy);
end;

procedure TForm_en_ventana.WMShowWindow(var Message: TWMShowWindow);
begin
  if inicializada then
    Exit;
  inicializada          := TRUE;
  ancho_original        := Width;
  alto_original         := Height;
  Constraints.MinHeight := Height;
  Constraints.MinWidth  := Width;
  if centrada then
    begin
      Left := (((VENTANA_DE_TRABAJO.Right - VENTANA_DE_TRABAJO.Left) - Width) div 2) + VENTANA_DE_TRABAJO.Left;
      Top  := (((VENTANA_DE_TRABAJO.Bottom - VENTANA_DE_TRABAJO.Top) - Height) div 2) + VENTANA_DE_TRABAJO.Top;
    end;
  if maximizada then
    SendMessage(Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
end;

procedure InicializarVentanaTrabajo(const izq, der, arr, aba: integer);
begin
  VENTANA_DE_TRABAJO.Left   := izq;
  VENTANA_DE_TRABAJO.Right  := der;
  VENTANA_DE_TRABAJO.Top    := arr;
  VENTANA_DE_TRABAJO.Bottom := aba;
end;

procedure MaximizarFormulario(var F; MaximaAltura: integer = 0; MaximoAncho: integer = 0; Centrado: boolean = TRUE);
begin
  LockWindowUpdate(TForm(F).Handle);
  TForm(F).Left := ESPACIO_DE_TRABAJO.Left;
  if MaximoAncho = 0 then
    TForm(F).Width := ESPACIO_DE_TRABAJO.Right
  else
    begin
      if ESPACIO_DE_TRABAJO.Right < MaximoAncho then
        TForm(F).Width := ESPACIO_DE_TRABAJO.Right
      else
        TForm(F).Width := MaximoAncho;
    end;
  TForm(F).Top := ESPACIO_DE_TRABAJO.Top;
  if MaximaAltura = 0 then
    TForm(F).Height := ESPACIO_DE_TRABAJO.Bottom
  else
    begin
      if ESPACIO_DE_TRABAJO.Bottom < MaximaAltura then
        TForm(F).Height := ESPACIO_DE_TRABAJO.Bottom
      else
        TForm(F).Height := MaximaAltura;
    end;
  if ((MaximoAncho <> 0) or (MaximaAltura <> 0)) and (Centrado) then
    begin
      TForm(F).Left := (ESPACIO_DE_TRABAJO.Right - TForm(F).Width) div 2;
      TForm(F).Top  := (ESPACIO_DE_TRABAJO.Bottom - TForm(F).Height) div 2;
    end;
  LockWindowUpdate(0);
end;

initialization

SystemParametersInfo(SPI_GETWORKAREA, 0, @ESPACIO_DE_TRABAJO, 0);
VENTANA_DE_TRABAJO := ESPACIO_DE_TRABAJO;

end.

Спасибо всем, кто может мне помочь!

Ответы [ 2 ]

1 голос
/ 28 июня 2017

Просто перехватите сообщения Минимизация и восстановление в модальной форме и сделайте это ...

procedure TTheModalForm.WMSysCommand(var Msg: TWMSysCommand);
begin
  if (fsModal in FormState) or not Application.MainForm.Visible then
  begin
    case Msg.CmdType of
      SC_MINIMIZE:
      begin
        ShowWindow(Application.Handle, SW_SHOWMINNOACTIVE);
      end;

      SC_RESTORE:
      begin
        ShowWindow(Application.Handle, SW_SHOWNORMAL);
        inherited;
      end;

    else
      inherited;
    end;
  end
  else
    inherited;
end;
0 голосов
/ 21 августа 2018

Мне это тоже нужно было, и я попробовал другой ответ, но он не работает.К счастью, мне удалось заставить это работать, как это:

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