ListView einträge, Event bei Mousehover - wie`?
-
hi,
ich hab eine listview erstellt und jetzt möchte ich gerne ein event ausführen, wenn die maus über einen listview item "hovert", (ich mochte da so eine art ergänzende infos anzeigen) aber wie krieg ich dieses event bei einem listview abgefragt.
ich muss wissen wann die maus hovert und dann informationen aus dieser zeile abrufen können.
weis jemand wie das geht?
-
Dazu musst Du einfach das List View subclassen und die Nachricht WM_MOUSEMOVE abfangen und bearbeiten.
Oder geht es Dir um die nachrichten, die in TrackMouseEvent beschrieben stehen.
-
Martin Richter schrieb:
Dazu musst Du einfach das List View subclassen und die Nachricht WM_MOUSEMOVE abfangen und bearbeiten.
Oder geht es Dir um die nachrichten, die in TrackMouseEvent beschrieben stehen.
also ich benötige die informationen aus der zeile der listview, über die der mousezeiger grade hovert. die kriege ich, wenn ich das richtig sehe, auch nicht über die trackmouseevent struktur ?
-
Du kannst mit LVM_HITEST prüfen auf welchem Item der Cursor steht.
-
Martin Richter schrieb:
Du kannst mit LVM_HITEST prüfen auf welchem Item der Cursor steht.
ich hab das mal versucht, allerdings krieg ich einen stack-overflow bei aufruf des makros
LRESULT CALLBACK ListViewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { LVHITTESTINFO pHitInfo; pHitInfo.flags = LVHT_ONITEM; ListView_HitTest(hWnd, &pHitInfo); return CallWindowProc ((WNDPROC) PrevWndProcListView, hWnd, message, wParam, lParam); }als fehler krieg ich einen stack-overflow woran gkann das liegen?
-
Logisch bekommst Du einen Stack Overflow.
Du sendest and die selbe Fensterprozedur die Nachricht!
Das muss doch eine Endlosschleife verursachen.
-
ok, danke.
ich bin jetzt soweit das ich über das tme das hover-event auslöse und dann über diesen hit-test eigentlich die zeilenwerte hole. allerdings stehen in der info struktur nur unintitalisierte items/subitems -ids drin. da läuft also irgendwas noch schief....seh aber nicht was:
das listview ist gesub-classed
LRESULT CALLBACK ListViewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_MOUSEMOVE: TRACKMOUSEEVENT tme; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_HOVER; tme.dwHoverTime = HOVER_DEFAULT; tme.hwndTrack = hWnd; TrackMouseEvent(&tme); break; case WM_MOUSEHOVER: LVHITTESTINFO pHitInfo; pHitInfo.flags = LVHT_ONITEM; ListView_HitTest(hWnd, &pHitInfo); int a; a =3; break; } return CallWindowProc ((WNDPROC) PrevWndProcListView, hWnd, message, wParam, lParam); }
-
problem is noch aktuell *push*
-
Doku lesen!
Wie soll Hittest funktionieren wenn Du nicht angibst auf welchen Punkt geprüft werden soll? Der pt Wert muss ausgefüllt werden.
Weiterhin ist flags ein Ausgabewert, kein Wert den Du setzen müsstest.Warum liest Du nicht was die MSDN schreibt?
-
wenn ich mir mit getcursorpos die position hole auf der ich grad stehe und die bei der struktur mit geben komme ich leider nicht zum erfolg.
der hittest liefert mir als item id immer die -1 wieder.
-
karlos982 schrieb:
wenn ich mir mit getcursorpos die position hole auf der ich grad stehe und die bei der struktur mit geben komme ich leider nicht zum erfolg.
der hittest liefert mir als item id immer die -1 wieder.
DOKU LESEN!

GetCursorPos liefert die Koordinaten als Screenkoordinaten. Du benötigst die aber als Client Koordinaten. Also ScreenToClient verwenden.
-
danke, probier ich mal aus.
p.s.: wenn man nicht weis das es ein unterschied zwischen screen und client coords gibt, macht es bei dem satz "Position to hit test, in client coordinates" auch nicht klick
