Nochmal: Context-Menus, diesmal in einer TreeView


Thomas Wölfer
Thomas Wölfer

24. September 2004


Nochmal ein Nachschlag - diesmal gehts um ein Context-Menü in einer TreeView. Einmal angenommen ein rechter Mausklick auf eine Node in der TreeView soll die Node als selektiert markieren und dann ein Popup-Menü für die Node öffnen.

Nichts leichter als das: Man legt in der TreeView einen Handler für das Popup-Event des Menüs an, und wenn der Eintritt dann setzt man die Node eben als selektiert (oder verändert deren Farben, je nachdem welchen Effekt man will), füllt das Menü ganz nach Wunsch mit Befehlen auf - und Windows zeigt das Ding dann an.

Das klappt auch wunderbar - nur leider bekommt man dann einen extrem unschönen Flacker-Effekt in die TreeView: Das Ding wird komplett neu gemalt und das führt zu einem echt irritierenden Blitzen.

Grund: Wenn das Popup-geöffnet wird darf man eben nichts mehr malen, der PopUp-Event ist einfach der falsche Zeitpunkt.  Das steht zwar nirgends (zumindest habe ich nichts gefunden), ist aber relativ leicht mit Spy++ herauszufinden wenn man sich die WM_ERASEBKGNDs und die WM_PAINTs ansieht - vor allem deren Reihenfolge, denn die ändert sich wenn man das malen während des Popup-Handlers weglässt.

Man muss also folgendes tun: Im MouseUp-Event führt man die Selektion durch und setzt die Node eben als ausgewählt und im Popup-Event füllt man nur das Menü auf. Dann ist beides an der richtigen Stelle und das flackern hat ein Ende.