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 TPopupMenu Border selbst zeichnen? (https://www.delphipraxis.net/216219-tpopupmenu-border-selbst-zeichnen.html)

WilderMike 22. Nov 2024 16:28

TPopupMenu Border selbst zeichnen?
 
Hallo,

ich habe das irgendwie mal früher gemacht (vor ca. 5 Jahren) aber nutzte Delphi (auch allg. das Programmieren) erst wieder seit ca. 1-2 Wochen. Wie bekomme ich denn z.B. bei einem TPopupMenu den Border unter Kontrolle? Ich möchte diesen selbst zeichnen. WM_PAINT NCPAINT usw. gibt es ja aber die Nachrichtenbehandlung habe ich eher vermehrt in andere Richtung gemacht aber mit PAINT-Gedöns ;-) früher auch schon gearbeitet.

Gruß WilderMike

peterbelow 23. Nov 2024 15:48

AW: TPopupMenu Border selbst zeichnen?
 
Ich würde da lieber die Finger von lassen. Die Items haben Events wie OnDrawItem, OnAdvancedDrawItem mit denen man sie selbst zeichnen kann, aber das sichtbare Popup-Menu selbst ist ein API-Fenster, wird von Windows gezeichnet, und an sein window handle zu kommen ist nicht einfach. Es selbst zu zeichnen ist komplex, um es milde zu formulieren, mit all dem neumodischen Kram wie hidpi und styles, besonders wenn man dabei nicht die in VCL.Menus implementierte Funktionalität torpedieren möchte.

Und nein, TMenu.Windowhandle ist nicht das handle des Menufensters...

WilderMike 24. Nov 2024 08:30

AW: TPopupMenu Border selbst zeichnen?
 
Zwar etwas probiert aber die Finger sind noch dran ;-)
Ich habe jetzt eine 2. Form genommen. Damit kann man ja mit „bsNone“ usw. alles eliminieren und mit dieser Form sein eigenes Ding machen. Die rufe ich auf, wenn auf ein Tray Icon geklickt wird. Geht eigentlich soweit alles. Aber sozusagen dieses „einfangen“ geht noch nicht. Also es gibt ja verstecke Tray Icons von Windows, die mit dem Pfeil in der Taskleiste eingeblendet werden können. Dort ist zurzeit mein TrayIcon von Delphi drin. Wenn der Bereich offen ist, kann ich auf mein Tray Icon klicken. Aber der Bereich schließt sich automatisch wieder, wenn der Mauszeiger zu meinem falschen Popupmenü (meine 2. Form) bewegt wird. Bei einem richtigen Popupmenü bleibt der Bereich noch offen und schließt sich erst, wenn ein Menüeintrag vom Popupmenü ausgewählt wurde.
So eine Form als Popupmenü gefällt mir richtig gut. Erstens können die Farben angepasst werden und der Inhalt muss nicht nur aus nachprogrammierten Menüs bestehen, sondern man kann damit alles Mögliche machen.
Um diesen verstecken Tray Icon Bereich von Windows offen halten zu können, benötigt es wohl wilden Code. *lach

Die Idee mit einem Dummy Popupmenu
Code:
Form2.show;
popupmenu1.Popup(-100,-100);
form2.SetFocus; // geht so nicht
geht schon mal nicht. Erstens lässt sich das Popupmenü nicht außerhalb des Bildschirmes setzen (das wäre wichtig) und zweitens verliert meine 2. Form den Fokus dabei. Diesen Fokus bräuchte ich z.B. für WM_MOUSELEAVE und WM_MOUSEHOVER aber solange das Dummy PopupMenu offen ist, kann ich kein Fokus setzen. Zumindest bleibt der versteckte Tray Icon Bereich von Windows hier offen. Aber die halbe funktionierende Idee mit dem Dummy Popup bringt dann ja auch nichts.

Aber Danke für deine Antwort. Hätte ja sein können, dass es nicht so schwer ist, ein TPopupmenu komplett selber bemalen zu können (auch den Rahmen). Das mit der 2. Form gefällt mir jetzt sowieso besser aber nur das beschriebene Problem bleibt. Da muss ich noch mal drüber nachdenken ;-)

Gruß WilderMike


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 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-2025 by Thomas Breitkreuz