Page 1 sur 2
[R] Tip sur un ListViewItem
Posté : mar. 27 avr. 2010 10:29
par Iste
Salutations,
Je cherche simplement a afficher un petit tip au passage de la souris sur mes ListViewItem.
J'ai bêtement essayé un guictrlsettip(), ca marche sur la ListView, mais aucun résultat sur les item
En tapant ListViewItem item du forum anglais, presque rien !
Donc voila, si vous avez une idée pour ca...
Merci
Re: [..] Tip sur un ListViewItem
Posté : mar. 27 avr. 2010 11:31
par Tlem
Ha, c'est rigolo, car je suis en train de travailler dessus aussi pour la prochaine version du Pack AutoIt-Fr.
Voilà ce que j'ai trouvé (c'est brut de pomme ... Hein) :
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <GuiTreeView.au3>
$Form1 = GUICreate("Form1", 136, 180, 193, 125)
$TreeView1 = GUICtrlCreateTreeView(8, 8, 121, 161, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_INFOTIP, $WS_GROUP, $WS_TABSTOP))
$TreeView1_0 = GUICtrlCreateTreeViewItem("Text 1", $TreeView1)
$TreeView1_1 = GUICtrlCreateTreeViewItem("1", $TreeView1_0)
$TreeView1_2 = GUICtrlCreateTreeViewItem("2", $TreeView1_0)
$TreeView1_3 = GUICtrlCreateTreeViewItem("3", $TreeView1_0)
$TreeView1_4 = GUICtrlCreateTreeViewItem("4", $TreeView1_0)
$TreeView1_5 = GUICtrlCreateTreeViewItem("5", $TreeView1_0)
$TreeView1_6 = GUICtrlCreateTreeViewItem("Text 2", $TreeView1)
$TreeView1_7 = GUICtrlCreateTreeViewItem("Text 3", $TreeView1)
$TreeView1_8 = GUICtrlCreateTreeViewItem("Text 4", $TreeView1)
$TreeView1_9 = GUICtrlCreateTreeViewItem("Text 5", $TreeView1)
GUISetState(@SW_SHOW)
Global $hTreeView = GUICtrlGetHandle($TreeView1)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case Else
If BitAND(WinGetState($Form1), 8) Then ; Détermine si la GUI principale à le focus
If TreeItemFromPoint($hTreeView) Then ; Détermine si le curseur est sur le treeview
TreeViewToolTip($hTreeView) ; Affiche le tooltip
sleep(25)
EndIf
EndIf
EndSwitch
WEnd
Func TreeViewToolTip($TreeViewHandle)
Local $hParent = _WinAPI_GetParent($TreeViewHandle)
$HotTreeviewItem = TreeItemFromPoint($TreeViewHandle)
If $HotTreeviewItem <> 0 Then
$MousePos = GUIGetCursorInfo()
Local $aWinPos = WinGetPos($hParent)
ToolTip("Tip ID = " & _GUICtrlTreeView_GetItemParam($TreeViewHandle, $HotTreeviewItem) & " " & _
_GUICtrlTreeView_Index($TreeViewHandle, $HotTreeviewItem), $aWinPos[0] + $MousePos[0], $aWinPos[1] + $MousePos[1] + 10)
ElseIf $HotTreeviewItem = 0 Then
ToolTip("")
EndIf
EndFunc ;==>TreeViewToolTip
Func TreeItemFromPoint($hWnd)
Local $tMPos = _WinAPI_GetMousePos(True, $hWnd)
If Not @error Then
Return _GUICtrlTreeView_HitTestItem($hWnd, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2))
Else
Return 0
EndIf
EndFunc ;==>TreeItemFromPoint
Re: [..] Tip sur un ListViewItem
Posté : mar. 27 avr. 2010 12:00
par Iste
Outch,
En plus de faire mal a mon petit double-coeur, en le testant 30sec ca a déclanché une erreur
Code : Tout sélectionner
C:\Documents and Settings\DL\Bureau\brouillon.au3 (42) : ==> [color=#BF0000]Subscript used with non-Array variable.:[/color]
ToolTip("Tip ID = " & _GUICtrlTreeView_GetItemParam($TreeViewHandle, $HotTreeviewItem) & " " & _GUICtrlTreeView_Index($TreeViewHandle, $HotTreeviewItem), $aWinPos[0] + $MousePos[0], $aWinPos[1] + $MousePos[1] + 10)
ToolTip("Tip ID = " & _GUICtrlTreeView_GetItemParam($TreeViewHandle, $HotTreeviewItem) & " " & _GUICtrlTreeView_Index($TreeViewHandle, $HotTreeviewItem), $aWinPos[0] + $MousePos^ ERROR
->11:43:42 AutoIT3.exe ended.rc:1
+>11:43:43 AutoIt3Wrapper Finished
>Exit code: 1 Time: 20.316
m'enfin merci, je vais regarder ca si c'est le seul moyen !
Sinon, en fait je simule déja une List avec une ListView pour gagner en puissance, ne pourrait-on pas passer par un TreeView tant qu'on y est ?
Je cherche de mon coté en tout cas

Re: [..] Tip sur un ListViewItem
Posté : mar. 27 avr. 2010 12:04
par Tlem
Coll, en plus de cela, tu me fait le débuguage. hihihi
Bon, pour l'erreur, c'est tout simple. Si la fenêtre principale n'a plus le focus alors il ne faut plus chercher à afficher le tooltips, sinon on se retrouve à chercher quelque chose qui 'n'existe pas'.
J'ai modifié le code de mon précédent message.

Re: [..] Tip sur un ListViewItem
Posté : mar. 27 avr. 2010 12:19
par Iste
En effet, c'est mieux :p mais beaucoup toujours plus lourd que son alias que j'ai trouvé sur le fofo anglais en cherchant dans les treeview (vu que le resultat est bien celui que je voulais)
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>
Opt("GUIOnEventMode", 1)
$sTitle = "Treeview item descriptions"
$hGui = GUICreate($sTitle, 400, 300, -1, -1, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "SysEvents")
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "SysEvents")
Global $aTreeItemText[6][2] = [["Item 1", "This is item 1"], _
["Item 1A", "This is item 1A"], _
["Item 1B", "This is item 1B"], _
["Item 2", "This is item 2"], _
["Item 2A", "This is item 2A"], _
["Item 2B", "This is item 2B"]]
$cTree = GUICtrlCreateTreeView(10,50,200,200, -1, $WS_EX_CLIENTEDGE)
$cTreeItem_1 = GUICtrlCreateTreeViewItem($aTreeItemText[0][0], $cTree)
$cTreeItem_1A = GUICtrlCreateTreeViewItem($aTreeItemText[1][0], $cTreeItem_1)
$cTreeItem_1B = GUICtrlCreateTreeViewItem($aTreeItemText[2][0], $cTreeItem_1)
$cTreeItem_2 = GUICtrlCreateTreeViewItem($aTreeItemText[3][0], $cTree)
$cTreeItem_2A = GUICtrlCreateTreeViewItem($aTreeItemText[4][0], $cTreeItem_2)
$cTreeItem_2B = GUICtrlCreateTreeViewItem($aTreeItemText[5][0], $cTreeItem_2)
Global $hTree = GUICtrlGetHandle($cTree)
GUICtrlCreateGroup(" Description: ", 220, 50, 170, 200)
$cInfoLabel = GUICtrlCreateLabel("", 230, 70, 150, 170)
GUICtrlCreateGroup ("",-99,-99,1,1)
GUISetState()
While 1
Sleep(1000)
WEnd
Func SysEvents()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_MOUSEMOVE
;
$aHwnd = DllCall("user32.dll", "hwnd", "WindowFromPoint", "uint", MouseGetPos(0), "uint", MouseGetPos(1))
If (IsDeclared("hTree") = 0) Or ($aHwnd[0] <> $hTree) Then ContinueCase
$hItem = TreeItemFromPoint($hTree)
If $hItem = 0 Then
GUICtrlSetData($cInfoLabel, "")
Else
$sTitle = _GUICtrlTreeView_GetText($hTree, $hItem)
$sDesc = ""
For $i = 0 To UBound($aTreeItemText)-1
If $aTreeItemText[$i][0] = $sTitle Then
$sDesc = $aTreeItemText[$i][1]
ExitLoop
EndIf
Next
GUICtrlSetData($cInfoLabel, $sDesc)
EndIf
EndSwitch
EndFunc
;Returns handle of tree item under mouse:
Func TreeItemFromPoint($hWnd)
Local $tMPos = _WinAPI_GetMousePos(True, $hWnd)
Return _GUICtrlTreeView_HitTestItem($hWnd, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2))
EndFunc
source :
http://www.autoitscript.com/forum/index ... ntry426933
ton code vient d'un dérivé de celui là ?
edit : en "mixant" les deux, j'en suis arrivé a un truc fonctionel et assez légé, mais le rendu est saccadé
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <GuiTreeView.au3>
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Form1", 136, 180, 193, 125)
GUISetOnEvent($GUI_EVENT_CLOSE, "SysEvents")
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "SysEvents")
$TreeView1 = GUICtrlCreateTreeView(8, 8, 121, 161, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_INFOTIP, $WS_GROUP, $WS_TABSTOP))
$TreeView1_0 = GUICtrlCreateTreeViewItem("Text 1", $TreeView1)
$TreeView1_1 = GUICtrlCreateTreeViewItem("1", $TreeView1_0)
$TreeView1_2 = GUICtrlCreateTreeViewItem("2", $TreeView1_0)
$TreeView1_3 = GUICtrlCreateTreeViewItem("3", $TreeView1_0)
$TreeView1_4 = GUICtrlCreateTreeViewItem("4", $TreeView1_0)
$TreeView1_5 = GUICtrlCreateTreeViewItem("5", $TreeView1_0)
$TreeView1_6 = GUICtrlCreateTreeViewItem("Text 2", $TreeView1)
$TreeView1_7 = GUICtrlCreateTreeViewItem("Text 3", $TreeView1)
$TreeView1_8 = GUICtrlCreateTreeViewItem("Text 4", $TreeView1)
$TreeView1_9 = GUICtrlCreateTreeViewItem("Text 5", $TreeView1)
GUISetState(@SW_SHOW)
While 1
Sleep(100)
;TreeViewToolTip(GUICtrlGetHandle($TreeView1))
WEnd
Func SysEvents()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_MOUSEMOVE
TreeViewToolTip(GUICtrlGetHandle($TreeView1))
EndSwitch
EndFunc
Func TreeViewToolTip($TreeViewHandle)
Local $hParent = _WinAPI_GetParent($TreeViewHandle) ; Détermine si la fenêtre parent (GUI principale) à le focus
If BitAND(WinGetState($hParent), 8) Then
$HotTreeviewItem = TreeItemFromPoint($TreeViewHandle)
If $HotTreeviewItem <> 0 Then
$MousePos = GUIGetCursorInfo()
Local $aWinPos = WinGetPos($hParent)
ToolTip("Tip ID = " & _GUICtrlTreeView_GetItemParam($TreeViewHandle, $HotTreeviewItem) & " " & _
_GUICtrlTreeView_Index($TreeViewHandle, $HotTreeviewItem), $aWinPos[0] + $MousePos[0], $aWinPos[1] + $MousePos[1] + 10)
ElseIf $HotTreeviewItem = 0 Then
ToolTip("")
EndIf
EndIf
EndFunc ;==>TreeViewToolTip
Func TreeItemFromPoint($hWnd)
Local $tMPos = _WinAPI_GetMousePos(True, $hWnd)
Return _GUICtrlTreeView_HitTestItem($hWnd, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2))
EndFunc ;==>TreeItemFromPoint
Re: [..] Tip sur un ListViewItem
Posté : mar. 27 avr. 2010 13:00
par Tlem
Iste a écrit :ton code vient d'un dérivé de celui là ?
Non
Iste a écrit :en "mixant" les deux, j'en suis arrivé a un truc fonctionel et assez légé, mais le rendu est saccadé.
Je ne vois pas grande différence en dehors du fait que tu passe en mode événementiel ...
Edit : Je viens de modifier la manière de gérer l'événement. Regarde de nouveau le code pour voir si ca te convient mieux.

Re: [..] Tip sur un ListViewItem
Posté : mar. 27 avr. 2010 13:54
par Iste
Ha ben c'est beaucoup mieux ^^ Je le note pour plus tard, car ca semble etre le mieux qu'on puisse faire
Toute fois, je crois que je vais m'en passer pour mon appli actuelle, car le balladage de la souris bouf quand même 25% d'uc sur la grosse bécane du boulot :s (pis, faut l'avouer, c'est plus long a intégrer, et là, j'ai un peu la flemme ^^')
je passe en [R], car ca répond plutôt bien a la question
Mais c'est vraiment dommage qu'autoit ne gère pas ca nativement, car juste pour ca, mon appli deviendrait super lourde
merci

Re: [R] Tip sur un ListViewItem
Posté : mar. 27 avr. 2010 21:29
par Tlem
+1
Et je compatis à la tristesse de ce manque.
Par contre, pour les 25% d'utilisation UC, il suffit de placer un Sleep(25) au bon endroit pour limiter la casse et descendre ce taux aux environs de 5%.
Code mis à jour
dans ce message.

Re: [R] Tip sur un ListViewItem
Posté : ven. 30 avr. 2010 08:59
par Iste
En effet, c'est taupe :p
Bah encore merci, je vais peut etre finir par l'inclure dans mon script alors !
Edit : j'ai finalement utilisé ce code
Code : Tout sélectionner
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "SysEvents")
...
Func SysEvents()
Local $test = _GUICtrlListView_HitTest($JpackageFrame,MouseGetPos(0),MouseGetPos(1)-200)
;-200, la la fonction fonction comme si le control se trouvait en 0,0 (le mien en 0,200)
If $test[0] <> -1 Then
Local $iMode = Opt("MouseCoordMode", 1)
Local $aPos = MouseGetPos()
Opt("MouseCoordMode", $iMode)
Local $tip = String(Eval ("Pack"&Number(_GUICtrlListView_GetItemParam($JpackageFrame,$test[0]))&"|tip"))
;mes tooltip sont noté a la création des item dans des variables "packID|tip"
ToolTip($tip,MouseGetPos(0),MouseGetPos(1)+10)
Else
ToolTip("")
EndIf
EndFunc
Ca prend presque aucune ressource, et ca a l'air de fonctionner, mais :
Comment pourrait-on récupérer le texte du tooltip d'un control ?
Et surtout, pourquoi ce code plante ???
Quand je "m'amuse" trop longtemps avec, ca freez plus ou moins longtemps, le problème semble venir du tootip (sans lui ca marche)
Re: [R] Tip sur un ListViewItem
Posté : ven. 30 avr. 2010 21:56
par Tlem
Un code fonctionnel serait plus pratique pour tester ...
En ce qui concerne le texte du tooltip, le mieux est sans doute de gérer ca par index. C'est à dire lors de la création des items, de rajouter dans un tableau le texte de chaque item en fonction de son index. Ensuite dans la fonction qui gère les événements en rapport avec le survol des items, il faut récupérer l'index de l'item qui se trouve en dessous de la souris et le tour est joué.

Re: [R] Tip sur un ListViewItem
Posté : sam. 01 mai 2010 15:29
par Iste
Tlem a écrit :Un code fonctionnel serait plus pratique pour tester ...
Bah je voulais éditer, mais impossible d'isoler le bug pour le moment :/
Le problème doit surement venir d'ailleurs, mais vu que je pense laisser tomber le tooltip pour un input, on saura peut être jamais ^^'
Pour le tootip, c'est à peut de chose pré ce que je fais grace aux Assign() et Eval(), je voulais juste savoir si on pouvait pas rendre ca plus propre.
Bref, j'en reste donc a mon code, j'éditerai une foi le tout bien propre pour apporter ma réponse.
en fait, la j'en suis a un point ou a force de debug, plus rien ne marche....
Edit :
Voila !
Bon, le code semble fonctionner, mais comme j'ai du tout casser et tout réparer, aucune idée de si le bug que j'avais est resté...
Bref, pour le moment ca marche nickel, donc encore une fois merci Thierry, cette fois ce pense que c'est tout bon !
mon code final
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#Include <GuiListView.au3>
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Form1", 200, 200)
Global $ListView1 = GUICtrlCreateListView('col',10,10, 180, 180)
For $i = 0 To 10
$item = GUICtrlCreateListViewItem("item n°" & $i, $ListView1)
Assign($item&"|tip","item n°" & $i)
Next
_GUICtrlListView_SetColumnWidth($ListView1, 0, $LVSCW_AUTOSIZE_USEHEADER )
GUISetState(@SW_SHOW)
GUISetOnEvent($GUI_EVENT_CLOSE,"quitter")
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "SysEvents")
While 1
Sleep(1000)
WEnd
Func SysEvents()
Local $test = _GUICtrlListView_HitTest(GUICtrlGetHandle($ListView1))
If IsArray($test) And $test[0] <> -1 Then
Local $iMode = Opt("MouseCoordMode", 1)
Local $aPos = MouseGetPos()
Opt("MouseCoordMode", $iMode)
Local $tip = String(Eval (Number(_GUICtrlListView_GetItemParam($ListView1,$test[0]))&"|tip"))
;mes tooltip sont noté a la création des item dans des variables "ID|tip"
ToolTip($tip,MouseGetPos(0),MouseGetPos(1)-10)
Else
ToolTip("")
EndIf
EndFunc
Func quitter()
Exit
EndFunc
Re: [R] Tip sur un ListViewItem
Posté : sam. 01 mai 2010 19:32
par Tlem
Je viens de m'apercevoir, que la question de départ portait sur un contrôle ListView et que j'ai tout bonnement proposé un code à base d'un TreeView ...
Pour le TreeView et pour historique, je propose une dernière version qui me semble bien plus propre.

► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
Global $Form1 = GUICreate("ToolTip sur Item", 200, 180, 193, 125)
Global $hTreeView = GUICtrlCreateTreeView(8, 8, 185, 161)
Global $hTreeView_0 = GUICtrlCreateTreeViewItem("Text 1", $hTreeView)
Global $hTreeView_6 = GUICtrlCreateTreeViewItem("Text 2", $hTreeView)
Global $hTreeView_7 = GUICtrlCreateTreeViewItem("Text 3", $hTreeView)
Global $hTreeView_8 = GUICtrlCreateTreeViewItem("Text 4", $hTreeView)
Global $hTreeView_9 = GUICtrlCreateTreeViewItem("Text 5", $hTreeView)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
AdlibRegister("ClearTip", 500)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndTreeView = $hTreeView
If Not IsHWnd($hWndTreeView) Then $hWndTreeView = GUICtrlGetHandle($hTreeView)
If BitAND(WinGetState($Form1), 8) Then
Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
Local $hGuiIndex = DllStructGetData($tInfo, "SubItem")
If $hGuiIndex > 0 And $hGuiIndex < 500 Then
local $ItemIndex = _GUICtrlTreeView_Index($hTreeView, $hGuiIndex)
ToolTip("Index Item = " & $ItemIndex, MouseGetPos(0) + 15, MouseGetPos(1))
Else
ToolTip("")
EndIf
EndIf
EndFunc ;==>WM_NOTIFY
Func ClearTip()
ToolTip("")
EndFunc
Je pense que je vais aussi passer par un ListView car je vient de trouver comment rajouter la boite à cocher.
Je vais donc regarder comment faire et je viendrais peut être poster un meilleur code ici car j'ai une piste sur la sélection auto de l'item et donc sans doute le tooltip.

Re: [R] Tip sur un ListViewItem
Posté : sam. 01 mai 2010 20:24
par Iste
En effet, mais TreeView > ListView > List, et j'ai quand meme réussi a faire ce que je voulais avec ton code ^^
Par contre, j'aimerai bien quelques petit explication sur ton dernier code.
Il m'a l'air bien mieux que les autre, mais j'ai du mal a saisir son fonctionnement, notamment, comment tu en arrive a trouver l'handle de l'item sous la souris.
Pourrait-on l'adapter a tout les types de control ?
De ce que j'ai compris, WM_NOTIFY() est appelé a chaque passage sur un event, envoyant en param son handle. J'en entend bien parler dans la page Windows Message Codes de la doc, mais sans plus d'explication :/
Re: [R] Tip sur un ListViewItem
Posté : sam. 01 mai 2010 22:14
par Tlem
Iste a écrit :comment tu en arrive a trouver l'handle de l'item sous la souris.
c'est cette partie qui me donne le handle :
Code : Tout sélectionner
Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
Local $hGuiIndex = DllStructGetData($tInfo, "SubItem")
En fait, je l'ai pioché d'un des exemples de la doc.
Je voulais faire un truc sympa en temporisant le tooltip, mais avec le TreeView, c'est la misère.

Re: [R] Tip sur un ListViewItem
Posté : dim. 02 mai 2010 22:49
par Tlem
Voici une version avec un ListView.
► Afficher le texte
Code : Tout sélectionner
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
Global $GUI1 = GUICreate("Ma ListView", 250, 250)
Global $hListView = GUICtrlCreateListView(" ", 8, 8, 235, 235, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_NOCOLUMNHEADER))
GUICtrlSendMsg($hListView, 0x0000101E, 0, 215)
GUISetState()
Global $Item0 = GUICtrlCreateListViewItem("Elément 1", $hListView)
Global $Item1 = GUICtrlCreateListViewItem("Elément 2", $hListView)
Global $Item2 = GUICtrlCreateListViewItem("Elément 3", $hListView)
Global $Item3 = GUICtrlCreateListViewItem("Elément 4", $hListView)
Global $Item4 = GUICtrlCreateListViewItem("Elément 5", $hListView)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $msg, $wParam, $lParam)
Local $nmhdr = DllStructCreate($tagNMHDR, $lParam)
Local $tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $lParam)
Local $hWndFrom = DllStructGetData($tNMITEMACTIVATE, 'hWndFrom')
Local $Index = DllStructGetData($tNMITEMACTIVATE, 'Index')
Local $iCode = DllStructGetData($tNMITEMACTIVATE, 'Code')
Local $hWndTreeView = $hListView
If Not IsHWnd($hWndTreeView) Then $hWndTreeView = GUICtrlGetHandle($hListView)
Switch $hWndFrom
Case $hWndTreeView
Switch $iCode
Case $LVN_HOTTRACK
If $Index <> -1 Then
Local $ItemText = _GUICtrlListView_GetItemText($hWndTreeView, $Index)
ToolTip($ItemText, MouseGetPos(0) + 15, MouseGetPos(1))
AdlibRegister("ClearTip", 500)
Else
AdlibUnRegister("ClearTip")
ClearTip()
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func ClearTip()
ToolTip("")
EndFunc ;==>ClearTip
Re: [R] Tip sur un ListViewItem
Posté : dim. 02 mai 2010 23:26
par jchd
Perso j'ai botté en touche pour la temporisation. Bien sûr c'est très faisable, mais le plus simple est d'avoir des indicateurs globaux et une fonction AdlibRegister() pour ça (et d'autres choses).
J'ai finalement trouvé que la complication n'en valait pas vraiment la peine et me contente de faire un ToolTip('') sur changement d'item et sur changement de focus. Pour l'utilisateur ce n'est pas gênant, surtout si on a pris soin de bien paramétrer le tooltip pour qu'il ne gêne pas la vue du champ sur lequel il porte, et en faisant passer le texte du tooltip sur plusieurs lignes pour éviter un "machin" atrocement illisible car trop étendu horizontalement.
Un exemple de fonction (tirez pas sur l'ambulance, c'est du très basique) pour faire ça:
Code : Tout sélectionner
Func _StringMulti($sIn, ByRef $sOut, $min, $max)
Local $a = StringSplit($sIn, " ", 2)
Local $len = 0, $multi = False
$sOut = ''
For $i = 0 to UBound($a) - 1
If $len < $min Then
$sOut &= $a[$i] & ' '
$len += StringLen($a[$i]) + 1
Else
$sOut &= @LF & $a[$i] & ' '
$len = StringLen($a[$i]) + 1
$multi = True
EndIf
Next
Return $multi
EndFunc
$in=la chaîne d'entrée, $out=la sortie par valeur ; $min et $max sont des longueurs (en caractères) entre lesquelles on introduit un saut de ligne. Dans mes applis, j'emploie facilement 70 et 90 respectivement. Si on veut faire "joli", on en arrive à se cogner la métrique de la représentation de la chaîne et travailler dessus, mais c'est vite très lourd et horriblement galère.
En fonction du type de champ et du contenu typique des tooltips qu'on a à afficher, il faut expérimenter un peu pour trouver le juste milieu. Dans mon cas, c'est tout simplement le contenu de champs "trop longs" pour affichage en entier (critère déterminé au pif, car sinon cela implique un détour par la métrique).
► Afficher le texte
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $iIDFrom, $iCode, $tNMHDR, $tInfo
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $iIDFrom
Case $lvSteps
Switch $iCode
Case $LVN_HOTTRACK
Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
Local $iItem = DllStructGetData($tInfo, "Item")
Local $subitemNR = DllStructGetData($tInfo, "SubItem")
; if no cell change return without doing anything
If $iLastItemStep = $iItem And $iLastsubitemNR = $subitemNR Then Return 0
$iLastItemStep = $iItem
$iLastsubitemNR = $subitemNR
ToolTip('')
Switch $subitemNR
Case 1 ;; je sais que le champ peut être assez long, donc je découpe en lignes si besoin
Local $sToolTipData = _GUICtrlListView_GetItemText($lvSteps, $iItem, 1)
If $sToolTipData <> '' And StringLen($sToolTipData) > 75 Then
Local $MultiLine
Local $split = _StringMulti($sToolTipData, $MultiLine, 70, 90)
If $split Then
ToolTip($MultiLine, MouseGetPos(0) + 20, MouseGetPos(1) + 20, "", 0, 5)
EndIf
EndIf
Case 2 ;; sur cette colonne, les champs restent raisonablement courts, pas de multiligne
Local $sToolTipData = _GUICtrlListView_GetItemText($lvSteps, $iItem, 2)
If $sToolTipData <> '' And StringLen($sToolTipData) > 30 Then
ToolTip($sToolTipData, MouseGetPos(0) + 20, MouseGetPos(1) + 20, "", 0, 5)
EndIf
EndSwitch
EndSwitch
.../...
Edit : évidemment, le temps que je pioche mes billes pour poster, notre deus ex machina me coupe l'herbe sous le pied ! A propos, j'ai besoin de quelqu'un pour tondre...
Re: [R] Tip sur un ListViewItem
Posté : sam. 11 avr. 2015 09:13
par Clean
Bonjour,
Désolé pour le déterrage : mais je préfère faire ça plutôt que créer un nouveau topic ...
Bref bonjour la communauté je suis tout fraîchement inscrit sur le fofo :p
Ma question est en lien avec le sujet initiale de ce post :
Quel moyen aurais-je de créer des ToolTip sur des parties d'un texte dans une GUI ?
J'ai réfléchi à des moyens trop lourds d'y arriver donc si quelqu'un à une petite idée ...
Re: [R] Tip sur un ListViewItem
Posté : sam. 11 avr. 2015 12:09
par mikell
"des parties d'un texte dans une GUI" , c'est plutôt vague
Il est où précisément ce texte, dans quel type de controle (label, edit,...) ?
Re: [R] Tip sur un ListViewItem
Posté : sam. 11 avr. 2015 14:50
par Clean
Dans un label.
Il s'agit en fait d'écrire un texte où certain mots seront des mots-clés, lorsqu'on passera la souris dessus une tooltip indiquera les informations principales et clicker lancera une recherche (i.e. une fonction avec le mot en paramètre).
Re: [R] Tip sur un ListViewItem
Posté : sam. 11 avr. 2015 17:31
par mikell
Très chaud AMHA si le script doit chercher l'emplacement du mot dans le texte de la label
Je te conseille vivement de tricher, en faisant un assemblage de labels avec des éléments de texte ou juste les mots-clé, ou avec des labels transparentes comme ça par exemple
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
GUICreate("gui", 250, 100)
$label = GUICtrlCreateLabel("voilà un texte dans un controle label", 10, 30, 200, 20)
$texte = GUICtrlCreateLabel("", 40, 30, 35, 20)
GUICtrlSetState(-1, $GUI_ONTOP)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetTip(-1, "le texte")
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $texte
Msgbox(0,"", 'cliqué "texte"')
EndSwitch
WEnd