SECTOR сказал(а):Мне нужно отловить наведение, чтоб для каждого итема выводить соответствующий ToolTip. В данном случае я вижу лишь такой выход...
#Include <GUITreeView.au3>
#Include <WinAPI.au3>
Global $Timer = 0, $Tip = False
$hGUI = GUICreate('MyGUI', 300, 200)
$TreeView = GUICtrlCreateTreeView(10, 10, 280, 180)
$Item = GUICtrlCreateTreeViewItem('Item1', -1)
GUISetState()
Do
If _GUICtrlTreeView_IsMouseOver($TreeView, $Item, 1) Then
If Not $Tip Then
ToolTip('Simple Text', MouseGetPos(0), MouseGetPos(1))
$Timer = TimerInit()
$Tip = 1
EndIf
Else
ToolTip('')
$Timer = 0
$Tip = 0
EndIf
If $Timer Then
If TimerDiff($Timer) > 5000 Then
ToolTip('')
$Timer = 0
EndIf
EndIf
Until GUIGetMsg() = -3
Func _GUICtrlTreeView_IsMouseOver($hWnd, $hItem, $fTextOnly = 0)
If Not IsHWnd($hWnd) Then
$hWnd = GUICtrlGetHandle($hWnd)
If Not $hWnd Then
Return SetError(1, 0, 0)
EndIf
EndIf
If Not IsHWnd($hItem) Then
$hItem = GUICtrlGetHandle($hItem)
If Not $hItem Then
Return SetError(1, 0, 0)
EndIf
EndIf
Local $tRect = _GUICtrlTreeView_DisplayRectEx($hWnd, $hItem, $fTextOnly)
Local $tPoint = _WinAPI_GetMousePos(1, $hWnd)
Return _WinAPI_PtInRect($tRect, $tPoint)
EndFunc ;==>_GUICtrlTreeView_IsMouseOver
Хороший метод, но делать это в цикле не самая лучшая идея:отловить можно так
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUITreeView.au3>
#include <WinAPI.au3>
Global $aTV_Items_ToolTips[1][1]
$GUI = GUICreate("_GUICtrlTreeView_ToolTip_Handler", 200, 180, 193, 125)
$TreeView = GUICtrlCreateTreeView(10, 10, 180, 160, -1, $WS_EX_CLIENTEDGE)
$TreeView_Item1 = GUICtrlCreateTreeViewItem("Item 1", $TreeView)
$TreeView_Item2 = GUICtrlCreateTreeViewItem("Item 2", $TreeView)
$TreeView_Item3 = GUICtrlCreateTreeViewItem("Item 3", $TreeView)
$TreeView_Item4 = GUICtrlCreateTreeViewItem("Item 4", $TreeView)
$TreeView_Item5 = GUICtrlCreateTreeViewItem("Item 5", $TreeView)
_GUICtrlTreeView_SetToolTip($GUI, $TreeView, $TreeView_Item1, "Some ToolTip 1")
_GUICtrlTreeView_SetToolTip($GUI, $TreeView, $TreeView_Item3, "Some ToolTip 3")
_GUICtrlTreeView_SetToolTip($GUI, $TreeView, $TreeView_Item5, "Some ToolTip 5")
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _GUICtrlTreeView_SetToolTip($hWnd, $nTreeView, $nTreeView_Item, $sToolTip)
$aTV_Items_ToolTips[0][0] += 1
If $aTV_Items_ToolTips[0][0] = 1 Then
AdlibRegister("_GUICtrlTreeView_ToolTip_Handler", 10)
EndIf
ReDim $aTV_Items_ToolTips[$aTV_Items_ToolTips[0][0]+1][3]
$aTV_Items_ToolTips[$aTV_Items_ToolTips[0][0]][0] = GUICtrlGetHandle($nTreeView)
$aTV_Items_ToolTips[$aTV_Items_ToolTips[0][0]][1] = GUICtrlGetHandle($nTreeView_Item)
$aTV_Items_ToolTips[$aTV_Items_ToolTips[0][0]][2] = $sToolTip
EndFunc
Func _GUICtrlTreeView_ToolTip_Handler()
If $aTV_Items_ToolTips[0][0] = 0 Then
Return 0
EndIf
Local $tRect, $tPoint, $aMousePos
For $i = 1 To $aTV_Items_ToolTips[0][0]
$tRect = _GUICtrlTreeView_DisplayRectEx($aTV_Items_ToolTips[$i][0], $aTV_Items_ToolTips[$i][1], 1)
$tPoint = _WinAPI_GetMousePos(1, $aTV_Items_ToolTips[$i][0])
If _WinAPI_PtInRect($tRect, $tPoint) Then
$aMousePos = MouseGetPos()
Return ToolTip($aTV_Items_ToolTips[$i][2], $aMousePos[0]+15, $aMousePos[1]-5)
EndIf
Next
Return ToolTip("")
EndFunc
#Include <GUIConstantsEx.au3>
#Include <GUITreeView.au3>
#Include <Memory.au3>
#Include <WindowsConstants.au3>
#Include <WinAPI.au3>
Global Const $tagTIP = 'wchar Title[100];dword Icon;dword Options;dword Duration;' ; & 'wchar Text[n]'
Global $__Temp[9] = [0, 0]
$hGUI = GUICreate('MyGUI', 300, 200)
$TreeView = GUICtrlCreateTreeView(10, 10, 280, 180, BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_INFOTIP))
$Item1 = GUICtrlCreateTreeViewItem('Item1', $TreeView)
$Item2 = GUICtrlCreateTreeViewItem('Item2', $TreeView)
$Item3 = GUICtrlCreateTreeViewItem('Item3', $TreeView)
_GUICtrlTreeView_SetItemToolTip($TreeView, $Item1, 'Text1', '', 0, 0, 2000)
_GUICtrlTreeView_SetItemToolTip($TreeView, $Item2, 'Text2', 'Title', 1, 1)
_GUICtrlTreeView_SetItemToolTip($TreeView, $Item3, 'Text3', 'Title', 3, 0, 2000)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_GUICtrlTreeView_SetItemToolTip($TreeView, $Item1, '')
_GUICtrlTreeView_SetItemToolTip($TreeView, $Item2, '')
_GUICtrlTreeView_SetItemToolTip($TreeView, $Item3, '')
Func _GUICtrlTreeView_SetItemToolTip($hWnd, $hItem, $sText, $sTitle = '', $iIcon = 0, $iOptions = 0, $iDuration = 0)
Local $hMem, $pMem, $tTip, $iLenght
If Not IsHWnd($hWnd) Then
$hWnd = GUICtrlGetHandle($hWnd)
If Not $hWnd Then
Return SetError(1, 0, 0)
EndIf
EndIf
If Not IsHWnd($hItem) Then
$hItem = GUICtrlGetHandle($hItem)
If Not $hItem Then
Return SetError(1, 0, 0)
EndIf
EndIf
If Not StringStripWS($sText, 3) Then
$hMem = _GUICtrlTreeView_GetItemParam($hWnd, $hItem)
If $hMem Then
If Not _GUICtrlTreeView_SetItemParam($hWnd, $hItem, 0) then
Return SetError(1, 0, 0)
EndIf
_MemGlobalFree($hMem)
EndIf
Return 1
EndIf
$iLenght = StringLen($sText)
$tTip = DllStructCreate($tagTIP)
$hMem = _MemGlobalAlloc(DllStructGetSize($tTip) + 2 * ($iLenght + 1))
$pMem = _MemGlobalLock($hMem)
$tTip = DllStructCreate($tagTIP & 'wchar Text[' & ($iLenght + 1) & ']', $pMem)
DllStructSetData($tTip, 'Title', StringLeft($sTitle, 99))
DllStructSetData($tTip, 'Icon', $iIcon)
DllStructSetData($tTip, 'Options', $iOptions)
DllStructSetData($tTip, 'Duration', $iDuration)
DllStructSetData($tTip, 'Text', $sText)
_MemGlobalUnlock($hMem)
If Not _GUICtrlTreeView_SetItemParam($hWnd, $hItem, $hMem) Then
_MemGlobalFree($hMem)
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_GUICtrlTreeView_SetItemToolTip
Func _TipHelper()
Local $tRect, $tPoint
If ($__Temp[8]) And (TimerDiff($__Temp[8]) > $__Temp[5]) Then
_TipRelease()
Return
EndIf
$tRect = _GUICtrlTreeView_DisplayRectEx($__Temp[0], $__Temp[1], 1)
$tPoint = _WinAPI_GetMousePos(1, $__Temp[0])
If _WinAPI_PtInRect($tRect, $tPoint) Then
If ($__Temp[7]) And (TimerDiff($__Temp[7]) > 800) Then
ToolTip($__Temp[6], MouseGetPos(0), MouseGetPos(1), $__Temp[2], $__Temp[3], $__Temp[4])
$__Temp[7] = 0
EndIf
Else
_TipRelease()
Return
EndIf
EndFunc ;==>_TipHelper
Func _TipRelease()
AdlibUnRegister('_TipHelper')
ToolTip('')
$__Temp[1] = 0
EndFunc ;==>_TipRelease
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $tNMTVGETINFOTIP = DllStructCreate($tagNMTVGETINFOTIP, $lParam)
Local $hWndFrom = DllStructGetData($tNMTVGETINFOTIP, 'hWndFrom')
Local $hItem = DllStructGetData($tNMTVGETINFOTIP, 'hItem')
Local $iCode = DllStructGetData($tNMTVGETINFOTIP, 'Code')
Local $hTreeView = GUICtrlGetHandle($TreeView)
Local $hMem, $pMem, $tTip, $sTip
Switch $hWndFrom
Case $hTreeView
Switch $iCode
Case $TVN_GETINFOTIPW
If Not $__Temp[1] Then
$hMem = _GUICtrlTreeView_GetItemParam($hTreeView, $hItem)
If $hMem Then
$pMem = _MemGlobalLock($hMem)
If $pMem Then
_TipRelease()
$tTip = DllStructCreate($tagTIP)
$tTip = DllStructCreate($tagTIP & 'wchar[' & ((_MemGlobalSize($hMem) - DllStructGetSize($tTip)) / 2) & ']', $pMem)
$__Temp[0] = $hTreeView
$__Temp[1] = $hItem
For $i = 2 To 6
$__Temp[$i] = DllStructGetData($tTip, $i - 1)
Next
_MemGlobalUnlock($hMem)
$__Temp[7] = TimerInit()
If $__Temp[5] Then
$__Temp[8] = TimerInit()
Else
$__Temp[8] = 0
EndIf
AdLibRegister('_TipHelper', 5)
EndIf
EndIf
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY