Ответы на этот вопрос содержатся в очень полезном функциях окна раздел 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.
Итак, я предполагаю, что вам нужно сделать так, чтобы основная форма отображалась на панели задач, как обычно, но убедитесь, что другие формы не принадлежат (в смысле Windows) основной форме. Но ими нужно владеть, чтобы они не отображались на панели задач. Таким образом, вы можете сделать скрытое окно приложения владельцем, используя метод CreateParams, например:
procedure TOverlappedPopupForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := Application.Handle;
end;
Хотя вы утверждаете обратное в комментариях, когда я это делаю, я обнаруживаю, что всплывающая форма действительно скрыта, когда я сворачиваю основную форму. И снова показывается при восстановлении основной формы. Таким образом, я думаю, что это полностью решает вашу проблему.
person
David Heffernan
schedule
22.03.2011
OnClick
в главной форме и выполнитеForm2.Show
. Вы заметите, что новая красная форма никогда не будет отображаться позади основной, синей формы. Так что вам действительно нужно нужно что-то особенное. - person Andreas Rejbrand   schedule 22.03.2011