Wenn man ein Fenster, dass keinen Fenstertitel haben soll und maximiert ist (sprich die Eigenschaft
BorderStyle auf
bsNone und die Eigenschaft
WindowState auf
wsMaximized des Forms steht), so wird auch die Taskbar überdeckt. Unter Umständen ein unschöner Effekt.
Umgehen kann man das mit folgender Methode:
Delphi-Quellcode:
procedure TfrmMain.RequestAlign;
var
rect: TRect;
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @rect, 0);
Constraints.MaxHeight := rect.Bottom;
inherited RequestAlign;
end;
{Die Funktion muss natürlich als Methode von TfrmMain deklariert werden}
Daniel hat dies in
diesem Beitrag erklärt. Dies funktioniert einwandfrei allerdings nur, wenn die Taskbar unten ist.
Das Problem kann man umgehen, in dem man sich eine neue Funktion schreibt, die auf die Nachricht
WM_GETMINMAXINFO reagiert.
Auszug aus dem MSDN zu WM_GETMINMAXINFO The MINMAXINFO structure contains information about a window's maximized size and position and its minimum and maximum tracking size.
Schreibt man daraus eine neue Funktion (keine Erweiterung für obige Funktion) so kann man folgende Funktion verwenden, egal wo die Taskbar sich befindet:
Delphi-Quellcode:
procedure TfrmMain.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
var rect : TRect;
Begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @rect, 0);
Msg.MinMaxInfo^.ptMaxSize.X:= rect.Right-rect.Left;
Msg.MinMaxInfo^.ptMaxSize.Y:= rect.Bottom-rect.Top;
Msg.MinMaxInfo^.ptMaxPosition.X:= rect.Left;
Msg.MinMaxInfo^.ptMaxPosition.Y:= rect.Top;
Msg.Result:= 0;
end;
Diese muss folgendermaßen als Methode von
TfrmMain deklariert werden:
procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
Diese Methode stammt ebenfalls von
Daniel.