Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand (https://www.delphipraxis.net/207494-wm_getminmaxinfo-veraendern-wegen-titelleiste-im-maximierten-zustand.html)

MicMic 29. Mär 2021 17:54

WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
Hallo

Im maximierten Zustand ist ja die Titelleiste ein wenig in der Höhe kleiner. Also sie wird wegen dem Rahmen etwas unter der 0 Position (also Top < 0 ; je nach Rahmendicke wohl) angezeigt. Das hat mir noch nie gefallen. Ich habe jetzt mit
Delphi-Quellcode:
procedure TForm1.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo);
Var BW : Integer;
    AR : TRect;
begin
  inherited;
  SystemParametersInfo(SPI_GETWORKAREA, 0, @AR, 0);
  BW := GetSystemMetrics(SM_CYSIZEFRAME) +  GetSystemMetrics(SM_CXPADDEDBORDER);
  Message.MinMaxInfo.ptMaxPosition.SetLocation(AR.Left-BW,0);
  Message.MinMaxInfo.ptMaxSize.SetLocation(AR.Width+BW+BW,AR.Height-1); // ohne "-1" geht es nicht
  Message.MinMaxInfo.ptMaxTrackSize := Message.MinMaxInfo.ptMaxSize;
end;
und noch in Verbindung mit
Delphi-Quellcode:
procedure TForm1.WM_NCCalcSize(var Msg: TWMNCCalcSize);
Var BW : Integer;
begin
  inherited;
  BW := GetSystemMetrics(SM_CYSIZEFRAME) +  GetSystemMetrics(SM_CXPADDEDBORDER);
  if windowstate = wsMaximized then inc(Msg.CalcSize_Params.rgrc[0].Bottom,BW);
end;
erreicht, dass die Titelleiste im maximierten Zustand gleich groß bleibt. Also Top=0. Das schaut schöner aus ;-)

Wenn man die Taskleiste vergrößert oder verschiebt (während das Fenster nun maximiert ist), geht der Effekt leider verloren. Also die Titelleiste wird dann wieder unter 0 (Top-Position) angezeigt. WM_GETMINMAXINFO wird aber bei so einer Aktion aufgerufen. Wohl etwas zu spät denn wenn ich manuell das Fenster wieder verkleinere und vergrößere, dann geht es wieder. Weiß jemand wie ich das besser machen kann?

himitsu 29. Mär 2021 18:13

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie kommst du auf die Idee, das Fenster wäre nach oben verschoben?

Wenn maximiert, dann ist der Titel wirklich kleiner, was schon dadurch auffällt, dass das Icon, die Schrift und die Buttons nicht oben raushängen, sondern tiefer liegen,
also mittig in der Leiste, wobei die Buttons normals etwas höher liegen, wie die Mitte. (fällt gut auf, wenn man es übereinanderlegt und bemerkt, dass die Leisten unten nicht übereinander liegen)
Nur der "unsichtbare" Rahmen (in XP noch sichtbar) liegt etwas oberhalb/außerhalb. (war bei Multimonitor manchmal drüben zu sehen)

Also ähnlich wie bei BorderStyle=bsToolWindow.



Man kann zwar im WM_GETMINMAXINFO die Position etwas verschieben, aber wirklich Spaß macht es nicht.
Delphi-Quellcode:
procedure WMGetMinMaxInfo(Var Msg: TWMGetMinMaxInfo); Message WM_GETMINMAXINFO;

Msg.MinMaxInfo^.ptMaxPosition.Y

MicMic 29. Mär 2021 19:03

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
Ich verändere es ja mit "ptMaxPosition.SetLocation".
Geht ja auch aber wie gesagt... verschiebt man die Taskleiste, werden Fenster ja neu angeordnet. Also die maximierten Fenster. Und hier stimmt's dann nicht mehr. Man muss dann das Programm neu starten oder das maximierte Fenster kurz verkleinern und wieder maximieren. Dann passt es wieder. Sollte aber nach dem verschieben der Taskleiste automatisch passieren. Ich denke "WM_GETMINMAXINFO" wird da zu früh verarbeitet, wenn man die Taskleiste verschiebt oder vergrößert/verkleinert.

Mir gefällt die größere Titelleiste einfach besser. Sie wird ja überall (bei normalen Titelleisten) etwas kleiner im maximierten Zustand (zumindest die Optik). Nicht nur Delphi-Programme. Edge macht ja seine eigene aber eigene Titelleisten haben meist ein anderes Problem (Inhalt wackelt mehr bei der Fenstervergrößerung mit der Maus).

MicMic 30. Mär 2021 12:56

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
Jetzt mal wieder ein neuer Versuch mit eigener Titelleiste. Mal guggen. So hab ich die Kontrolle ;-)
Irgendwie versuche ich da schon eine Weile was. Da scheint irgendwo ein Bug zu sein... Grafiktreiber oder Windows. Ist schwer zu erklären aber Systemweit ändert sich bei mir immer etwas. Ihr kennt das ja bestimmt. Wenn schlecht programmiert, dann flackert viel (bei Größenänderungen des Fensters). Windows macht da schon gute Arbeit, dass Inhalte rechts und unten am Platz bleiben, wenn Fenster links oder oben vergrößert wird. Aber beim rumtesten kommt es vor, dass sich was verabschiedet und plötzlich flackert alles in Windows selbst auch. So dann auch mein Programm. Jetzt gehts grad wieder, mal schauen wie lange. ;-)

Zum Beispiel gibt es große Komponenten, irgendwas mit StyleControls. Schöne gebaute Titelleisten mit weiteren Buttons/Text und sonstige Spielereien. Alles schön und gut aber hier flackert's auch, wenn das Fenster links oder oben vergrößert wird. Das kann man dann nicht wirklich gebrauchen. Bei mir geht es gerade besser. Fragt sich nur wie lange ;-)

himitsu 30. Mär 2021 14:23

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
z.B. DevExpress, und vermutlich auch einer der vielen Styles aus'm GetIt, können das komplette Fenster übermalen, inkl. eigener Titelleiste und Rahmen.


Aber Delphi-Referenz durchsuchenTTitleBarPanel fügt nur was in die Leiste ein, aber die Größe und das grundsätzliche Design ändert es nicht. (das, was die IDE selbst benutzt)
http://docwiki.embarcadero.com/RADSt...e_Titelleisten
https://www.youtube.com/watch?v=tCcqu_emZlk

MicMic 30. Mär 2021 16:51

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
Habe das jetzt mal ausprobiert, weil ich neugierig war.
Also die VCL Demos

Das ist ja das schlechteste was ich bis jetzt gesehen habe. Sorry. Habe mich jetzt nicht auf den Inhalt konzentriert aber auf das geflackere. Also es flackert und recht langsam ist der Aufbau. Stört total. Zugegeben ist mein Windows zum Testen auch verändert, mit solchen ThemePatch Zeugs um das Windows Design zu verändern. Da muss man ja wissen, was passiert wenn man schon mit eigenen Rahmen oder Titelleisten rumprobiert. Aber habe gerade normales Windows-Design aktiviert. Der Test bezieht sich auf Fenster-Größenänderung mit der Maus am linken oder oberen Fensterrahmen. Ich gehe her und vergrößere/verkleinere das Fenster und der Inhalt von DevExpress flackert hier am meisten. Zur Zeit aber auch mein MS Edge. Da sehe ich schnell wie rechts (wenn ich am linken Fensterrahmen das Fenster vergrößere) das zeichnen nicht nachkommt (es kurz schwarz ist). Bei DevExpress ist es echt katastrophal. Da flackern die recht oder unten angeordneten Komponenten. Die Titelleiste auch. Schade das ich nicht gerade ein frisches Windows habe um das dann nochmals zu testen.

Aber hier ist halt der Wurm drin. In einem frischen Windows habe ich damals auch ein wenig mit Delphi und solche Themen (Rahmen, eigene Titelleiste) herumgetestet. Irgendwann (nicht gleich) läuft da was falsch. Irgendein Speicher voll (etwas wird deaktiviert?) ob in Windows oder beim Grafiktreiber... plötzlich reagieren alle Fenster anders und flackern mehr. Egal ob Delphi-Forms oder andere Programme. Das passiert auch, wenn man ein Fenster mit Aero Snap positioniert. Das wollte ich hier damals mal erklären. Ist aber schwierig denn der nicht identifizierbare Bug tritt nicht ganz normal auf. Aero Snap muss man hier recht schnell hintereinander in allen möglichen Positionen anwenden. Irgendwann passiert es halt und plötzlich flackert Windows.

P.s TTitelBarPanel habe ich noch nicht. Muss warten auf eine neue Community Version

KodeZwerg 30. Mär 2021 19:12

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
Ich weiß nicht ob es das gleiche Phänomen ist, wenn man Desktop aktiv hat und irgend eine Dateiverknüpfung gestartet wird. (*.bilder, *.videos etc) da baut sich bei mir auch immer wieder der Desktop mit allen Fenstern neu auf, mehrmals.
Vielleicht hilft bei Deinem Problem dem Formular DoubleBuffered zu geben oder bei Größenänderungen das darstellen zu unterbinden?

MicMic 31. Mär 2021 13:39

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
Ich meinte eher manche Komponenten, die man z.B. mit "align=right" oder in einer WM_SIZE mit "komponente.left = form.width-komponente.width" ausrichtet. Da leistet Windows oft gute Arbeit und man merkt nicht, wie sie sich leicht verschieben, wenn man das Fenster am linken Rahmen mit der Maus vergrößert. Aber das ist nicht immer so. Ob DoubleBuffered oder ähnliches. Man kann nicht alles auf AN stellen. Kommt natürlich auch auf den Inhalt (die Menge an Komponenten und was sie machen) des Fensters an. Man kann vieles flickerfrei bekommen aber dann kann es auch langsamer werden und man merkt das die Fenstergrößenänderung nicht mehr so flüssig ist. Aber es gibt halt auch ein Phänomen, wo normales flickerfreies Zeug (und das hat nix mit Delphi zu tun) plötzlich doch flackert. Der Fehler liegt hier in Windows oder im Grafiktreiber. Anders kann ich's mir nicht vorstellen. Damals mit einem frischen Windows konnte ich nur mit dem MS Edge den Fehler verursachen und plötzlich wurden die ausgerichteten Komponenten nicht richtig gezeichnet.

KodeZwerg 31. Mär 2021 16:12

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
Vielleicht hilft dir das?
Da ich auf Kriegsfuß mit der Vcl und deren Styles bin, ist es das erste was ich deaktiviere, das was per default auf "ein" steht auszuschalten. Kann Einbildung sein, mir kommt GUI flüssiger vor.
(das zweite RTTI abschalten ^_^)
Sonst fällt mir das nur bei großen Tabellen auf und daran hab ich mich bereits gewöhnt :-)

himitsu 31. Mär 2021 16:22

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand
 
Delphi-Referenz durchsuchenTResourceStream
Alles, was sowas wie z.B. LoadFromStream kennt, kann auch aus Ressourcen lesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz