Application.MainForm wird korrekt umgesetzt, hat aber interessanterweise keinerlei Effekt auf das Fensterpreview.
So also Minimieren der gesamten Anwendung lässt sich recht simpel mittels überschreiben von SYSCOMMAND lösen
Delphi-Quellcode:
case (msg.cmdtype and $FFF0) of
SC_MINIMIZE: begin
ShowWindow( Application.MainForm.Handle, SW_MINIMIZE );
msg.result := 0;
end;
else
inherited;
end;
Beim Wiederherstellen sitzt dann allerdings der Fokus im Nirvana.
-----------------------------------------------
Hier mal meine eine vorläufige Lösung:
Beim Aufruf des Modalen-Forms den Taskbar-Eintrag des Hauptform verstecken und anschließend wieder einblenden
Delphi-Quellcode:
ShowWindow(Application.MainFormHandle, SW_HIDE);
SetWindowLong(Application.MainFormHandle, GWL_EXSTYLE,
GetWindowLong(Application.MainFormHandle, GWL_EXSTYLE) and not WS_EX_APPWINDOW
or WS_EX_TOOLWINDOW);
ShowWindow(Application.MainFormHandle, SW_SHOW);
MyModalForm.showModal;
ShowWindow(Application.MainFormHandle, SW_HIDE);
SetWindowLong(Application.MainFormHandle, GWL_EXSTYLE,
GetWindowLong(Application.MainFormHandle, GWL_EXSTYLE) and not WS_EX_TOOLWINDOW
or WS_EX_APPWINDOW);
ShowWindow(Application.MainFormHandle, SW_SHOW);
Beim Erzeugen des modalen-Forms einen Taskbar-Button erzeugen
Delphi-Quellcode:
procedure TMyModalForm.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do exStyle := exStyle or WS_EX_APPWINDOW;
end;
Und letzlich das Minimieren und Wiederherstellen überschreiben
Delphi-Quellcode:
procedure TMyModalForm.WMSyscommand(
var msg: TWmSysCommand);
begin
case (msg.CmdType
and $FFF0)
of
SC_MINIMIZE:
begin
ShowWindow(
Handle, SW_MINIMIZE);
msg.Result := 0;
end;
SC_RESTORE:
begin
ShowWindow(
Handle, SW_RESTORE);
msg.Result := 0;
end;
else
inherited;
end;
end;
Nachteil ist das "Blinken" in der Taskbar, wenn der eine Button verschwindet und der andere angezeigt wird.