Что нового

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

Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Ааааабалдеть, большое спасибо за помощь. Оно самое.


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

Ещё нашёл неточность, но можно ли её избежать даже не знаю.
Если мы наводим - получаем ToolTip и после через ALT+TAB переводим фокус на другое окно ToolTip не исчезает. :smile:
Я пытался добавить в условие, но видимо снова что то не так делаю...

Код:
If $aMPos[0] < $aWPos[0] Or $aMPos[0] > $aWPos[0] + $aWPos[2] Or $aMPos[1] < $aWPos[1] Or $aMPos[1] > $aWPos[1] + $aWPos[3] Or Not (WinGetHandle ("[ACTIVE]") = $hGUI) Then
                $iLast_Item = -1
                ToolTip('')
            EndIf
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
running-frag [?]
Если мы наводим - получаем ToolTip и после через ALT+TAB переводим фокус на другое окно ToolTip не исчезает.
Нужно тогда отлавливать WM_ACTIVATE:

Код:
...

GUIRegisterMsg($WM_ACTIVATE, 'WM_ACTIVATE')

...

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


Поправил соответственно свой последний пример.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
А что если так ? :
(Уж больно просто)
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GUIListView.au3>

$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()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_MOUSEMOVE
           $aCur_Info = GUIGetCursorInfo($hGUI)
           If $aCur_Info[4]=$iListView Then
              $aHit=_GUICtrlListView_HitTest($hListView)
              $sText=_GUICtrlListView_GetItemText($hListView, $aHit[0])
              ToolTip($sText,0,0) 
           EndIf
    EndSwitch
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
gregaz [?]
А что если так ? :
Да, так проще, но проверку на активность окна всё равно нужно добавлять.

Вот так можно сделать:
Код:
#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(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_MOUSEMOVE
			$aCur_Info = GUIGetCursorInfo($hGUI)
			
			If $aCur_Info[4] = $iListView Then
				$aHit = _GUICtrlListView_HitTest($hListView)
				$iItem = $aHit[0]
				
				$aLV_Pos = WinGetPos($hListView)
				$aItem_Rect = _GUICtrlListView_GetItemRect($hListView, $iItem)
				
				$sText = _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($sText, $iX, $iY)
				EndIf
			Else
				ToolTip("")
			EndIf
	EndSwitch
WEnd

Func WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)
	If Not BitAND($wParam, 0xFFFF) Then
		ToolTip("")
	EndIf
EndFunc
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
gregaz
Вау...
CreatoR
Последний код - желаемое решение с мелочами. Ещё раз спс.

Спасибо всем кто помогал. :smile: Тема разжёвана до мелочей. Хоть UDF пиши... :D
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Интересный момент. Если использывать
Код:
_GUICtrlListView_Create ()

вместо
Код:
GUICtrlCreateListView ()

код неработает. К сожалению самому разобраться не получилось. Может кто помочь?

PS: Думается что неточность в отлове события. :(



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

Плюс есть (несмертельная) неточность, при наведении на середину (по высоте) колонки появляется ToolTip.

PS: Наведите на середину слова (в колонке) "Column 1" поймёте очень идёт речь. Последний код от CreatoR.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
running-frag [?]
Нужно так:
Код:
$hListView = _GUICtrlListView_Create(...)

и при этом не проверять CursorInfo, т.к он работает только со встроенными элементами.

при наведении на середину (по высоте) колонки появляется ToolTip
Код:
#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(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_MOUSEMOVE
            $tPoint = _WinAPI_GetMousePos()
			
			If _WinAPI_WindowFromPoint($tPoint) = $hListView Then
                $aHit = _GUICtrlListView_HitTest($hListView)
                $iItem = $aHit[0]
                
                $aLV_Pos = WinGetPos($hListView)
                $aItem_Rect = _GUICtrlListView_GetItemRect($hListView, $iItem)
                
                $sText = _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($sText, $iX, $iY)
                EndIf
            ElseIf _WinAPI_GetClassName(_WinAPI_WindowFromPoint($tPoint)) <> 'tooltips_class32' Then
                ToolTip("")
            EndIf
    EndSwitch
WEnd

Func WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)
    If Not BitAND($wParam, 0xFFFF) Then
        ToolTip("")
    EndIf
EndFunc
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Код:
#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 = _GUICtrlListView_Create ($hGUI, "Column 1", 10, 10, 380, 380)
$hListView = _GUICtrlListView_Create ($hGUI, "Column 1", 10, 10, 380, 380);GUICtrlGetHandle($iListView)

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

GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_MOUSEMOVE
            $tPoint = _WinAPI_GetMousePos()
           
            If _WinAPI_WindowFromPoint($tPoint) = $hListView Then
                $aHit = _GUICtrlListView_HitTest($hListView)
                $iItem = $aHit[0]
               
                $aLV_Pos = WinGetPos($hListView)
                $aItem_Rect = _GUICtrlListView_GetItemRect($hListView, $iItem)
               
                $sText = _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($sText, $iX, $iY)
                EndIf
            ElseIf _WinAPI_GetClassName(_WinAPI_WindowFromPoint($tPoint)) <> 'tooltips_class32' Then
                ToolTip("")
            EndIf
    EndSwitch
WEnd

Func WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)
    If Not BitAND($wParam, 0xFFFF) Then
        ToolTip("")
    EndIf
EndFunc

Если правильно всё понял вот так получается. Всё работает. Спасибо очередной раз.
 
Верх