Jump to content
Sign in to follow this  
Trolleule

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

Share this post


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

 

Share this post


Link to post
Share on other sites

You missed the goal...

Quote

i want to display a tooltip when i hover over the listview group.

Your solution tooltips the items, not a group.

Share this post


Link to post
Share on other sites

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

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
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • 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
    • By Miliardsto
      I have the following code. You can see there are $color_normal and $color_trans
      In my case normal is too dark . And color trans is to much violet.
      If you run it you will see how its looks. I want gui with listView have the same color like taskbar in windows 10.
      How to achieve that?
       
       
      #include <Date.au3> #include <MsgBoxConstants.au3> #include <GuiListBox.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> HotKeySet("{ESC}", "Terminate") $color_normal = "0x" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 24), 6) $color_trans = "0x" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 16), 6) $trans = RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") ConsoleWrite("Transpart = " & $trans & @CRLF) ConsoleWrite("Color normal = " & $color_normal & @CRLF) ConsoleWrite("Color trans = " & $color_trans & @CRLF) ConsoleWrite(_Get_taskbar_color()); It return AARRGGBB $taskbarColor = _Get_taskbar_color() Global $gui = GUICreate("Test", 150, 58,@DesktopWidth-300,@DesktopHeight-58,$WS_POPUP,BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) Global $idListview = GUICtrlCreateListView("", 0, 0, 150, 58,BitOR($LBS_NOTIFY,$LBS_SORT), 0) ;_GuiCtrlMakeTrans(-1,100) ; Add column _GUICtrlListView_AddColumn($idListview, "Msgs", 100) GUICtrlSetFont(-1, 7, 400, 0, "Segoe UI") GUICtrlSetColor(-1, 0x470C4F) GUICtrlSetBkColor($idListview, 0x310638) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func Terminate() Exit EndFunc Func _Get_taskbar_color() If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "ColorPrevalence") Then If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") Then Return "0xD9" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 16), 6) Else Return "0xFF" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 24), 6) EndIf Else If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") Then Return "0xD9000000" Else Return "0xFF000000" EndIf EndIf EndFunc  
    • 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
×
×
  • Create New...