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 mit

    CPoint p1;
    GetCursorPos(&p1);
    

Anmelden zum Antworten