Tooltip bei mouseover in listview?

  • Hi,

    _GUICtrlListView_SetToolTips bezieht sich wohl auf die komplette Listbox.
    Ich habe nichts gefunden, um pro subItem (Zelle) einen Tooltip setzen zu können und diesen dann mit mouseover auszulesen.

    Gibt es das Feature nicht?

    Grüße
    Guido

  • Mh genau kann ich dir das nicht sagen aber ein Ansatz wäre jetzt den Handle/ID des SubItems auszulesen und dann mit einer if oder While-schleife auf das Item zu reagieren und eine ToolTip setzen.

    Das könnte doch bestimmt gehen.
    Teste es doch mal und berichte dann hier.

    MfG
    Der_Doc

    • Offizieller Beitrag

    Dafür gibt es LVN_HOTTRACK:

    Spoiler anzeigen
    [autoit]

    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate('test')
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 146)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
    For $i = 1 To 10
    GUICtrlCreateListViewItem('Zeile ' & $i & ' Spalte 1|Zeile ' & $i & ' Spalte 2', $hListView)
    Next
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit]

    Func ListView_HOTTRACK($iSubItem)
    Local $HotItem = _GUICtrlListView_GetHotItem($hListView)
    If $HotItem <> -1 Then _ToolTipMouseExit("Überfahrenes Item: " & $HotItem & " SubItem: " & $iSubItem & @CRLF & _
    'Inhalt: ' & _GUICtrlListView_GetItemText($hListView, $HotItem, $iSubItem), 500)
    EndFunc ;==>ListView_HOTTRACK

    [/autoit] [autoit][/autoit] [autoit]

    Func _ToolTipMouseExit($TEXT, $TIME=-1, $x=-1, $y=-1, $TITLE='', $ICON=0, $OPT='')
    If $TIME = -1 Then $TIME = 3000
    Local $start = TimerInit(), $pos0 = MouseGetPos()
    If ($x = -1) Or ($y = -1) Then
    ToolTip($TEXT, $pos0[0], $pos0[1], $TITLE, $ICON, $OPT)
    Else
    ToolTip($TEXT, $x, $y, $TITLE, $ICON, $OPT)
    EndIf
    Do
    Sleep(50)
    $pos = MouseGetPos()
    Until (TimerDiff($start) > $TIME) Or _
    (Abs($pos[0] - $pos0[0]) > 10 Or _
    Abs($pos[1] - $pos0[1]) > 10)
    ToolTip('')
    EndFunc ;_ToolTipMouseExit

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    [/autoit] [autoit][/autoit] [autoit]

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $LVN_HOTTRACK ; Sent by a list-view control when the user moves the mouse over an item
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    ListView_HOTTRACK(DllStructGetData($tInfo, "SubItem"))
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

  • dein Beispiel

    Dein Beispiel funktioniert super, allerdings hilft mir das noch nicht.

    Ich würde gerne beim Eintragen der Werte individuelle Tooltipps setzen.

    Beispiel:
    GUICtrlCreateListViewItem(Zeile 1 Spalte 1 | Zeile 1 Spalte 2)
    Und jetzt: Tooltipp 'Wert 1-1' | 'Wert 1-2'
    Die Zelle bekommt also einen zusätzlichen Wert, der nur bei Mouseover angezeigt wird.

    Wenn das so nicht machbar ist, dann müsste ich mir vielleicht ein (Mehrdimensionales) Array machen und dort die Tooltipps reinschreiben und dann bei Mouseover anhand der Koordinaten entsprechend auslesen.

    • Offizieller Beitrag

    Ich würde gerne beim Eintragen der Werte individuelle Tooltipps setzen.


    Ja, mein Bsp. sollte auch nur den Weg zeigen, wie du an Zeilen- und SpaltenIndex des HotItems kommst. Individuelle Tooltipps müßtest du dann in einem separaten Array ablegen.
    Dabei wirst du evtl. auf ein Problem stoßen: Was passiert, wenn z.B. Elemente eingefügt, gelöscht werden oder das Listview sortiert wird?
    Dann stimmt deine Zuordnung aus dem Array nicht mehr.
    Das kannst du umgehen, indem du
    - entweder alle Aktionen, die im Listview stattfinden auch auf dein Array anwendest um dort den selben Status zu haben - seeehr aufwändig ;)
    oder
    - du nutzt (so, wie ich es in ListviewFormat getan habe) iParam zum Speichern eines Verweises zum Array. Dann sind Veränderungen im Listview nicht relevant. Allerdings mußt du für SimpleSort die von mir modifizierte Version verwenden, damit auch iParam mitsortiert wird.

  • Dein Beispiel ist mir eine große Hilfe. Schade, dass man Zellen-Tooltipps nur über ein Array abwickeln kann.
    Momentan werden die Einträge in ListView automatisch zyklisch eingetragen und können nicht vom User überschrieben werden, daher habe ich mit dem Array und dem Verweis in diesem Fall kein Problem. Aber so etwas kann sich ja schnell mit Erweiterungen und neuen Möglichkeiten ändern. Dann ist der Trick mit der Param natürlich sehr hilfreich.

    Ich werde mal Dein Script um ein Array erweitern und mich dann an die nächste Hürde mit dem Modifizieren und Sortieren beschäftigen.

    Vielen Dank für Deine super Hilfe!