ListView einträge, Event bei Mousehover - wie`?



  • 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 ?


  • Mod

    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?


  • Mod

    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*


  • Mod

    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.


  • Mod

    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 😉


Anmelden zum Antworten