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.htmlvoid 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.

-
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); }