Kontextmenü erzeugen
-
Hallo,
ich arbeite gerade Visual C++ in 21 Tagen durch. Im Kapitel Menüs steht dort folgender Code, der ein Kontextmenü erzeugen soll. Das Kontextmenü bezieht sich auf ein vorhandenes "normales" Menü.void CMenusDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // Lokale Variablen deklarieren CMenu *m_lMenu; // Zeiger auf Menü CPoint m_pPoint; // Kopie der Mausposition // Mausposition in lokale Variable kopieren m_pPoint = point; // Position in Bildschirmkoordinaten konvertieren ClientToScreen(&m_pPoint); // Zeiger auf Fenstermenü holen m_lMenu = GetMenu(); // Zeiger auf erstes Untermenü holen m_lMenu = m_lMenu->GetSubMenu(0); // Popup-Menü anzeigen m_lMenu->TrackPopupMenu(TPM_CENTERALIGN + TPM_LEFTBUTTON, m_pPoint.x, m_pPoint.y, this, NULL); }
Nur leider ist das entstandene Kontextmenü totaler Schwachsinn. Ich hab alle möglichen Parameter ausprobiert, auch dass es mit Rechtklick geöffnet wird. Im Beispiel aus dem buch wird es ja mit Linksklick geöffnet. Seit wann das denn? Aber egal ,wie dem auch sei, das Menü öffent sich sonstwo, nur nicht auf der Maske. Irgendwo daneben. ALs ich die Funktion "ClientToScreen" auskommentiert hatte, wurde es zumindest auf der Maske erzeugt. Aber trotzdem nicht so,wie man es von Windows gewöhnt ist. Klikct man rechts oder links,je nach Parameter, erscheint erst ein dicker Strich. Wenn man dann mit der Maus dann an diesem Strich entlangfährt, öffnet sich ein paar Milimeter weiter dann das Kontextmenü. Irgendwie sieht das ganz eigenartig aus. Weiss da jemand Rat?
Danke
paloncino
-
Das sieht soweit okay aus, jedenfalls ähnelt es sehr dem, womit ich ein Kontextmenü anzeige.
Versuch aber mal:
void CMenusDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // Zeiger auf Fenstermenü holen CMenu *m_lMenu = GetMenu(); // Zeiger auf erstes Untermenü holen CMenu *m_lMenu2 = m_lMenu->GetSubMenu(0); // Popup-Menü anzeigen m_lMenu2->TrackPopupMenu(TPM_CENTERALIGN + TPM_LEFTBUTTON, point.x, point.y, this); }
Das Koordinatenkonvertieren scheint nicht nötig zu sein und bei dem GetSubMenu auf sich selber ist mir irgendwie unwohl. Es gibt ja einige Befehle, die fehlschlagen, wenn man "eine Selbstzuweisung" macht.
-
paloncino schrieb:
Hallo,
ich arbeite gerade Visual C++ in 21 Tagen durch. Im Kapitel Menüs steht dort folgender Code, der ein Kontextmenü erzeugen soll. Das Kontextmenü bezieht sich auf ein vorhandenes "normales" Menü.m_lMenu->TrackPopupMenu(TPM_CENTERALIGN + TPM_LEFTBUTTON, m_pPoint.x, m_pPoint.y, this, NULL);
paloncino
Ich habe da was anderes:
CMenu* pSubMenu = pMenu->GetSubMenu(0); pSubMenu->TrackPopupMenu( TPM_LEFTALIGN|TPM_RIGHTBUTTON, p1.x, p1.y, this); }
Im falle, dass du das Menü in einer Methode aufrufst, bei welcher kein 'Point' mitgegeben wird, kannst du auch die etwas harte Methode nehmen:
Anstatt 'ClientToScreen' ermittelst du die Mausposition mitCPoint p1; GetCursorPos(&p1);