CListCtrl: Bei Klick Zeile und Spalte rausfinden - wie?



  • Moin!

    Ich habe ein Listcontrol und möchte beim Klick darauf abfragen, wo geklickt wurde.
    Die Zeile finde ich so raus: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39110.html

    void CSortListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) 
    {
    	POSITION pos = GetFirstSelectedItemPosition();
    	int indexnummer= GetNextSelectedItem(pos); 
    
    	CListCtrl::OnLButtonDblClk(nFlags, point);
    }
    

    Allerdings möchte ich auch Klicks in den Header wissen. ⚠
    Und natürlich fehlt mir generell noch, in welche Spalte geklickt wurde.

    Ich bin für jeden Ansatz dankbar, auch Links. 🙂


  • Mod

    Das Headercontrol sendet seine Notifications an das CListCtrl. Du musst also das CListCtrl subclassen. Dort kannst Du HDN_ITEMCLICK abfangen und bearbeiten.



  • Ein kurzer Blick in die MSDN hat die Methode 'SubItemHitTest()' als Kandidaten ausfindig gemacht:

    LVHITTESTINFO inf;
    inf.pt=point;//zu testende Koordinaten
    SubItemHitTest(&inf);
    int index=inf.iTtem;
    int sub =inf.iSubItem;
    


  • Ahja. Okay danke ich guck mir das mal an. 🙂



  • Ha, ich hab es - mit Trick 17, aber es klappt:

    void CBasisListCtrl::HitTestEx(CPoint& f_Point, int& f_nRow, int& f_nColumn) 
    {
    	ScreenToClient(&f_Point);
    
    	LVHITTESTINFO inf;
    	inf.pt = f_Point; //zu testende Koordinaten
    	SubItemHitTest(&inf);
    
    	// Im Header?
    	CRect rect;
    	GetHeaderCtrl()->GetWindowRect(&rect);
    	ScreenToClient(&rect);
    	if (PtInRect(&rect, f_Point))
    	{
    		f_nRow = -1;
    	}
    	else
    	{
    		// Rest
    		f_nRow = inf.iItem;
    	}
    
    	f_nColumn = inf.iSubItem;
    }
    

    Diese Funktion wird immer dann aufgerufen, wenn das Kontextmenü angezeigt wird.
    Das geht, weil der Befehl, wo ich die Koordinaten brauche, nur aus dem Kontextmenü aufrufbar ist.

    void CBasisListCtrl::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
        CMenu menu; 
        // Kontextmenü laden 
        menu.LoadMenu(IDR_MNU_KTXT); 
        // Welches Untermenü 
        CMenu * pContextMenu = menu.GetSubMenu(m_nKtxtMnuIdx); 
    
        // Kontextmenü anzeigen 
        pContextMenu->TrackPopupMenu(TPM_LEFTALIGN + TPM_RIGHTBUTTON, point.x, point.y, this);//AfxGetMainWnd()); 	
    
    	HitTestEx(point, m_nRow, m_nCol);
    }
    

Anmelden zum Antworten