AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi NonClient-Area <-> GetSystemMenu
Thema durchsuchen
Ansicht
Themen-Optionen

NonClient-Area <-> GetSystemMenu

Ein Thema von Motzi · begonnen am 2. Apr 2003
Antwort Antwort
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#1

NonClient-Area <-> GetSystemMenu

  Alt 2. Apr 2003, 12:31
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?
Manuel Pöter
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:20 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