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 NonClient-Area <-> GetSystemMenu (https://www.delphipraxis.net/3848-nonclient-area-getsystemmenu.html)

Motzi 2. Apr 2003 11:31


NonClient-Area <-> GetSystemMenu
 
Hi,

ich hab vor ein paar Tagen ein sehr seltsames Verhalten von Windows beobachtet und es bis jetzt nicht geschafft dieses irgendwie zu umgehen/korrigieren.

ich bin gerade dabei mir meine Form komplett selbst zu gestalten und zeichne daher in meinem NCPaint-Handler den gesamten NonClient-Bereich selbst. Ist ja eigentlich auch alles kein Problem, solange man mit der Maus nicht in einen Bereich des Fensters fährt in dem man die Größe des Fensters verändern kann. Denn wenn das der Fall ist, dann wird der Bereich rechts oben wo sich die Buttons befinden von Windows selbstständig neu gezeichnet (ohne das generieren einer WM_NCPAINT Message!). Bei einem NonVCL-Prog von NicoDE ist dies nicht der Fall, obwohl genau dieselben Messages verwendet werden. Sobald man in meinem Prog (mit VCL) in der Titelleiste rechtsklickt und dadurch das SystemMenu aufruft, verhält sich mein Prog jedoch genauso wie das von NicoDE (der Bereich wird nicht mehr selbstständig neu gezeichnet).

Inzwischen konnte ich den Ursprung dieses Verhaltens lokalisieren, nämlich den NCCreate-Message-Handler der TForm. In diesem Handler wird das SystemMenu entsprechend der Form angepasst. Um an das SystemMenu heranzukommen wird die API-Funktion GetSystemMenu verwendet und genau das ist der Punkt. Sobald die Funktion GetSystemMenu aufgerufen wird verhält sich Windows was das Zeichnen des NC-Bereichs betrifft äußerst seltsam. Sobald aber einmal das SystemMenu per Rechtsklick in der Titelleiste aufgerufen wurde verhält sich Windows wieder normal.

Weitere Recherchen haben ergeben, dass die Message WM_INITMENUPOPUP für diese weitere Verhaltensänderung (Verhaltensänderung auf "normal") verantwortlich ist. Versuche das normale Verhalten durch manuelles schicken der Message WM_INITMENUPOPUP und den entsprechenden Parametern herzustellen sind fehlgeschlagen.
Ein anderer Ansatz war NCCreate nur der DefWindowProc zu übergeben und das "echte" Menu direkt zu bearbeiten. Dazu fange ich die Message WM_INITMENUPOPUP ab und überprüfe den Parameter wParam mit IsMenu auf ein gültiges Menu (IsMenu liefert True zurück). Versuche das Menu zu verändern schlagen allerdings fehl.

Hat jemand eine Idee wie ich nach einem Aufruf von GetSystemMenu das SystemMenu wieder so initialisieren kann, dass sich Windows "normal" verhält? Oder weiß jemand vielleicht wie ich auf das SystemMenu zugreifen kann, OHNE einen Aufruf von SendMessage?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 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