Сделать 2 формы способными перекрывать друг друга? - PullRequest
5 голосов
/ 22 марта 2011

Я хотел бы иметь отдельную форму, которая показывает «вместе» с моей основной формой, чтобы она не перекрывала основную форму.

Вот пример: Example

Примечаниекак основная программа перекрывает логи?Я не могу понять, как это сделать в Delphi.

Спасибо!

Ответы [ 2 ]

10 голосов
/ 22 марта 2011

Ответы на этот вопрос лежат в очень полезной особенностях окна Тема MSDN.

Соответствующая информация:

Перекрывающееся или всплывающее окноОкно может принадлежать другому перекрывающемуся или всплывающему окну.Принадлежность приводит к нескольким ограничениям для окна.

  • Принадлежащее окно всегда находится над своим владельцем в z-порядке.
  • Система автоматически уничтожает принадлежащее окно, когда его владелец уничтожается..
  • Окно, находящееся в собственности, скрыто, когда его владелец свернут.

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

Попробуйте создать приложение с 3 формами и показать их все..Dpr будет выглядеть следующим образом:

program OwnedWindows;

uses
  Forms,
  Main in 'Main.pas' {MainForm},
  Popup1 in 'Popup1.pas' {PopupForm1},
  Popup2 in 'Popup2.pas' {PopupForm2};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TMainForm, Main);
  Application.CreateForm(TPopupForm1, PopupForm1);
  Application.CreateForm(TPopupForm2, PopupForm2);
  PopupForm1.Show;
  PopupForm2.Show;
  Application.Run;
end.

Вы увидите, что основная форма всегда находится под двумя другими формами, но эти другие собственные формы могут быть выше или ниже друг друга.Когда вы минимизируете основную форму, все они исчезают.

Вы можете, если хотите, сделать все ваши формы на верхнем уровне неиспользуемыми окнами:

procedure TPopupForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;
end;

И, как мудро для TPopupForm2 в моем примере.Это приведет к тому, что все 3 окна будут иметь кнопки панели задач.

Еще один подход - вернуться к привычному образу жизни до Vista и сделать скрытое окно приложения окном владельца верхнего уровня.Это можно сделать, убедившись, что Application.MainFormOnTaskbar имеет значение False.Пропустите весь код CreateParams, и теперь у вас будет одно окно на панели задач, и любое из ваших окон может быть выше любого другого, потому что окно владельца верхнего уровня - это скрытое окно Application.Handle.Конечно, недостатком является то, что вы потеряете свой Aero Peek.

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

procedure TOverlappedPopupForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := Application.Handle;
end;

Хотя в комментариях вы указываете иначе, когда я делаю это, я обнаруживаю, что всплывающая форма действительно скрыта, когдаЯ минимизирую основную форму.И это снова показано, когда основная форма восстановлена.Таким образом, я думаю, что это полностью решит вашу проблему.

0 голосов
/ 22 марта 2011

У меня сейчас нет открытого Delphi, но я бы установил

mainform.formstyle := fsStayOnTop 

и покажите дочернюю форму с

childform.show;

работа

или попробуйте использовать SetWindowPos () и установить для свойства hWndInsertAfter что-то вроде HWND_TOPMOST в главной форме

...