![]() |
MDIChild soll bei OnCreate keine "window animation"
Ich habe eine Mainform und erstelle ein MDI-Child auf Knopfdruck. Das MDI-Child liest aus der Registry u.a. den zuletzt benutzten WindowState aus (also wsNormal, wsMaximized oder wsMinimized). Der Default ist zur Designzeit noch auf wsNormal gestellt. Wenn nun das MDI-Child in OnShow oder OnCreate auf wsMaximized wechselt, wird das mit dieser Fenster-Animation gemacht die in Windows(r) eingestellt ist, die in diesem Fall einfach total überflüssig und auf die Dauer nervig ist.
Das gleiche Problem hatte ich bei der Mainform - hier konnte ich das Problem lösen indem ich den windowstate bereits in FormCreate setze, was früh genug scheint, um die Animation zu verhindern. Beim MDI-Child funktioniert das aus irgendeinem Grund nicht. Man kann die window-animation auch per Registry Hack global deaktivieren, aber das will ich ja gar nicht. Ich möchte nur, daß die Form direkt beim Start nach Auslesen der Einstellung keine Animation benutzt, weil mir das überflüssig erscheint. Später, wenn der Benutzer sie selbst minimiert, maximiert oder sonstwas damit macht, darf die Animation gerne kommen. Weiß jemand wie man das hinkriegt? |
Re: MDIChild soll bei OnCreate keine "window animation&
Setze besser in .Loaded()
|
Re: MDIChild soll bei OnCreate keine "window animation&
Der Tip war gut... Die Animation ist leider immer noch da. So sieht es aus:
Delphi-Quellcode:
Hmm.. selbst wenn ich zur Designzeit (!) WindowState auf wsMaximized setze, gibts die "Maximieren"-Animation beim Create des MDI-Childs. Das ist verrückt. Und heißt wohl: Loaded funktioniert grundsätzlich. Nur scheint es eine Besonderheit bei MDI-Fenstern zu geben: Die werden wohl immer zuerst auf wsNormal erstellt, egal was man zur Designzeit oder in Loaded oder in OnCreate macht. Ich nehme an, daß ein MDI-child nach dem Create-Event noch mit der Mainform aushandeln muß, wie denn jetzt der windowState ist.
Interface
type TMDIChild = class(TForm) protected procedure Loaded; override; end; Implementation procedure TMDIChild.Loaded; begin inherited Loaded; windowstate := wsMaximized; end; Gerade gefunden: ![]() Demnach gibt es eigentlich nur die Möglichkeit, die Childs von Delphi automatisch zu erzeugen. Da geht mir aber leider die Dynamik flöten. |
Re: MDIChild soll bei OnCreate keine "window animation&
Wie schaut es denn mit der dort angesprochenen CreateNew-Funktion aus? Hat damit jemand schon Erfahrungen ob das was bringt?
|
Re: MDIChild soll bei OnCreate keine "window animation&
Delphi-Quellcode:
im Prog dann mit GetWinAnimation: Boolean;
unit WinAnimation;
interface uses Windows, Messages; function GetWinAnimation: Boolean; procedure SetWinAnimation(AValue: Boolean); function GetFullDragWindow: Boolean; procedure SetFullDragWindow(hwnd: DWORD; ShowFullWindow: Boolean); implementation //////////////////////////////////////////////////////////////////////////////// // Gibt True zurück, falls Fensteranimationen aktiviert sind. function GetWinAnimation: Boolean; var Info: TAnimationInfo; begin Info.cbSize := SizeOf(TAnimationInfo); if SystemParametersInfo(SPI_GETANIMATION, SizeOf(Info), @Info, 0) then Result := Info.iMinAnimate <> 0 else Result := false; end; // Aktiviert/Deaktiviert Fensteranimationen. procedure SetWinAnimation(AValue: Boolean); var Info: TAnimationInfo; begin Info.cbSize := SizeOf(TAnimationInfo); Info.iMinAnimate := Integer(AValue); SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0); end; //////////////////////////////////////////////////////////////////////////////// // True = Fenster Schieben mit Anzeige des Fensterinhaltes // False = Fenster Schieben mit Anzeige eines Rahmens function GetFullDragWindow: Boolean; var ok : boolean; begin if SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @ok, 0) then Result := ok else Result := false; end; // Aktiviert/Deaktiviert Fensterinhalt/Fensterrahmen procedure SetFullDragWindow(hwnd: DWORD; ShowFullWindow: Boolean); begin if SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, Abs(DWORD(ShowFullWindow)), 0, SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE) then begin ReleaseCapture; SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); end; end; { Benötigt einen OnMouseDown-Event-Handler, wie diesen : ====================================================== procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Springe in die Function SetFullWindowDrag // Weise dieser das Handle meiner Anwendung zu = Main.Handle // Und teile ihr mit das ich nun meine Form verschiebe. SetFullDragWindow(Form1.Handle, true ); // Springe in die Function SetFullWindowDrag // Weise dieser das Handle meiner Anwendung zu = Main.Handle // Und teile ihr mit das ich mit dem verschieben fertig bin und das Event CaptionBarMouseDown verlasse. SetFullDragWindow(Form1.Handle, Fenster); end; } end. den aktuellen Status holen. Mit SetWinAnimation(AValue: Boolean); den gewünschten Status setzen, Deine Fenster öffnen und dann den Originalstand wieder herstellen. Die Fensteranimation lässt sich leider nur systemweit ein/ausschalten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz