Jump to content
AndyS19

ToolTip for individual ListView items

Recommended Posts

I'm trying to create a dynamic ToolTip that displays the text of the ListView item that the cursor is hovering over.  I found examples on line that displayed a ToolTip whenever the cursor is over the ListView, but I cannot figure out how to get the text of the ListView item under the cursor.

Test code:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
#include <GUIToolTip.au3>

Opt('MustDeclareVars', 1)

Global Const $LPSTR_TEXTCALLBACK = -1
Global $hMainWin, $iID_ListView, $iID_ListView_hHeader, $hToolTip

_Main()

Func _Main()
    createGUI()

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    While (1)
        Local $msg = GUIGetMsg()
        Select
            Case $msg = $GUI_EVENT_CLOSE
                Exit
        EndSelect
        Sleep(125)
    WEnd
EndFunc   ;==>_Main

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

    $hWndListView = $iID_ListView
    If Not IsHWnd($iID_ListView) Then $hWndListView = GUICtrlGetHandle($iID_ListView)

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

    ; Get the rect of the Listview
    $aPos = _GUICtrl_GetMessagePos($iIDFrom)

    Switch $hwndFrom
        Case $hWndListView
            Switch $iCode
                Case $LVN_HOTTRACK; Sent by a list-view control When the user moves the mouse over an item
                    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
                    $gText = _GUICtrlListView_GetItemText($hwndFrom, DllStructGetData($tInfo, "Index"), 0)
                    ToolTip($gText)
                    ; Return 0; Allow the ListView to perform its normal track select processing.
                    Return 1; the item will not be selected.
                    ; No returnValue
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

; e.g.:
;      _GUIToolTip_AddToolMod($hToolTip, $hMainWin, $LPSTR_TEXTCALLBACK, _
;      $iID_ListView_hHeader, _
;      0, 0, 0, 0, BitOR(1, 8), $iID_ListView_hHeader)

Func _GUIToolTip_AddToolMod($hTool, $hWnd, $sText, $iID = 0, $iLeft = 0, $iTop = 0, $iRight = 0, $iBottom = 0, $iFlags = 8, $iParam = 0)
    Local $tToolInfo = DllStructCreate($tagTOOLINFO)
    Local $pToolInfo = DllStructGetPtr($tToolInfo)
    Local $iToolInfo = DllStructGetSize($tToolInfo)
    DllStructSetData($tToolInfo, "Size", $iToolInfo)
    DllStructSetData($tToolInfo, "Flags", _GUIToolTip_BitsToTTF($iFlags))
    DllStructSetData($tToolInfo, "hWnd", $hWnd)
    DllStructSetData($tToolInfo, "ID", $iID)
    DllStructSetData($tToolInfo, "Left", $iLeft)
    DllStructSetData($tToolInfo, "Top", $iTop)
    DllStructSetData($tToolInfo, "Right", $iRight)
    DllStructSetData($tToolInfo, "Bottom", $iBottom)
    DllStructSetData($tToolInfo, "Param", $iParam)

    Local $iRet = 0
    If IsString($sText) Then
        Local $iBuffer = StringLen($sText) + 1
        Local $tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]")
        $iBuffer *= 2
        Local $pBuffer = DllStructGetPtr($tBuffer)
        DllStructSetData($tBuffer, "Text", $sText)
        DllStructSetData($tToolInfo, "Text", $pBuffer)
        $iRet = _SendMessage($hTool, $TTM_ADDTOOLW, 0, $pToolInfo, 0, "wparam", "ptr")
    Else
        DllStructSetData($tToolInfo, "Text", $sText)
        $iRet = _SendMessage($hTool, $TTM_ADDTOOLW, 0, $pToolInfo, 0, "wparam", "ptr")
    EndIf
    Return $iRet <> 0
EndFunc   ;==>_GUIToolTip_AddToolMod

Func _GUICtrl_GetMessagePos($control)
    Local $p = DllCall("user32.dll", "DWORD", "GetMessagePos")
    Local $pt = DllStructCreate($tagPOINT)
    DllStructSetData($pt, "X", _WinAPI_LoWord($p[0]))
    DllStructSetData($pt, "Y", _WinAPI_HiWord($p[0]))
    _WinAPI_ScreenToClient(_GUICtrl_GetHandle($control), $pt)
    Local $result[2] = [DllStructGetData($pt, "X"), DllStructGetData($pt, "Y")]
    Return $result
EndFunc   ;==>_GUICtrl_GetMessagePos

Func _GUICtrl_GetHandle($control)
    If IsHWnd($control) Then Return $control
    Return GUICtrlGetHandle($control)
EndFunc   ;==>_GUICtrl_GetHandle


Func createGUI()
    Local $flags, $flagsEX, $w, $h, $str

    $w = 250
    $h = 200
    $flags = BitOR($WS_CAPTION, $WS_VISIBLE)

    $hMainWin = GUICreate("ToolTip test", 250, 200, -1, -1, $flags)

    $flags = $WS_VISIBLE
    $flagsEX = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP)

    $iID_ListView = GUICtrlCreateListView("Column 0|Column 1|Column 2", 10, 10, $w - 15, $h - 25, $flags, $flagsEX)

    For $i = 0 To 5
        $str = StringFormat("Item %s|abc%s|def%s", $i, $i, $i)
        GUICtrlCreateListViewItem($str, $iID_ListView)
    Next

    $iID_ListView_hHeader = _GUICtrlListView_GetHeader($iID_ListView)
    $hToolTip = _GUIToolTip_Create($hMainWin)

    _GUIToolTip_AddToolMod($hToolTip, $hMainWin, $LPSTR_TEXTCALLBACK, _
            $iID_ListView_hHeader, 0, 0, 0, 0, BitOR(1, 8), $iID_ListView_hHeader)

EndFunc   ;==>createGUI

Share this post


Link to post
Share on other sites

AndyS19,

You were really close:

$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
$gText = _GUICtrlListView_GetItemText($hwndFrom, DllStructGetData($tInfo, "Item"), DllStructGetData($tInfo, "SubItem"))
ToolTip($gText)

You just needed the correct names for the struct elements.

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


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

  • Similar Content

    • By Slipk
      Hello everybody,
      #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> #include <GUIListViewEx.au3> $Form1 = GUICreate("Form1", 539, 350, 192, 124) $ListView1 = GUICtrlCreateListView("CLM1|CLM2", 0, 0, 538, 326) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 150) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150) Local $dynamic = GUICtrlCreateListViewItem("Example1|Example2", $ListView1) $SubMenu = GUICtrlCreateContextMenu($dynamic) $Run = GUICtrlCreateMenuItem("Run", $SubMenu) $Edit = GUICtrlCreateMenuItem("Edit", $SubMenu) $Delete = GUICtrlCreateMenuItem("Delete", $SubMenu) Local $dynamic2 = GUICtrlCreateListViewItem("Example3|Example6", $ListView1) $SubMenu = GUICtrlCreateContextMenu($dynamic2) $Run = GUICtrlCreateMenuItem("Run", $SubMenu) $Edit = GUICtrlCreateMenuItem("Edit", $SubMenu) $Delete = GUICtrlCreateMenuItem("Delete", $SubMenu) _GUIListViewEx_Init($ListView1, "", 0, 0, True, 64) _GUIListViewEx_MsgRegister() GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd I use GUIListViewEx.au3 for position of items in listview but when I move one the context menu disappear. Any solution of this?
      Any method than array it is possible?
      Thank you, appreciate it.
       
       
    • By Slipk
      Hello everybody,
      I download the GUIListViewEx.au3 by Melba23 in order to move up or down my items from a listview.
      Everything it's looking good in script but when I move an item it will crash.
      Any suggestions?
      Thank you! 

    • By Slipk
      Hello everybody,
      Sorry for my bad english.
       
      I try to figure out if I have a dynamic listview with as many items as I want, how to save to a text file all the data listview contains in the same form that you put when you create a listviewitem. I will give you an example.
      When the script is running it will show you the listview and some items. How to take the items data "Data1|Data1_Sub1|Data1_Sub2" in this format and paste into a text file? All of them.
      I tried to explain as good as I can.
      Thank you for your attention!
      #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> $Form_Menu = GUICreate("Form Example", 351, 234, -1, -1) $Form_Menu_ListView1 = GUICtrlCreateListView("Column #1|Column #2|Column #3", 0, 0, 346, 230) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 75) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 75) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 75) GUICtrlCreateListViewItem("Data1|Data1_Sub1|Data1_Sub2", $Form_Menu_ListView1) GUICtrlCreateListViewItem("Data2|Data2_Sub1|Data2_Sub2", $Form_Menu_ListView1) GUICtrlCreateListViewItem("DataN|DataN_SubN|DataN_SubN", $Form_Menu_ListView1) ;The data that appear in the listview be saved in a file like that : #cs Data1|Data1_Sub1|Data1_Sub2 Data2|Data2_Sub1|Data2_Sub2 DataN|DataN_SubN|DataN_SubN #ce GUISetState(@SW_SHOW, $Form_Menu) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd
    • By Slipk
      Hello,
      I tried with many methods and searched a lot for items to move up and down but couldn't find it.
      Sorry for my bad english.
      #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> #include <GuiListView.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 307, 247, 192, 124) GUISetFont(10, 400, 0, "Arial") $ListView1 = GUICtrlCreateListView("C1|C2|C3", 0, 0, 250, 246) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 60) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 100) GUICtrlCreateListViewItem("Test1|Test2|Test3", $ListView1) GUICtrlCreateListViewItem("Cat|Dog|Fish", $ListView1) GUICtrlCreateListViewItem("ABC|DEF|GHI", $ListView1) $Button1 = GUICtrlCreateButton("/\", 264, 8, 27, 25) GUICtrlSetFont(-1, 10, 800, 0, "Arial") $Button2 = GUICtrlCreateButton("\/", 264, 40, 27, 25) GUICtrlSetFont(-1, 10, 800, 0, "Arial") GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1     $nMsg = GUIGetMsg()     Switch $nMsg         Case $GUI_EVENT_CLOSE             Exit         Case $Button1 ;up         Case $Button2 ;down     EndSwitch WEnd  
      Thank you for your help!
    • By ohaya
      Hi,
      I am still really new with AutoIT.  We are using it to automate logging into web sites and I have encountered problems with focus.  The target web page is configured to put the cursor into the first text field (username) when the page is loaded, and when I run the AutoIT script, which does the log in seems like it is just not starting where I expect it to be.  
      I have been kind of using ToolTip() to kind of help with debugging, but now I am wondering if the calls to ToolTip() are causing the focus to be messed up.  
      For example, at least visually, when the ToolTip() is called, I can see the cursor disappear from the web page text field and they when I do anything that is supposed to send keystrokes, they are going off somwhere else ("never-neverland").
      But when I remove some of the ToolTip() calls, it works correctly.
      So the questions I have are:
      1) Do the ToolTip() calls interfere with/change where the focus on the target page are?
      2) In general, what are the "rules" for where ToolTip can be used "safely" (== doesn't interfere with focus)?
      Thanks,
      Jim
       
×
×
  • Create New...