Что нового

_GUICtrlListView и наведение мыши на элемент

running-frag

why me?
Сообщения
441
Репутация
60
Конечно бывает моменты где я туплю. :rofl: Но этот очень интересные, пример взят с манки хэлпа. И он не работает. Вопрос почему и как сделать что бы при наведении на элемент подсвечивался ToolTip и снимался при потери фокуса этого элемента.
Код:
#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

$Debug_LV = False ; Check ClassName being passed to ListView functions, set to True and use a handle to another control to see it work

Global $hListView

_Main()

Func _Main()

    Local $GUI, $hImage
    $GUI = GUICreate("(UDF Created) ListView Create", 400, 300)

    $hListView = _GUICtrlListView_Create($GUI, "", 2, 2, 394, 268)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
    GUISetState()
    
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    ; Load images
    $hImage = _GUIImageList_Create()
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
    _GUICtrlListView_SetImageList($hListView, $hImage, 1)

    ; Add columns
    _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
    _GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
    _GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

    ; Add items
    _GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
    _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
    _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
    _GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
    _GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
    _GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)

    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc   ;==>_Main

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
;~  Local $tBuffer
    $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 $NM_HOVER ; Sent by a list-view control when the mouse hovers over an item
					_DebugPrint("$NM_HOVER" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
						"-->IDFrom:" & @TAB & $iIDFrom & @LF & _
                        "-->Code:" & @TAB & $iCode)
						;Return 0 ; process the hover normally
						Return 1 ; prevent the hover from being processed
                
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _DebugPrint($s_text, $line = @ScriptLineNumber)
    ConsoleWrite( _
            "!===========================================================" & @LF & _
            "+======================================================" & @LF & _
            "-->Line(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
            "+======================================================" & @LF)
EndFunc   ;==>_DebugPrint
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Нужно добавить расширенный стиль $LVS_EX_INFOTIP:
Код:
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_INFOTIP))
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
running-frag [?]
пример взят с манки
Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Модератор.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Добавь расширенный стиль : $LVS_EX_TRACKSELECT
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
running-frag [?]
добавил, но не срабатывает
ToolTip появляется только если пункт виден не полностью.

gregaz [?]
Добавь расширенный стиль : $LVS_EX_TRACKSELECT
Это не совсем то, это выделение пункта при наведении, если я правильно понял, нужен как раз ToolTip.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
running-frag,
Попробуйте так.
Код:
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $hListView, $iItem = -1, $iSubItem = -1, $hHeader

_Main()

Func _Main()

	Local $GUI, $hImage
	$GUI = GUICreate('ListView LVN_HOTTRACK', 400, 300)

	$hListView = _GUICtrlListView_Create($GUI, '', 2, 2, 394, 268)
	_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
	$hHeader = _GUICtrlListView_GetHeader($hListView)

	GUISetState()

	GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

	$hImage = _GUIImageList_Create()
	_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
	_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
	_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
	_GUICtrlListView_SetImageList($hListView, $hImage, 1)

	_GUICtrlListView_InsertColumn($hListView, 0, 'Column 1', 100)
	_GUICtrlListView_InsertColumn($hListView, 1, 'Column 2', 100)
	_GUICtrlListView_InsertColumn($hListView, 2, 'Column 3', 100)

	_GUICtrlListView_AddItem($hListView, 'Row 1: Col 1 ', 0)
	_GUICtrlListView_AddSubItem($hListView, 0, 'Row 1: Col 2', 1)
	_GUICtrlListView_AddSubItem($hListView, 0, 'Row 1: Col 3', 2)
	_GUICtrlListView_AddItem($hListView, 'Row 2: Col 1', 1)
	_GUICtrlListView_AddSubItem($hListView, 1, 'Row 2: Col 2', 1)
	_GUICtrlListView_AddItem($hListView, 'Row 3: Col 1', 2)
	For $i = 0 To 2
		_GUICtrlListView_SetColumnWidth($hListView, $i, $LVSCW_AUTOSIZE)
	Next
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUIDelete()
EndFunc   ;==>_Main

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	#forceref $hWnd, $iMsg, $iwParam
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo, $iHotItem, $iHotSubItem

	$hWndListView = $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
					$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
					$iHotItem = DllStructGetData($tInfo, 'Item')
					$iHotSubItem = DllStructGetData($tInfo, 'SubItem')
					If $iHotItem < 0 Or $iHotSubItem < 0 Then
						$iItem = -1
						$iSubItem = -1
						ToolTip('')
					Else
						If $iItem <> $iHotItem Or $iSubItem <> $iHotSubItem Then
							$iItem = $iHotItem
							$iSubItem = $iHotSubItem
							;ToolTip(_GUICtrlListView_GetItemText($hWndListView, $iItem, $iSubItem))
							ToolTip(_GUICtrlListView_GetItemText($hWndListView, $iItem, $iSubItem), 0, 0, 'LVN_HOTTRACK', 1)
						EndIf
					EndIf
			EndSwitch
		Case $hHeader
			$iItem = -1
			$iSubItem = -1
			ToolTip('')
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

PS
Манку уберите.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
madmasles [?]
Попробуйте так.
ToolTip появляется не над элементом.
Вот так можно сделать:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GUIListView.au3>

Global $iLastItem = -1

$GUI = GUICreate("Listview Set ToolTip Demo")

$hListView = GUICtrlCreateListView("Column 1", 10, 10, 380, 380)

For $i = 1 To 10
	GUICtrlCreateListViewItem("Item text with ToolTip " & $i, $hListView)
Next

GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

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")
	
	If $iLastItem <> -1 Then
		ToolTip("")
		$iLastItem = -1
	EndIf
	
	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)
					Local $iItem = DllStructGetData($tInfo, "Item")
					Local $aItem_Rect = _GUICtrlListView_GetItemRect($hListView, $iItem)
					
					Local $aLV_Pos = WinGetPos($hWndListView)
					
					If $iItem = -1 Then ToolTip("")
					If $iLastItem = $iItem Then Return 0
					
					$iLastItem = $iItem
					
					Local $sToolTipData = _GUICtrlListView_GetItemText($hListView, $iItem)
					ToolTip($sToolTipData, $aLV_Pos[0]+$aItem_Rect[0]+5, $aLV_Pos[1]+$aItem_Rect[1])
			EndSwitch
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
madmasles
Очень близко к истине, сейчас буд разбираться.
CreatoR
ToolTip мерцаент, на долю секунду отображается - прячется - снова появляется. Т.е. прочитать что либо невозможно.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
running-frag [?]
ToolTip мерцаент, на долю секунду отображается - прячется - снова появляется. Т.е. прочитать что либо невозможно.
Нужно чтобы ToolTip появлялся только если текст пункта не полностью виден, или в любом случае?
И у меня кстати нет такого “эффекта”.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
ToolTip нужен только на том тексте который не влез в ширину колонки. Для всех других (в прицепи) не нужен. Сам вывод ToolTip идёт по спец. координатам (допустим слева или справа от окна).
Так же колонка только одна поэтому углублятся дальше первой мне не нужно.


Добавлено:
Сообщение автоматически объединено:

Код:
Func WM_NOTIFY ($hWnd, $iMsg, $wParam, $lParam)
    Local $hData = DllStructCreate ($tagNMHDR, $lParam)
    Local $hInput = HWnd (DllStructGetData ($hData, "hWndFrom"))
	Local $hInputID = DllStructGetData ($hData, "IDFrom")
    Local $hCode = DllStructGetData ($hData, "Code")


	Select
		Case $hWnd = $hGui
			Select
				Case $hInput = $hLog[1]
					Local $hDataList= DllStructCreate ($tagNMLISTVIEW, $lParam)
					Local $iIndex = DllStructGetData ($hDataList, 'Item')
					
					Select
						;Case $hCode = $NM_CLICK 
							;_logToolTip ()	
							
						Case $hCode = $LVN_HOTTRACK	
							If $iIndex < 0 Then
								$stSettings[16] = -1
								ToolTip ("")
							Else
								If Not ($stSettings[16] = $iIndex) Then
									$stSettings[16] = $iIndex
									_logToolTip ($iIndex)
								EndIf
							EndIf
						
						EndSelect
				
				EndSelect

. . . . . .


Код:
Func _logToolTip ($_i)
	Opt ("MouseCoordMode",		1)
	
	Local $_coord = WinGetPos ($hGui)
	Local $_string = _GUICtrlListView_GetItemText ($hLog[1], $_i)	; text
	Local $_regExp = StringRegExpReplace ($_string, '(.{40,}?[ ])(.*?)', '$0'&@CRLF)
	ToolTip ($_regExp, $_coord[0], $_coord[1] +$_coord[3] +10, 'LVN_HOTTRACK', 1)
	
	
	Opt ("MouseCoordMode",		2)	
EndFunc

Func _logToolTipClose ()
	$stSettings[16] = -1
	ToolTip ("")
EndFunc

столкнулся с проблемой как убрать ToolTip, на данный момент оно показывает всё что нужно правильно, НО пропадает ТОЛЬКО если если мы наведём на пустой элемент из ListView списка, т.е. как только мышка уходит куда либо ToolTip остаётся жить а это не правильно

куда вписать _logToolTipClose () чтобы она вызывалась "как только мышка уходит с зоны ListView"
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
running-frag [?]
столкнулся с проблемой
На самом деле у тебя проблема другая.
Либо ты как то неправильно используешь примеры что я тебе давал, либо у тебя что то не то со встроенными UDF.

Всё что тебе нужно это расширенный стиль $LVS_EX_INFOTIP, если не работает, покажи пример где не работает.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
CreatoR [?]
Сменил - всё по прежднему.

Кстати если взять код madmasles то видно о чём я говорю. Наведите на любую ячейку что б появился ToolTip. После сразу мышь влево. И тултип останется висеть хотя мышь уже будет "в другом" приложении, т.е. мышь "уходит" из программы а ToolTip остаётся. А хочется что б ToolTip светился ТОЛЬКО когда мышь над одним из элементов из ListView.


[?]
Либо ты как то неправильно используешь примеры что я тебе давал, либо у тебя что то не то со встроенными UDF.
Я не могу использывать за мастер-образец твой код, у меня он не работает. Опять же мерцание ToolTip. :( Возможно что у меня проблемы с "встроенными UDF".



Добавлено:
Сообщение автоматически объединено:

CreatoR Вот этот код "убрал" мерцание.

Код:
;If $iLastItem <> -1 Then
     ;   ToolTip("")
      ;  $iLastItem = -1
    ;EndIf

Но он судя по всему отвечал за "спрятать ToolTip" поэтому сейчас его покрутим... :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Тяжёлый случай...

running-frag
Можешь запустить в этот код (у тебя же 3.3.6.1?) в таком же виде в каком он есть тут:
Код:
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

$GUI = GUICreate('ListView $LVS_EX_INFOTIP', 400, 300)

$hListView = _GUICtrlListView_Create($GUI, '', 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_INFOTIP))

GUISetState()

_GUICtrlListView_InsertColumn($hListView, 0, 'Column 1', 100)

_GUICtrlListView_AddItem($hListView, 'Row 1: Col 1 ', 0)
_GUICtrlListView_AddItem($hListView, 'Row 2: Col 1', 1)
_GUICtrlListView_AddItem($hListView, 'Row 3: Col 1', 2)


_GUICtrlListView_SetColumnWidth($hListView, 0, 50)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

ToolTip показывает нормально при наведении?
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
CreatoR [?]
ToolTip показывает нормально при наведении?
Да. Показывает при наведении правильно и без ошибок (так же правильно всё прячет), только если по ширине строка не влезла. Если влезла - ToolTip нету.

Да у меня 3.3.6.1
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
running-frag [?]
если взять код madmasles то видно о чём я говорю. Наведите на любую ячейку что б появился ToolTip. После сразу мышь влево. И тултип останется висеть хотя мышь уже будет "в другом" приложении, т.е. мышь "уходит" из программы а ToolTip остаётся.
Это решается примерно так:

Код:
#Include <WinAPI.au3>

...

While 1
....

		Case $GUI_EVENT_MOUSEMOVE
			$aMPos = MouseGetPos()
			$stPoint = DllStructCreate($tagPoint)
			DllStructSetData($stPoint, 'X', $aMPos[0])
			DllStructSetData($stPoint, 'Y', $aMPos[1])
			
			$hWinFromPoint = _WinAPI_WindowFromPoint($stPoint)
			$hParent = _WinAPI_GetParent($hWinFromPoint)
			$sClass = _WinAPI_GetClassName($hWinFromPoint)
			
			If $sClass <> 'tooltips_class32' And $hParent <> $hGUI Then
				ToolTip('')
			EndIf

...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
CreatoR [?]
Значит это и есть решение твоей проблеме.
Нет. Мне нужен TootlTip в месте который я укажу (координаты), а не "по умолчанию поверх наведённого текста". Собсно из за этого и весь сыр-бор.

PS: я уже начинаю сам путаться ибо я мягко говоря уже *устал* ковыряться с несчастным ToolTip который как оказалось проблемой, поэтому готов принять любое подходящее решение


Добавлено:
Сообщение автоматически объединено:

Код:
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $hListView, $iItem = -1, $iSubItem = -1, $hHeader

_Main()

Func _Main()

    Local $GUI, $hImage
    $GUI = GUICreate('ListView LVN_HOTTRACK', 400, 300)

    $hListView = _GUICtrlListView_Create($GUI, '', 2, 2, 394, 268)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
    $hHeader = _GUICtrlListView_GetHeader($hListView)

    GUISetState()

    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

    $hImage = _GUIImageList_Create()
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
    _GUICtrlListView_SetImageList($hListView, $hImage, 1)

    _GUICtrlListView_InsertColumn($hListView, 0, 'Column 1', 100)
    _GUICtrlListView_InsertColumn($hListView, 1, 'Column 2', 100)
    _GUICtrlListView_InsertColumn($hListView, 2, 'Column 3', 100)

    _GUICtrlListView_AddItem($hListView, 'Row 1: Col 1 ', 0)
    _GUICtrlListView_AddSubItem($hListView, 0, 'Row 1: Col 2', 1)
    _GUICtrlListView_AddSubItem($hListView, 0, 'Row 1: Col 3', 2)
    _GUICtrlListView_AddItem($hListView, 'Row 2: Col 1', 1)
    _GUICtrlListView_AddSubItem($hListView, 1, 'Row 2: Col 2', 1)
    _GUICtrlListView_AddItem($hListView, 'Row 3: Col 1', 2)
    For $i = 0 To 2
        _GUICtrlListView_SetColumnWidth($hListView, $i, $LVSCW_AUTOSIZE)
    Next
    Do
		
        If GUIGetMsg () = $GUI_EVENT_MOUSEMOVE Then
            Local $aMPos = MouseGetPos()
            Local $stPoint = DllStructCreate($tagPoint)
            DllStructSetData($stPoint, 'X', $aMPos[0])
            DllStructSetData($stPoint, 'Y', $aMPos[1])
           
            Local $hWinFromPoint = _WinAPI_WindowFromPoint($stPoint)
            Local $hParent = _WinAPI_GetParent($hWinFromPoint)
            Local $sClass = _WinAPI_GetClassName($hWinFromPoint)
           
            If $sClass <> 'tooltips_class32' And $hParent <> $GUI Then
                ToolTip('')
            EndIf
		EndIf
		
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc   ;==>_Main

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo, $iHotItem, $iHotSubItem

    $hWndListView = $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
                    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
                    $iHotItem = DllStructGetData($tInfo, 'Item')
                    $iHotSubItem = DllStructGetData($tInfo, 'SubItem')
                    If $iHotItem < 0 Or $iHotSubItem < 0 Then
                        $iItem = -1
                        $iSubItem = -1
                        ToolTip('')
                    Else
                        If $iItem <> $iHotItem Or $iSubItem <> $iHotSubItem Then
                            $iItem = $iHotItem
                            $iSubItem = $iHotSubItem
                            ;ToolTip(_GUICtrlListView_GetItemText($hWndListView, $iItem, $iSubItem))
                            ToolTip(_GUICtrlListView_GetItemText($hWndListView, $iItem, $iSubItem), 0, 0, 'LVN_HOTTRACK', 1)
                        EndIf
                    EndIf
            EndSwitch
        Case $hHeader
            $iItem = -1
            $iSubItem = -1
            ToolTip('')
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Данный код работает, но опять же есть косяк. Наводим на первый элемент (1:1) уводим мышь (тултип пропадает) и после наводим снова на 1:1 - тултип не появляется, но если на 2:1 появляется. При чём это касается только "правые и левые части". Если это делать с элементами 1:2 и 1:3 и уводить вышь вверх - отображает\прячет правильно.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
running-frag [?]
Мне нужен TootlTip в месте который я укажу (координаты), а не "по умолчанию поверх наведённого текста". Собсно из за этого и весь сыр-бор.
Собственно об этом нужно было упоминать в первом сообщении темы ;).

Вобщем вот кажется то, что тебе нужно:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GUIListView.au3>

Global $iLast_Item = -1
Global $iToolTip_Left = 0 ;-1 - On the item
Global $iToolTip_Top = 0 ;-1 - On the item

$hGUI = GUICreate("Listview Set ToolTip Demo")

$iListView = GUICtrlCreateListView("Column 1", 10, 10, 380, 380)
$hListView = GUICtrlGetHandle($iListView)

For $i = 1 To 10
	GUICtrlCreateListViewItem("Item text with ToolTip " & $i, $iListView)
Next

GUISetState()

GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_MOUSEMOVE
			$aMPos = MouseGetPos()
			$aWPos = WinGetPos($hListView)
			
			If $aMPos[0] < $aWPos[0] Or $aMPos[0] > $aWPos[0] + $aWPos[2] Or $aMPos[1] < $aWPos[1] Or $aMPos[1] > $aWPos[1] + $aWPos[3] Then
				$iLast_Item = -1
				ToolTip('')
			EndIf
	EndSwitch
WEnd

Func WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)
	Local $iActive = BitAND($wParam, 0xFFFF)
	
	If Not $iActive Then
		$iLast_Item = -1
		ToolTip("")
	EndIf
EndFunc

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, $iItem, $aItem_Rect, $aLV_Pos, $sToolTipData, $iX, $iY
					
					$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
					$iItem = DllStructGetData($tInfo, "Item")
					$aLV_Pos = WinGetPos($hWndListView)
					$aItem_Rect = _GUICtrlListView_GetItemRect($hListView, $iItem)
					
					If $iItem = -1 Then ToolTip("")
					If $iLast_Item = $iItem Then Return 0
					
					$iLast_Item = $iItem
					$sToolTipData = _GUICtrlListView_GetItemText($hListView, $iItem)
					
					$iX = $iToolTip_Left
					$iY = $iToolTip_Top
					
					If $iToolTip_Left = -1 Then $iX = $aLV_Pos[0]+$aItem_Rect[0]+5
					If $iToolTip_Top = -1 Then $iY = $aLV_Pos[1]+$aItem_Rect[1]
					
					If WinActive($hGUI) Then
						ToolTip($sToolTipData, $iX, $iY)
					EndIf
			EndSwitch
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc
 
Верх