Nachschlag: Dynamisch veränderte Menüs


Thomas Wölfer
Thomas Wölfer

20. September 2004


Hier noch ein kurzer Nachschlag zum Beitrag übers verhindern von Flackern bei der dynamischen Veränderung von Menüs von vorgestern.

Wenn man wie dort angegeben das neuzeichnen verhindert, dann passiert es natürlich auch: Es wird nichts neu gezeichnet. Das ist schön und macht kein Flackern - wenn sich aber auch das 'MainMenu' der Form zwischenzeitlich ändert, dann wird das natürlich auch nicht neu ausgegeben.

Resultat: Das sichtbare Menü hat dann nicht mehr viel mit dem echten zu tun. Fährt man dann mit der Maus über die Menupunkte, dann kommt dabei nach und nach das 'richtige' Menü zutage.

Man muss sich also darum kümmern, das das Menü nach der Aenderung am Menü zumindest einmal ausgegben wird.

Invalidate( true) der Parent-Form reicht dabei nicht aus, weil dabei wie früher bei Win32 zwar die Kindfenster, nicht aber die Non-Client Area und auch nicht das Menü neu gemalt werden. Statt dessen braucht es eine weitere Methode die man nur per Interop erreichen kann: DrawMenuBar(). Das Ding erwartet einen Parameter, und das ist das Handle des Fensters dessen Menü neu gezeichnet werden soll. Die Signatur für Interop sieht wie folgt aus:

[DllImport("User32.dll", CharSet=CharSet.Auto)]
private static extern int DrawMenuBar(IntPtr hWnd);

Der Aufruf (irgendwo im Form-Code) ist dann einfach:

Invalidate( true);  // die restlichen Kinder auch invalidieren
DrawMenuBar(
this.Handle);  // das Menu neu zeichnen