[WinAPI] Get Menubar-Handle

Hunter

Erfahrenes Mitglied
Hallo,

ist es möglich, das Handle der Menubar zu bekommen (HWND)? Denn ich möchte auf der Menubar selbst Zeichnen oder Fenster erstellen.
 
Das Handle des Menüs zu bekommen, ist nicht schwer: http://msdn.microsoft.com/en-us/library/windows/desktop/ms647640(v=vs.85).aspx

Ob du allerdings darauf zeichnen kannst, weiß ich nicht. Google hat Folgendes erbracht:

- http://stackoverflow.com/questions/13664105/create-owner-drawn-menus-with-c-2012-style
- http://www.nanoant.com/programming/themed-menus-icons-a-complete-vista-xp-solution
- http://arstechnica.com/civis/viewtopic.php?t=169886

Laut dem letzten Link schauen die Möglichkeiten nicht ganz so rosig aus, aber ich habe auch nur den den Titel und den Anfang gelesen ;)
 
Im Prinzip hat es ComFreek ja schon erwähnt: GetMenu() ist die schnellste Methode.
Ansonsten bietet sich auch GetMenuBarInfo() an: http://msdn.microsoft.com/en-us/library/windows/desktop/ms647833(v=vs.85).aspx
ComFreeks Links scheinen sich auf die Menu Items zu beziehen, daher frage ich besser nochmals nach: Willst du eigene Menus zeichnen oder modifizierte Items im Menu?

Gruss
cwriter

/EDIT: Falls du eigene Menus willst, hilft das weiter? http://msdn.microsoft.com/en-us/library/windows/desktop/ms647553(v=vs.85).aspx#menu_messages
 
Danke erstmal für eure Antworten. :)


Willst du eigene Menus zeichnen oder modifizierte Items im Menu?
Ich möchte weder die Menubar, noch die Items selbst zeichnen, sondern nur auf der Menubar (dort wo freier Platz ist) zB. einen Text zeichnen / Fenster erstellen. (siehe Anhang)
Das Problem von GetMenu() und von GetMenuBarInfo() ist das, das ich nur ein HMENU zurückbekomme und kein Handle vom Typ HWND, oder wird das intern dasselbe? MENUBARINFO beinhaltet zwar ein HWND jedoch bezieht sich dies - sofern ich es richtig interpretiere (nicht getestet) - nicht auf die Menubar selbst, oder liege ich da falsch?


Laut dem letzten Link schauen die Möglichkeiten nicht ganz so rosig aus
Ja, den Link hatte ich auch gefunden, aber der/die will nur Frust ablassen, hab aber auch nicht den ganzen Beitrag durchgelesen. :D
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    5,9 KB · Aufrufe: 12
Hallo

Um ausserhalb der Client area zu zeichnen, bietet sich WM_NCPAINT an. Quelle: http://stackoverflow.com/questions/3649364/drawing-outside-client-area-winapi
Beispielcode lässt sich hier finden: http://www.cplusplus.com/forum/windows/108581/
Und hier auch noch (ein bisschen MFC ist noch drunter :)): http://stackoverflow.com/questions/99623/how-to-draw-in-the-nonclient-area

Ich bin nicht so sattelfest mit der WinApi (ja, süsses Qt :) ), daher bin ich mir nicht sicher, ob die Menubar noch in die Client area fällt oder nicht. Von daher alles ganz ungetestet :)

Gruss
cwriter
 
Falls dir irgendwann die Lösungen ausgehen, ich hatte sowas schon einmal bei Filezilla gesehen, wenn ein neues Update verfügbar war. Als Notlösung könntest du in dem Quelltext stöbern (wxWidgets wird als GUI Framework genutzt).
 
@cwriter Ich habs mal mit WM_NCPAINT versucht, jedoch funktioniert dies nicht so wirklich unter Windows 8. Es bleibt immer nur ein weißer Hintergrund und es wechselt zum Windows 7-Fensterdesign. Auch mittels Google habe ich herausgefunden, dass dies den Aero-Effekt unter Windows 7 deaktiviert.

@ComFreek Super Vorschlag, habs aber auch so hinbekommen, siehe unten. :)


Beim stöbern im Internet bin ich draufgekommen, dass man auch GetWindowDC verwenden kann.
Auszug des MSDN:
The GetWindowDC function retrieves the device context (DC) for the entire window, including title bar, menus, and scroll bars. A window device context permits painting anywhere in a window, because the origin of the device context is the upper-left corner of the window instead of the client area.
So kann ich einfach per GetWindowDC ein Handle zum gesamten Fenster bekommen und drauf zeichnen.



Dankeschön nochmals für eure Hilfe. :)
 

Neue Beiträge

Zurück