CListCtrl / Kontextmenü?



  • Hi. Ich will bei Markierung eines Eintrags aus dem CListCtrl ein Kontextmenü "aufpoppen" lassen. Momentan versuch ich erfolglos die Position des aktuellen Mausklicks zu ermitteln.

    void CProjektView::OnRclickListe(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    menu.LoadMenu(IDR_KONTEXT);
    CMenu *pContextMenu = menu.GetSubMenu(0);
    pContextMenu->TrackPopupMenu(TPM_LEFTALIGN |
    			TPM_LEFTBUTTON | TPM_RIGHTBUTTON, 0, 0, this);
    }
    

    Momentan muss die Postion des Menüs fest eingegeben werden. Wie kann ich diese so wie bei der Verwendung von WM_CONTEMNU ermitteln? Oder muss ich aus meiner "Rechts-Klick-Methode" die "Kontext-Methode" aufrufen? Wenn ja, wie?



  • Also wenn du ein Kontextmenu bei Klick mit der rechten Maustaste erscheinen lassen willst, dann leg einfach dein Menü an, füge eine Nachrichtenbehandlungsroutine für WM_CONTEXTMENU ein und füge diesen Code ein:

    void CTestDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
       pWnd = GetDlgItem(STEUERELEMENT ID); 
       CRect rect; 
       pWnd->GetWindowRect(rect); 
    
       if(rect.PtInRect(point)) 
       { 
          CMenu menu; 
          menu.LoadMenu(MENU-ID); 
          menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); 
       } 
    }
    


  • Dann ergibt sich aber das Problem des Zugriffs auf die einzelnen Zeilen und Spalten des CListCtrls. Diesen habe ich bisher folgendermaßen realisiert.

    void CProjektView::OnRclickListe(NMHDR* pNMHDR, LRESULT* pResult) 
    {
      NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    
      int iSpalte = pNMListView->iSubItem;
    
      // ....
    }
    

    Wie lässt sich das Problem jetzt lösen?



  • void CDeineKlasse::OnNMRclickDataList(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	CMenu menu;
    	CPoint point;
    
    	VERIFY(menu.LoadMenu(ID_DEINES_MENUS));
    
    	CMenu* pPopup = menu.GetSubMenu(0);
    	ASSERT(pPopup != NULL);
    
    	CWnd* pWndPopupOwner = this;
    
    	while (pWndPopupOwner->GetStyle() & WS_CHILD)
    		pWndPopupOwner = pWndPopupOwner->GetParent();
    
    	GetCursorPos(&point);
    
    	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
    		pWndPopupOwner);	
    	*pResult = 0;
    }
    

    Damit ist die aktuelle Zeile markiert bevor das Menü angezeigt wird, hoffe das war das was du haben wolltest.



  • Danke. Das hatte ich gemeint.

    Wie kann ich nun die Informationen, über die Zeile und die Spalte, auf der ich das Kontextmenü aufpoppen lasse, an eine Methode weiterreichen, die über das Kontextmenü aufgerufen wird? Ich möchte also über das Kontextmenü ein neues Dialogfeld mit Eingabefeldern öffnen, die mit den Inhalten der Gerade im CListCtrl aktivierten Zeile gefüllt ist.



  • Ein ähnliches Problem hatte ich auch nur konnte ich dann auf den Header ausweichen weil ich es nicht hinbekommen hab ^^

    erstmal: Item = Zeile, Subitem = Spalte

    Du kannst denke ich mit
    GetSubItemRect die Koordinaten des SubItems bestimmen, vll musst du die Koordinaten noch irgendwie konvertieren (bin mir da nie 100% sicher was wohin und wie ^^)
    Dann in OnContextmenu 2 schleifen die dir deine Items/Subitems durchgehen und prüfen ob der Punkt innerhalb des Rechtecks liegt - wenn ja öffne Contextmenu

    so oder so ähnlich

    ugly aber könnte funktionieren 😃



  • oli2006 schrieb:

    Danke. Das hatte ich gemeint.

    Wie kann ich nun die Informationen, über die Zeile und die Spalte, auf der ich das Kontextmenü aufpoppen lasse, an eine Methode weiterreichen, die über das Kontextmenü aufgerufen wird? Ich möchte also über das Kontextmenü ein neues Dialogfeld mit Eingabefeldern öffnen, die mit den Inhalten der Gerade im CListCtrl aktivierten Zeile gefüllt ist.

    Hat noch jemand 'ne Idee dazu?



  • Gehts dir nur um die Zeile oder um genau ein Subitem aus der Zeile ?

    Die Zeile kreigst du ganz einfach mittels:

    ClistCtrl::GetSelectionMark();
    


  • Mir geht's auch um Subitems aus der Zeile.


Anmelden zum Antworten