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
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
Dafür gibt es LVN_HOTTRACK:
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
$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()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
[/autoit] [autoit][/autoit] [autoit]Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
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
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
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
$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
Na ist ja fast mein Lösungsweg
MfG
Der_Doc
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.
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.
Alles anzeigen
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!