Jump to content

Show ToolTip when hovering over listview group


Recommended Posts

Hi,

i want to display a tooltip when i hover over the listview group. It sounds not difficult but i couldn't find a solution and i searched for autoit as well as for c# :/

So i came up with a not so pretty solution:

#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>
#include <GuiToolTip.au3>
#include <WinAPI.au3>

Global $idListview, $hWndListView
Global $hToolTip = _GUIToolTip_Create(0, BitOR($_TT_ghTTDefaultStyle, $TTS_BALLOON)); balloon style tooltip
Global Const $LVN_GROUPINFO = ($LVN_FIRST - 88)
Global Const $tagNMLVGROUP = $tagNMHDR & ";int iGroupId;uint iNewState;uint iOldState"
;                                                            $LVGS_flags    $LVGS_flags

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
  #forceref $hWnd, $iMsg, $wParam
  Local $tInfo, $tNMHDR = DllStructCreate($tagNMHDR, $lParam), $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  Local $iIDFrom = DllStructGetData($tNMHDR, "IDFrom"), $iCode = DllStructGetData($tNMHDR, "Code")
  Switch $hWndFrom
    Case $hWndListView
      Switch $iCode

        ; Case $of?????? ; A Group was clicked       <---- I need help with this
          Case $LVN_GROUPINFO
              ConsoleWrite("hier" & @CRLF)
          $tInfo = DllStructCreate($tagNMLVGROUP, $lParam)
          _DebugPrint("$LVN_GROUPINFO" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
            "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _
            "-->Code:" & @TAB & $iCode & @CRLF & _
            "-->GroupId:" & @TAB & DllStructGetData($tInfo, "iGroupId") & @CRLF & _
            "-->NewState:" & @TAB & DllStructGetData($tInfo, "iNewState") & @CRLF & _
            "-->OldState:" & @TAB & DllStructGetData($tInfo, "iOldState"))

        Case $LVN_COLUMNCLICK ; A column was clicked
          $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
          _DebugPrint("$LVN_COLUMNCLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
            "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _
            "-->Code:" & @TAB & $iCode & @CRLF & _
            "-->Item:" & @TAB & DllStructGetData($tInfo, "Item") & @CRLF & _
            "-->SubItem:" & @TAB & DllStructGetData($tInfo, "SubItem") & @CRLF & _
            "-->NewState:" & @TAB & DllStructGetData($tInfo, "NewState") & @CRLF & _
            "-->OldState:" & @TAB & DllStructGetData($tInfo, "OldState") & @CRLF & _
            "-->Changed:" & @TAB & DllStructGetData($tInfo, "Changed") & @CRLF & _
            "-->ActionX:" & @TAB & DllStructGetData($tInfo, "ActionX") & @CRLF & _
            "-->ActionY:" & @TAB & DllStructGetData($tInfo, "ActionY") & @CRLF & _
            "-->Param:" & @TAB & DllStructGetData($tInfo, "Param"))
          ; No return value

        Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
          $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
          _DebugPrint("$NM_CLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
            "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _
            "-->Code:" & @TAB & $iCode & @CRLF & _
            "-->Index:" & @TAB & DllStructGetData($tInfo, "Index") & @CRLF & _
            "-->SubItem:" & @TAB & DllStructGetData($tInfo, "SubItem") & @CRLF & _
            "-->NewState:" & @TAB & DllStructGetData($tInfo, "NewState") & @CRLF & _
            "-->OldState:" & @TAB & DllStructGetData($tInfo, "OldState") & @CRLF & _
            "-->Changed:" & @TAB & DllStructGetData($tInfo, "Changed") & @CRLF & _
            "-->ActionX:" & @TAB & DllStructGetData($tInfo, "ActionX") & @CRLF & _
            "-->ActionY:" & @TAB & DllStructGetData($tInfo, "ActionY") & @CRLF & _
            "-->lParam:" & @TAB & DllStructGetData($tInfo, "lParam") & @CRLF & _
            "-->KeyFlags:" & @TAB & DllStructGetData($tInfo, "KeyFlags"))
          ; No return value

      EndSwitch
  EndSwitch
  Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

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

If Not StringInStr($CmdLineRaw, "/ErrorStdOut") Then Exit MsgBox($MB_TOPMOST, @ScriptName, 'please run from the editor, thanks', 10)

Example()

Func Example()
    Local $aInfo, $hImage, $idListview

    $ghui = GUICreate("ListView Group COLLAPSIBLE", 400, 300)

    $idListview = GUICtrlCreateListView("", 30, 20, 354, 218);, BitOR($LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $LVS_REPORT, $WS_CLIPSIBLINGS))
    $hWndListView = GUICtrlGetHandle($idListview)

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

    ; Add columns
    _GUICtrlListView_AddColumn($idListview, "Column 1", 100)
    _GUICtrlListView_AddColumn($idListview, "Column 2", 100)
    _GUICtrlListView_AddColumn($idListview, "Column 3", 100)

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

    ; Build groups
    _GUICtrlListView_EnableGroupView($idListview)
    _GUICtrlListView_InsertGroup($idListview, -1, 1, "Group 1", 1)
;~     _GUICtrlListView_SetGroupInfo($idListview, 1, "Group 1", 0, $LVGS_COLLAPSIBLE + $LVGS_COLLAPSED) ; <---
    _GUICtrlListView_InsertGroup($idListview, -1, 2, "Group 2")
;~     _GUICtrlListView_SetGroupInfo($idListview, 2, "Group 2", 0, $LVGS_COLLAPSIBLE + $LVGS_COLLAPSED) ; <---
    _GUICtrlListView_SetItemGroupID($idListview, 0, 1)
    _GUICtrlListView_SetItemGroupID($idListview, 1, 2)
    _GUICtrlListView_SetItemGroupID($idListview, 2, 2)

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    Local $apos = _GUICtrlListView_GetGroupRect($idListview, 2, $LVGGR_LABEL)


    Local $test = GUICtrlCreateLabel("a", 2, 2, 10, 17)
    Local $val = _WinAPI_GetWindowLong(GUICtrlGetHandle($test), $GWL_STYLE)
    Local $valex = _WinAPI_GetWindowLong(GUICtrlGetHandle($test), $GWL_EXSTYLE)
    Local $aha = _WinAPI_CreateWindowEx($valex+$WS_EX_LAYERED, "static", "blabla", $val, $apos[0], $apos[1], 50, 20, $hWndListView)
    
    _GUIToolTip_AddTool($hToolTip, $hWndListView, "This is a ToolTip3", $aha)
    

    GUISetState(@SW_SHOW)

    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    GUIDelete()
EndFunc   ;==>Example

Short description: I only created a label with CreateWindowEx which i can append to the listview control and layered it with the $WS_EX_Layered flag so it looks like it's transparent. Then i only added a tooltip tool to that created label.

Hover over the Group 2 text and the Tooltip will be displayed. My question is: does someone know another perhaps much prettier solution?

Thanks in advance

Edited by Trolleule
Link to comment
Share on other sites

Like this? (I think I found it sometime ago in a forum post..... but forget where I found it once.....so I'm not the genius that help me out some time ago)

I added this stuff to your sample, without removing any call from your so a diff will show you the added code lines)

Take a look at :

in WM_NOTIFY: Case $LVN_HOTTRACK

And follow the trace to ListView_HOTTRACK and _ToolTipMouseExit

#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>
#include <GuiToolTip.au3>
#include <WinAPI.au3>

Global $idListview, $hWndListView
Global $hToolTip = _GUIToolTip_Create(0, BitOR($_TT_ghTTDefaultStyle, $TTS_BALLOON)); balloon style tooltip
Global Const $LVN_GROUPINFO = ($LVN_FIRST - 88)
Global Const $tagNMLVGROUP = $tagNMHDR & ";int iGroupId;uint iNewState;uint iOldState"
;                                                            $LVGS_flags    $LVGS_flags

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
  #forceref $hWnd, $iMsg, $wParam
  Local $tInfo, $tNMHDR = DllStructCreate($tagNMHDR, $lParam), $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  Local $iIDFrom = DllStructGetData($tNMHDR, "IDFrom"), $iCode = DllStructGetData($tNMHDR, "Code")
  Switch $hWndFrom
    Case $hWndListView
      Switch $iCode

        ; Case $of?????? ; A Group was clicked       <---- I need help with this
          Case $LVN_GROUPINFO
              ConsoleWrite("hier" & @CRLF)
          $tInfo = DllStructCreate($tagNMLVGROUP, $lParam)
          _DebugPrint("$LVN_GROUPINFO" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
            "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _
            "-->Code:" & @TAB & $iCode & @CRLF & _
            "-->GroupId:" & @TAB & DllStructGetData($tInfo, "iGroupId") & @CRLF & _
            "-->NewState:" & @TAB & DllStructGetData($tInfo, "iNewState") & @CRLF & _
            "-->OldState:" & @TAB & DllStructGetData($tInfo, "iOldState"))

        Case $LVN_COLUMNCLICK ; A column was clicked
          $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
          _DebugPrint("$LVN_COLUMNCLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
            "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _
            "-->Code:" & @TAB & $iCode & @CRLF & _
            "-->Item:" & @TAB & DllStructGetData($tInfo, "Item") & @CRLF & _
            "-->SubItem:" & @TAB & DllStructGetData($tInfo, "SubItem") & @CRLF & _
            "-->NewState:" & @TAB & DllStructGetData($tInfo, "NewState") & @CRLF & _
            "-->OldState:" & @TAB & DllStructGetData($tInfo, "OldState") & @CRLF & _
            "-->Changed:" & @TAB & DllStructGetData($tInfo, "Changed") & @CRLF & _
            "-->ActionX:" & @TAB & DllStructGetData($tInfo, "ActionX") & @CRLF & _
            "-->ActionY:" & @TAB & DllStructGetData($tInfo, "ActionY") & @CRLF & _
            "-->Param:" & @TAB & DllStructGetData($tInfo, "Param"))
          ; No return value

        Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
          $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
          _DebugPrint("$NM_CLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
            "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _
            "-->Code:" & @TAB & $iCode & @CRLF & _
            "-->Index:" & @TAB & DllStructGetData($tInfo, "Index") & @CRLF & _
            "-->SubItem:" & @TAB & DllStructGetData($tInfo, "SubItem") & @CRLF & _
            "-->NewState:" & @TAB & DllStructGetData($tInfo, "NewState") & @CRLF & _
            "-->OldState:" & @TAB & DllStructGetData($tInfo, "OldState") & @CRLF & _
            "-->Changed:" & @TAB & DllStructGetData($tInfo, "Changed") & @CRLF & _
            "-->ActionX:" & @TAB & DllStructGetData($tInfo, "ActionX") & @CRLF & _
            "-->ActionY:" & @TAB & DllStructGetData($tInfo, "ActionY") & @CRLF & _
            "-->lParam:" & @TAB & DllStructGetData($tInfo, "lParam") & @CRLF & _
            "-->KeyFlags:" & @TAB & DllStructGetData($tInfo, "KeyFlags"))
          ; No return value
          Case $LVN_HOTTRACK ; Sent by a list-view control when the user moves the mouse over an item
                    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
                    ListView_HOTTRACK(DllStructGetData($tInfo, "SubItem"))
      EndSwitch
  EndSwitch
  Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Func ListView_HOTTRACK($iSubItem)
    Local $HotItem = _GUICtrlListView_GetHotItem($hWndListView)
    If $HotItem <> -1 Then _ToolTipMouseExit("Mouse over item: " & $HotItem & " SubItem: " & $iSubItem & @CRLF & _
                                'Content: ' & _GUICtrlListView_GetItemText($hWndListView, $HotItem, $iSubItem), 1500)
EndFunc   ;==>ListView_HOTTRACK

Func _ToolTipMouseExit($TEXT, $TIME=-1, $x=-1, $y=-1, $TITLE='', $ICON=0, $OPT='')
    If $TIME = -1 Then $TIME = 3000
    Local $start = TimerInit(), $pos0 = MouseGetPos()
    If ($x = -1) Or ($y = -1) Then
        ToolTip($TEXT, $pos0[0], $pos0[1], $TITLE, $ICON, $OPT)
    Else
        ToolTip($TEXT, $x, $y, $TITLE, $ICON, $OPT)
    EndIf
    Do
        Sleep(50)
        $pos = MouseGetPos()
    Until (TimerDiff($start) > $TIME) Or _
        (Abs($pos[0] - $pos0[0]) > 10 Or _
         Abs($pos[1] - $pos0[1]) > 10)
    ToolTip('')
EndFunc ;_ToolTipMouseExit


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

If Not StringInStr($CmdLineRaw, "/ErrorStdOut") Then Exit MsgBox($MB_TOPMOST, @ScriptName, 'please run from the editor, thanks', 10)

Example()

Func Example()
    Local $aInfo, $hImage, $idListview

    $ghui = GUICreate("ListView Group COLLAPSIBLE", 400, 300)

    $idListview = GUICtrlCreateListView("", 30, 20, 354, 218);, BitOR($LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $LVS_REPORT, $WS_CLIPSIBLINGS))
    $hWndListView = GUICtrlGetHandle($idListview)

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

    ; Add columns
    _GUICtrlListView_AddColumn($idListview, "Column 1", 100)
    _GUICtrlListView_AddColumn($idListview, "Column 2", 100)
    _GUICtrlListView_AddColumn($idListview, "Column 3", 100)

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

    ; Build groups
    _GUICtrlListView_EnableGroupView($idListview)
    _GUICtrlListView_InsertGroup($idListview, -1, 1, "Group 1", 1)
;~     _GUICtrlListView_SetGroupInfo($idListview, 1, "Group 1", 0, $LVGS_COLLAPSIBLE + $LVGS_COLLAPSED) ; <---
    _GUICtrlListView_InsertGroup($idListview, -1, 2, "Group 2")
;~     _GUICtrlListView_SetGroupInfo($idListview, 2, "Group 2", 0, $LVGS_COLLAPSIBLE + $LVGS_COLLAPSED) ; <---
    _GUICtrlListView_SetItemGroupID($idListview, 0, 1)
    _GUICtrlListView_SetItemGroupID($idListview, 1, 2)
    _GUICtrlListView_SetItemGroupID($idListview, 2, 2)

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    Local $apos = _GUICtrlListView_GetGroupRect($idListview, 2, $LVGGR_LABEL)


    Local $test = GUICtrlCreateLabel("a", 2, 2, 10, 17)
    Local $val = _WinAPI_GetWindowLong(GUICtrlGetHandle($test), $GWL_STYLE)
    Local $valex = _WinAPI_GetWindowLong(GUICtrlGetHandle($test), $GWL_EXSTYLE)
    Local $aha = _WinAPI_CreateWindowEx($valex+$WS_EX_LAYERED, "static", "blabla", $val, $apos[0], $apos[1], 50, 20, $hWndListView)

    _GUIToolTip_AddTool($hToolTip, $hWndListView, "This is a ToolTip3", $aha)


    GUISetState(@SW_SHOW)

    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    GUIDelete()
EndFunc   ;==>Example

 

Link to comment
Share on other sites

  • 2 weeks later...

Hello. You can do something like this.

 

#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <WinAPI.au3>
#include <GuiToolTip.au3>
#include <WindowsConstants.au3>


Global $idListview = 0
Global $hListView = 0
Global $hGUI = 0
Global $hToolTip = 0

Example()


Func Example()
    Local $hImage

    $hGUI = GUICreate("ListView Enable Group View", 400, 300)
    $idListview = GUICtrlCreateListView("", 2, 2, 394, 268)
    $hListView = GUICtrlGetHandle($idListview)
    $hToolTip = _GUIToolTip_Create(0, BitOR($_TT_ghTTDefaultStyle, $TTS_BALLOON)); balloon style tooltip
    _GUIToolTip_AddTool($hToolTip, 0, "Tooltip for the GUI", $hListView)
    _GUIToolTip_Deactivate($hToolTip)


    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    GUISetState(@SW_SHOW)


    ; 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($idListview, $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)
    _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)

    ; Build groups
    _GUICtrlListView_EnableGroupView($hListView)
    _GUICtrlListView_InsertGroup($hListView, -1, 1, "AutoIt Rocks", 1)
    _GUICtrlListView_InsertGroup($hListView, -1, 2, "Danyfirex Rocks")
    _GUICtrlListView_InsertGroup($hListView, -1, 3, "Trolleule Rocks", 2)
    _GUICtrlListView_SetItemGroupID($hListView, 0, 1)
    _GUICtrlListView_SetItemGroupID($hListView, 1, 2)
    _GUICtrlListView_SetItemGroupID($hListView, 2, 2)
    _GUICtrlListView_SetItemGroupID($hListView, 3, 3)
    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc   ;==>Example



Func _ShowToolTip()

    Local $aHit = _GUICtrlListView_HitTestEx($hListView)

    If IsArray($aHit) Then
        If $aHit[0] And $aHit[10] Then
            $iGroupID = $aHit[0]
            Local $iX = 0
            Local $iY = 0
            $aPos = ControlGetPos($hGUI, "", $hListView)
            Local $tPoint = DllStructCreate("int X;int Y")
            DllStructSetData($tPoint, "X", $aPos[0])
            DllStructSetData($tPoint, "Y", $aPos[1])
            _WinAPI_ClientToScreen($hGUI, $tPoint)
            $iX = $tPoint.X
            $iY = $tPoint.Y
            Local $aGroupInfo = _GUICtrlListView_GetGroupInfo($hListView, $iGroupID)
            Local $sGroupText = $aGroupInfo[0]
            Local $iGroupAlign = $aGroupInfo[1]
            Local $aGroupHeaderRec = _GUICtrlListView_GetGroupRect($hListView, $iGroupID, $LVGGR_GROUP)
            Local $aGroupLabelRec = _GUICtrlListView_GetGroupRect($hListView, $iGroupID, $LVGGR_LABEL)


            ;0 - Left 1 - Center 2 - Right
            Switch $iGroupAlign
                Case 0
                    $iX += $aGroupHeaderRec[0] + $aGroupLabelRec[2] + 8
                    $iY += $aGroupHeaderRec[1] + 5
                Case 1
                    $iX += ($aGroupHeaderRec[2] / 2) + ($aGroupLabelRec[2] / 2)
                    $iY += $aGroupHeaderRec[1] + 5
                Case 2
                    $iX += ($aGroupHeaderRec[2]) - 8
                    $iY += $aGroupHeaderRec[1] + 5

            EndSwitch


            Local $Xul = $iX - $aGroupLabelRec[2]
            Local $Xur = $iX
            Local $Xdl = $iX - $aGroupLabelRec[2]
            Local $Yul = $iY
            Local $Ydr = $iY + ($aGroupLabelRec[3] - $aGroupLabelRec[1])



            Local $aPos = MouseGetPos()
            Local $iXm = $aPos[0]
            Local $iYm = $aPos[1]

            If ($iXm > $Xul And $iXm < $Xur And $iYm > $Yul And $iYm < $Ydr) Then
                _GUIToolTip_UpdateTipText($hToolTip, 0, $hListView, $sGroupText)
                _GUIToolTip_Activate($hToolTip)
                _GUIToolTip_PopUp($hToolTip)
            EndIf

        Else
            _GUIToolTip_Pop($hToolTip)
            _GUIToolTip_Deactivate($hToolTip)
        EndIf
    EndIf

EndFunc   ;==>_ShowToolTip

Func WM_NOTIFY($hWnd, $IMsg, $iwParam, $ilParam)
    #forceref $hWnd, $IMsg, $iwParam
    Local $hwndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hwndFrom = HWnd(DllStructGetData($tNMHDR, "hwndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "idFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hwndFrom
        Case $hListView
            Switch $iCode
                Case $LVN_HOTTRACK
                    _ShowToolTip()
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY




;Simple Modification of _GUICtrlListView_HitTest to handle listivew Groups
;~     [0] - 0-based index of the item at the specified position, or GroupID
;~     [1] - If True, position is in control's client window but not on an item
;~     [2] - If True, position is over item icon
;~     [3] - If True, position is over item text
;~     [4] - If True, position is over item state image
;~     [5] - If True, position is somewhere on the item
;~     [6] - If True, position is above the control's client area
;~     [7] - If True, position is below the control's client area
;~     [8] - If True, position is to the left of the client area
;~     [9] - If True, position is to the right of the client area
;~     [10]- If True, position is over the group header

Func _GUICtrlListView_HitTestEx($hWnd, $iX = -1, $iY = -1)
    Local $aTest[11]

    Local $iMode = Opt("MouseCoordMode", 1)
    Local $aPos = MouseGetPos()
    Opt("MouseCoordMode", $iMode)
    Local $tPoint = DllStructCreate($tagPOINT)
    DllStructSetData($tPoint, "X", $aPos[0])
    DllStructSetData($tPoint, "Y", $aPos[1])
    Local $aResult = DllCall("user32.dll", "bool", "ScreenToClient", "hwnd", $hWnd, "struct*", $tPoint)
    If @error Then Return SetError(@error, @extended, 0)
    If $aResult[0] = 0 Then Return 0

    If $iX = -1 Then $iX = DllStructGetData($tPoint, "X")
    If $iY = -1 Then $iY = DllStructGetData($tPoint, "Y")

    Local $tTest = DllStructCreate($tagLVHITTESTINFO)
    DllStructSetData($tTest, "X", $iX)
    DllStructSetData($tTest, "Y", $iY)
    If IsHWnd($hWnd) Then
        If _WinAPI_InProcess($hWnd, $__g_hLVLastWnd) Then
            $aTest[0] = _SendMessage($hWnd, $LVM_HITTEST, -1, $tTest, 0, "wparam", "struct*")
        Else
            Local $iTest = DllStructGetSize($tTest)
            Local $tMemMap
            Local $pMemory = _MemInit($hWnd, $iTest, $tMemMap)
            _MemWrite($tMemMap, $tTest, $pMemory, $iTest)
            $aTest[0] = _SendMessage($hWnd, $LVM_HITTEST, 0, $pMemory, 0, "wparam", "ptr")
            _MemRead($tMemMap, $pMemory, $tTest, $iTest)
            _MemFree($tMemMap)
        EndIf
    Else
        $aTest[0] = GUICtrlSendMsg($hWnd, $LVM_HITTEST, 0, DllStructGetPtr($tTest))
    EndIf
    Local $iFlags = DllStructGetData($tTest, "Flags")
    $aTest[1] = BitAND($iFlags, $LVHT_NOWHERE) <> 0
    $aTest[2] = BitAND($iFlags, $LVHT_ONITEMICON) <> 0
    $aTest[3] = BitAND($iFlags, $LVHT_ONITEMLABEL) <> 0
    $aTest[4] = BitAND($iFlags, $LVHT_ONITEMSTATEICON) <> 0
    $aTest[5] = BitAND($iFlags, $LVHT_ONITEM) <> 0
    $aTest[6] = BitAND($iFlags, $LVHT_ABOVE) <> 0
    $aTest[7] = BitAND($iFlags, $LVHT_BELOW) <> 0
    $aTest[8] = BitAND($iFlags, $LVHT_TOLEFT) <> 0
    $aTest[9] = BitAND($iFlags, $LVHT_TORIGHT) <> 0
    $aTest[10] = BitAND($iFlags, $LVHT_EX_GROUP_HEADER) <> 0
    Return $aTest
EndFunc   ;==>_GUICtrlListView_HitTestEx

 

Saludos

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...