Что нового

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

SECTOR

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
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

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
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

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

Yashied

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

: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
 
Верх