Kontextmenü im ListView
-
Guten Morgen,
ich habe mit dem Assistenten von VS 2008 SP1 eine MDI-Anwendung mit einer ListView erstellt.
Durch den Assistenten wurde dabei auch der Code für den Aufruf des Kontextmenü erzeugt (
OnRButtonUp
&OnContextMenu
). Nur werden diese weder bei Rechtsklick noch bei der Kontextmenü-Taste aufgerufen. Unabhängig davon, ob die Liste leer ist oder ein Item markiert ist.Muss das Kontextmenü vorher irgendwo/irgendwie aktiviert/freigeschaltet werden oder habe ich etwas "kaputt" gemacht (z.B. durch die Änderung in eine virtuelle Liste)?
Gruß Roger Wilco
-
Da kenne ich keine Probleme. Probleme gibt es nur mit TreeCtrls.
Bei mir geht das.Hast Du wirklich einen Eintrag in der Messagemap?
Was sagt Spy++?
-
Es wurde kein Eintrag in der Messagemap erzeugt. Sondern nur
OnRButtonUp
undOnContextMenu
überschrieben. Habe gedacht, dass ich den Eintrag versehentlich gelöscht haben könnte und habe deshalb nochmal ein neues MDI-Projekt gestartet. Aber auch da wurden nur die beiden Methoden eingefügt und kein Eintrag in der Messagemap erzeugt.Wenn ich Dich richtig verstehe, sollte das Default-Kontextmenü (
IDR_POPUP_EDIT
) von Anfang an funktionieren?Ich kenne mich mit Spy++ nicht aus. Damit kann ich aber sehen, dass das Fenster mit der ListView die WM_CONTEXTMENU-Nachricht gemeldet bekommt. Kann ich mit Spy++ auch überprüfen, wo die Nachricht gehandelt wird?
Spy++ schrieb:
<00001> 0003085C S WM_CONTEXTMENU hwnd:0003085C xPos:1736 yPos:538
<00002> 0003085C R WM_CONTEXTMENU
-
Nein! Wenn Du keinen RButtondown Handler hast geht WM_CONTEXTMENU von alleine...
Behandelst Du RButtonDown selbst dann gibt es auch kein Kontextmenü... Dann bist Du komplett selbst verantwortlich.
-
Ich habe keinen RButtonDown-Handler sondern nur den automatisch vom Assistenten erzeugten RButtonUp-Handler.
Das erzeugt der Assistent beim Erstellen eines MFC/MDI-Projektes im Explorer-Stil:
//TestView.cpp: //... BEGIN_MESSAGE_MAP(CTestView, CListView) ON_WM_STYLECHANGED() END_MESSAGE_MAP() //... void CTestView::OnRButtonUp(UINT nFlags, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void CTestView::OnContextMenu(CWnd* pWnd, CPoint point) { theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); } //...
-
Der wird doch gar nicht angesprochen weil er nicht in der Map ist.
-
Ich hätte jetzt gedacht, dass das in der Basisklasse passiert und dann eben die Überladung der Kind-Klasse aufgerufen wird.
Wie haben sich das denn die VS-Entwickler gedacht, wie man diese Vorlage weiter nutzt, wenn man das Kontextmenü nutzen möchte?
Soll man ON_WM_CONTEXTMENU() oder ON_WM_RBUTTONUP() händisch in die MessageMap eintragen? Warum macht der Assistent nicht gleich mit?
-
Die Funktionen sind nicht virtuell. Es können also keine Funktionen in der Kindklasse durch die Basisklasse aufgerufen werden.
Ich nutze den Wizard nicht, oder zu selten und wenn schmeiße ich immer fast alles weg, was das Ding erzeugt...
Ich bin bekennender Class-Wizard und Application-Wizard Hasser
Wenn ich das Ding benutzte dann höchstens um was auszuprobieren zu Fragen aus der Community.
-
Martin Richter schrieb:
Die Funktionen sind nicht virtuell.
Ok, das habe ich nicht überprüft.
Martin Richter schrieb:
Ich bin bekennender Class-Wizard und Application-Wizard Hasser
Würde ich auch meiden, aber als Anfänger schon hilfreich.
Dass der Assistent das Kontextmenü jedoch nur zur Hälfte implementiert (Menü-Ressource wird ja auch erzeugt) ist schon sehr unglücklich.
Mit
ON_WM_CONTEXTMENU()
undON_WM_RBUTTONUP()
in der MessageMap funktioniert es jedenfalls.Danke Martin!