Что нового

Как назначить ToolTip для элементов TreeViewItem?

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Мне нужно отловить наведение, чтоб для каждого итема выводить соответствующий ToolTip. В данном случае я вижу лишь такой выход...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
SECTOR сказал(а):
Мне нужно отловить наведение, чтоб для каждого итема выводить соответствующий ToolTip. В данном случае я вижу лишь такой выход...

Есть такая функция _GUICtrlTreeView_SetToolTips(), правда я с ней не имел дело. А отловить можно так:

Код:
#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
 
Автор
SECTOR

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Завтра посмотрю и отпишусь :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
отловить можно так
Хороший метод, но делать это в цикле не самая лучшая идея:

Код:
#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
 
Автор
SECTOR

SECTOR

Продвинутый
Сообщения
399
Репутация
59
CreatoR, Yashied
Спасибо, оба варианта рабочие
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот тебе супер вариант с задержкой появления и временем показа.

:smile:

Код:
#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
 
Верх