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 post
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 post
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 post
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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By endtro
      I have a weird problem with a ToolTip function.
      It seems that I can't reliably remove a tooltip from the screen if I originally created it by setting a tooltip text via variable, not a straight up string.
       
      Here's a simple script that I used for testing:
       
      After I remade the script into this, it started working just fine (stopped working after I fixed the array comparison):
       
      Basic idea of the script:
      You press F1 and a tooltip with some useful info shows up by the mouse cursor. It follows the cursor around until you press F1 again, then it copies the info to the clipboard and hides the tooltip.
       
      It almost seems like if I created a tooltip using a variable to set the text, then ToolTip("") most of the times just repeats the previous use of ToolTip function. If you try to add Sleep(1000) before ToolTip("") in the first draft of the script, you'll see what i mean (if it works the same for everyone, that is).
       
      Is this a bug or am I doing something wrong?
    • By UEZ
      This project has been discontinued!
       
      Here a small tool I wrote to update my Sysinternal tools collection without the need to download always the whole package or visiting the site to check for updates. I know that there are several tools available (also some tools written in AutoIt) but here another one for the collection. It was good exercise for me to code it.
       
       
        
       
       
      Some files from the live web site cannot be downloaded although they are visible!
       
      Here the download link of the source code only: AutoIt Sysinternal Tools Synchronizer v0.99.6 build 2020-09-23 beta.7z  (1557 downloads previously)
      -=> Requires AutoIt version 3.3.13.20 or higher / tested on Win8.1 real machine and some VMs: Win7 / Vista / Win10
       
      Compiled exe only: @MediaFire
       
      Just select the Sysinternal Tools folder or create one and press the synchronize button to download the selected items. Click on AutoIt label (near to left upper corner) to open menu.
       
      Special thanks to LarsJ, Melba23 and mesale0077 for their help. 
       
      I've still some ideas to implement which are more gimmick related, so it is not finished yet...
      If you want to add your language please check out #Region Language. Thanks. 
       
      Please report any bug or if you have any suggestions.
       
      The language of the tool tip from each of the executable in the left list view were automatically created using Google translator and weren't checked for correctness.
       
      Br,
      UEZ
    • By Cengokill
      Hi everyone,
      I have created a ListView that is in a tab, and I want to display an image in that tab, with the ListView on top.
      However, the image still appears on top of my ListView.
      If I remove the tabs everything works. 
      I looked at the autoit documentation and the <GuiListView.au3> documentation , I can't figure out how to display a background image, and put on top a ListView, inside a tab. 😥
      Here is the code:
      Opt("GUIOnEventMode", 1) $Form1 = GUICreate($Titre, 700, 627, $Form1Width, $Form1Height); main window $tabulation = GUICtrlCreateTab(148,0,700,580); creating tabs $tab1=GUICtrlCreateTabItem("Tab 1"); first tab GUICtrlSetState(-1, $GUI_SHOW); this tab is selected by default $Pic1 = GUICtrlCreatePic("image.jpg", 0, 30, 700, 627) GUICtrlSetState(-1, $GUI_DISABLE). $idListview = GUICtrlCreateListView("list 1|list 2|list 3", 200, 50, 390, 200) GUISetState(@SW_SHOW) While 1     Sleep(100) WEnd Thank you in advance.

    • By DrJohn
      Hello all.  It's me again.
      I've got a ListView with an associated ImageList to display icons.  What I seem to be hung up on is how to keep the ImageList updated to match the ListView as the latter changes.  I thought it was the case that the indices of the items in the ListView and those in the ImageList just needed to match.  So, for example, if I:
      Delete an item from the ListView [_GUICtrlListView_DeleteItem()], and also delete the image at the matching index in the ImageList [_GUIImageList_Remove()]. Then add a new item to the end of the ListView [_GUICtrlListView_AddItem()], and correspondingly add an image at the end of the ImageList [_GUIImageList_AddIcon()] Shouldn't everything stay in sync?
      Here's the code I thought would work:
      #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <FontConstants.au3> #include <WindowsConstants.au3> #include <GuiImageList.au3> Test() func Test() $gui = GUICreate("Test", 400, 300) ; Create ListView $lv = _GUICtrlListView_Create($gui, "", 10, 10, 380, 240, $LVS_DEFAULT) _GUICtrlListView_AddColumn($lv, "Col1", 50) _GUICtrlListView_AddColumn($lv, "Col2", 50) for $i = 0 to 2 $s = StringFormat("%d,1", $i+1) _GUICtrlListView_AddItem($lv, $s, $i) $s = StringFormat("%d,2", $i+1) _GUICtrlListView_AddSubItem($lv, $i, $s, 1) next ; Add ImageList $img_list = _GUIImageList_Create(16, 16, 5, 3) for $i = 0 to 2 $ico = StringFormat("%d.ico", $i+1) _GUIImageList_AddIcon($img_list, $ico) next _GUICtrlListView_SetImageList($lv, $img_list, 1) ; $btn = GUICtrlCreateButton("Test", 10, 260, 60, 30) GUISetState(@SW_SHOW) HotKeySet("^q", Quit) ; Loop until the user exits. while True switch GUIGetMsg() case $GUI_EVENT_CLOSE Exit case $btn ; Remove 2nd list item and image _GUICtrlListView_DeleteItem($lv, 1) _GUIImageList_Remove($img_list, 1) ; Add new item to end of ListView $idx = _GUICtrlListView_AddItem($lv, "foo") _GUICtrlListView_AddSubItem($lv, $idx, "bar", 1) ; Add new image to end of ImageList _GUIImageList_AddIcon($img_list, "5.ico") endswitch wend GUIDelete() endfunc func Quit() Exit endfunc What seems to happen is that when the new item is added to the ListView, its icon is 1.ico (the first item in the ImageList), rather than 5.ico (the newly added item that should be at the end of the ImageList).
      Or do I need to re-create the whole ImageList any time the ListView changes?
      A zip file is attached that contains the script and also the .ico files, for easier testing.
      Thanks!
      /John
      test.zip
    • By Dan_555
      Hi.
      I'm using the FreeCommander XE file manager here, and i'v written a script, which will create an empty, new file, after choosing an extension out from the Listbox.
       
      The listview code  is not mine, iv found the scripts somewhere on this forum. I have no credits in it, because it was intended to be only for my personal use.
      But now, i have a lot of free time, so i remembered that i haven't posted anything on this forum, yet, so here is my first script:
      It should be compiled with the Autoit v3.3.14.3 .
      The compiled exe needs a folder passed as a parameter, so that it know where to create the new file.
      A Listbox is opened, with a selection of available extensions.
      After selecting and doubleclicking (or using the ok button), the script creates a filename (if specified in the config file) with increased numbers (up to 9999).
      If the filename exist, the counter is checking the next number, until the maximum is reached.
      This script uses an ini file for configuration, called "NewFile.ini" which should be in the same folder, as the compiled exe.
      NewFile.au3
      #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiListView.au3> #include <String.au3> #include <WinAPIFiles.au3> #include <Array.au3> #include <EditConstants.au3> #include <GuiEdit.au3> #include <ScrollBarsConstants.au3> Global $test[0][2], $hFile, $cmd = "", $cmdtmp, $tmptxt, $tmpinidir, $filesetting, $MouseX, $MouseY, $UseMouseX, $UseMouseY, $Edit1 Global $aArray[1] = [] $cmdtmp = StringReplace($cmdlineraw, Chr(34), "") If StringLen($cmdtmp) = 2 Then     If StringRight($cmdtmp, 1) = ":" Then         $cmd = $cmdtmp & "\"     EndIf Else     If StringRight($cmdtmp, 1) <> "\" Or StringRight($cmdtmp, 1) <> "/" Then         $cmd = $cmdtmp & "\"     EndIf EndIf If Not FileExists($cmd) Then                    ;Check if the folder exists, display an error message if not !     DisplayReadMe(1)     Exit EndIf If StringLen(@ScriptDir) > 3 And StringRight(@ScriptDir, 1) <> "\" Then     $tmpinidir = @ScriptDir & "\" Else     $tmpinidir = @ScriptDir EndIf Local Const $sFilePath = $tmpinidir & "NewFile.ini" $filesetting = IniRead($sFilePath, "setting", "filename", "MyNewFile") $filesetting = StringReplace($filesetting, ">", " ") ;msgbox (0,"",$filesetting)  ;Debugging If FileExists($sFilePath) Then     $aArray = IniReadSectionNames($sFilePath) ; Read the INI section names. This will return a 1 dimensional array. EndIf $UseMouseX = IniRead($sFilePath, "setting", "UseMouseX", "1") $UseMouseY = IniRead($sFilePath, "setting", "UseMouseY", "0") ; Check if an error occurred. If Not @error Then     ; Enumerate through the array displaying the section names.     Local $count = 0     If FileExists($sFilePath) Then         For $i = 1 To $aArray[0]             $tmp1 = IniRead($sFilePath, $aArray[$i], "1", "none")             If $tmp1 <> "none" And StringLeft($tmp1, 1) = "." Then            ;Extension need to have a dot, or it will be ignored !                 $tmptxt = $tmptxt & $tmp1 & "|" & $aArray[$i] & @CRLF                 $count = $count + 1                                            ;Count how many extensions are added !             EndIf         Next     EndIf     If $count = 0 Then $tmptxt = ".au3|AutoIt 3" & @CRLF & ".txt|Text File" & @CRLF     ;MsgBox($MB_SYSTEMMODAL,"",$tmptxt)     _ArrayAdd($test, $tmptxt, 0, "|", @CRLF) Else                                                            ;Reading the ini failed, create a default array for the extensions     $tmptxt = ".au3|AutoIt 3" & @CRLF & ".txt|Text" & @CRLF     _ArrayAdd($test, $tmptxt, 0, "|", @CRLF) EndIf ;Local $test[5][2] = [['.au3', 'AutoIt'], ['.ahk', 'Auto Hotkey'], ['.txt', 'text'], ['.sdlbas', 'Sdl Basic'], ['.html', 'Webpage']] If $UseMouseX = 1 Then     $MouseX = MouseGetPos(0) Else     $MouseX = -1 EndIf If $UseMouseY = 1 Then     $MouseY = MouseGetPos(1) Else     $MouseY = -1 EndIf $Form1 = GUICreate("Create New File", 210, 247, $MouseX, $MouseY, $WS_CAPTION, $WS_EX_TOOLWINDOW) $List = GUICtrlCreateListView("", 5, 5, 200, 200) _GUICtrlListView_InsertColumn($List, 0, "Extension", 65) _GUICtrlListView_InsertColumn($List, 1, "Description", 115) _GUICtrlListView_AddArray($List, $test) GUICtrlCreateLabel("Example:" & $filesetting & "0000.ext", 5, 205) $Button1 = GUICtrlCreateButton("Ok", 16, 224, 45, 22) $Button3 = GUICtrlCreateButton("ReadMe", 80, 224, 55, 22) $Button2 = GUICtrlCreateButton("Cancel", 150, 224, 45, 22) $cDummy = GUICtrlCreateDummy() GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") While 1     $nMsg = GUIGetMsg()     Switch $nMsg         Case $GUI_EVENT_CLOSE, $Button2             Exit         Case $Button3             DisplayReadMe(0)         Case $Button1, $cDummy             Local $tmptxt = StringSplit(_GUICtrlListView_GetItemTextString($List), "|")[1]             If StringLen($tmptxt) > 0 Then                 Local $fnr = 0, $tmpfile = ""                 While $fnr < 10000                     $tmpfile = $cmd & $filesetting & _StringRepeat("0", 4 - StringLen($fnr)) & $fnr & $tmptxt                     ;MsgBox(0,"",$tmpfile) ; for debugging                     If Not (FileExists($tmpfile)) Then                         $hFile = _WinAPI_CreateFile($tmpfile, 0)                         _WinAPI_CloseHandle($hFile)                         Exit                     EndIf                     $fnr = $fnr + 1                 WEnd             EndIf     EndSwitch WEnd ;================================================================================ Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView     $hWndListView = $List     If Not IsHWnd($List) Then $hWndListView = GUICtrlGetHandle($List)     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))     $iCode = DllStructGetData($tNMHDR, "Code")     Switch $hWndFrom         Case $hWndListView             Switch $iCode                 Case $NM_DBLCLK                     ; Fire the dummy if the ListView is double clicked                     GUICtrlSendToDummy($cDummy)             EndSwitch     EndSwitch     Return $GUI_RUNDEFMSG EndFunc   ;==>WM_NOTIFY Func DisplayReadMe($err)     Local $Form1 = GUICreate("Read Me", 550, 400, 10, 10, BitOR($WS_CAPTION, $WS_THICKFRAME ,$WS_MAXIMIZEBOX))     $Edit1 = GUICtrlCreateEdit("", 0, 0, 549, 399)     GUICtrlSetData(-1, "")     GUISetState(@SW_SHOW)     If $err=1 then         local $txttmp01="Error: Path does not exist"         local $txttmp02="Commandline call was: "         AddText ($txttmp01)         Addtext ($txttmp02 & $cmd & @CRLF & @CRLF)     EndIf     AddText("Instructions:" & @CRLF)     AddText("Displays a selection of available extensions and then creates a new file at the Path's location." & @CRLF & @CRLF & "Usage: NewFile Path")     AddText("Example: NewFile c:\myfolder\" & @CRLF)     AddText("Result: A file with a name 'MyFile0000.ext' will be created at the Path's location.")     AddText("If the filename exists, the number counter will increase, until it finds a free number, up to 9999." & @CRLF)     AddText("Uses a configuration file in the .exe folder named NewFile.ini !" & @CRLF)     AddText("Example of a config file:" & @CRLF)     AddText("[setting]" & @CRLF & "filename=MyFile>")     AddText("UseMouseX=0                ;0 or 1 - position the dialog at the mouse x coordinate - usefull for multi monitor settings !")     AddText("UseMouseY=0                ;0 or 1 - Set this and UseMouseX to spawn the dialog at the mouse coordinates !" & @CRLF)     AddText(";Use > in filename as a space char ! (only needed if you want the space char at the beginning or at the end : in between filename and the number)" & @CRLF)     AddText(";Format for this ini file is:" & @CRLF & ";Name              e.g [Auto It]")     AddText(";extension       e.g 1=.au3" & @CRLF & "; p.s. only 1 extension per section ! the number must be 1" & @CRLF)     AddText("[AutoIt3]" & @CRLF & "1=.au3" & @CRLF & @CRLF & "[Text]" & @CRLF & "1=.txt")     _GUICtrlEdit_SetSel($Edit1, 0, 0)     _GUICtrlEdit_Scroll($Edit1, $SB_SCROLLCARET)     If $err=1 Then         _GUICtrlEdit_SetSel($Edit1, 0, StringLen($txttmp01 & $txttmp02 & $cmd)+5)     EndIf     While 1         $nMsg = GUIGetMsg()         Switch $nMsg             Case $GUI_EVENT_CLOSE                 GUIDelete($Form1)                 ExitLoop         EndSwitch     WEnd EndFunc   ;==>DisplayReadMe Func AddText($edittxt)     _GUICtrlEdit_AppendText($Edit1, $edittxt & @CRLF) EndFunc   ;==>AddText  
       NewFile.ini
      [setting] filename=MyNewFile_ UseMouseX=0                ;0 or 1 - position the dialog at the mouse x coordinate - usefull for multi monitor settings ! UseMouseY=0                ;0 or 1 - Set this and UseMouseX to spawn the dialog at the mouse coordinates ! ;Use > in filename as a space char ! (only needed if you want the space char at the beginning or at the end : in between filename and the number) ;Format for this ini file is: ;Name              e.g [Auto It] ;extension       e.g 1=.au3 ; p.s. only 1 extension per section ! the number must be 1 [AutoIt3] 1=.au3 [Auto Hotkey] 1=.ahk [Text] 1=.txt [Sdl Basic] 1=.sdlbas [Webpage] 1=.html [Basic] 1=.bas [Pascal] 1=.pas [Rich Text (RTF)] 1=.rtf [Word Document] 1=.doc [Hex File] 1=.hex
×
×
  • Create New...