Hi,
genau mit diesem Problem kämpfe ich auch schon eine Weile.
Habe in der Zeit ca. 3 verschiedene Ansätze gefunden, von denen jedoch keiner perfekt ist.
Ein Versuch davon, indem einfach die ClientArea gesperrt wird:
Delphi-Quellcode:
procedure TfrmBase.LockClientArea(lock: Boolean);
begin
with Application.MainForm
do
begin
if lock
then
SendMessage(ClientHandle, WM_SETREDRAW, 0, 0)
else
begin
SendMessage(ClientHandle, WM_SETREDRAW, 1, 0);
RedrawWindow(ClientHandle,
nil, 0, RDW_INVALIDATE
or RDW_ERASE
or RDW_ALLCHILDREN);
end;
end;
end;
procedure TfrmBase.WMMDIActivate(
var Message: TWMMDIActivate);
begin
LockClientArea(
Message.ActiveWnd <>
Handle);
inherited;
end;
procedure TfrmBase.WMSysCommand(
var Message: TWMSysCommand);
begin
if (
Message.CmdType
and $FFF0 = SC_MAXIMIZE)
then
begin
LockClientArea(True);
inherited;
LockClientArea(False);
end
else
inherited;
end;
Noch ein Versuch, bei dem die Animation halbwegs deaktiviert wird:
Delphi-Quellcode:
procedure TfrmBase.SetAnimation(Value: Boolean);
var
Info: TAnimationInfo;
begin
Info.cbSize := SizeOf(TAnimationInfo);
BOOL(Info.iMinAnimate) := Value;
SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);
end;
Den 3. Versuch hab ich nicht mehr, der hat auch irgendwie garnicht funktioniert.
Der beste Effekt, den ich damit erzielen konnte war der, dass zuerst das Fenster normal gezeichnet wird, jedoch ohne jeglichen Inhalt (also grau), dann maximiert wird und dann eben wieder gezeichnet. Aber es erscheint dennoch als normales Fenster zuerst, bevor es maximiert dargestellt wird. Das hab ich leider noch nicht wegbekommen.
Vielleicht findet ja noch jemand die Lösung...