AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

Ein Thema von MicMic · begonnen am 29. Mär 2021 · letzter Beitrag vom 31. Mär 2021
Antwort Antwort
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 29. Mär 2021, 17:54
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#2

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 29. Mär 2021, 18:13
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
Miniaturansicht angehängter Grafiken
istflacher.png  
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Mär 2021 um 18:22 Uhr)
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 29. Mär 2021, 19:03
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).
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 30. Mär 2021, 12:56
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#5

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 30. Mär 2021, 14:23
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 30. Mär 2021, 16:51
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

Geändert von MicMic (30. Mär 2021 um 16:52 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 30. Mär 2021, 19:12
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?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 31. Mär 2021, 13:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 31. Mär 2021, 16:12
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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#10

AW: WM_GETMINMAXINFO verändern wegen Titelleiste im maximierten Zustand

  Alt 31. Mär 2021, 16:22
Delphi-Referenz durchsuchenTResourceStream
Alles, was sowas wie z.B. LoadFromStream kennt, kann auch aus Ressourcen lesen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:00 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