Mit einem Doppelklick auf den Titel der Gruppe kann man diese öffnen/schließen...
AutoIt
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;-- TIME_STAMP 2018-06-04 19:34:13 v 0.1
#Region ;************ Includes ************
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
;~ #include <MsgBoxConstants.au3>;~~~
#EndRegion ;************ Includes ************
;~ https://www.autoitscript.com/forum/topic/169182-listview-group-wm_notify-trigger/
;~ https://www.zabkat.com/blog/05Feb12-collapsible-listview.htm
;~ $LVGS_NORMAL 0
;~ $LVGS_COLLAPSED 1
;~ $LVGS_HIDDEN 2
;~ $LVGS_NOHEADER 4
;~ $LVGS_COLLAPSIBLE 8
;~ $LVGS_FOCUSED 16
;~ $LVGS_SELECTED 32
;~ $LVGS_SUBSETED 64
;~ $LVGS_SUBSETLINKFOCUSED 128
Opt('MustDeclareVars', 1)
Global $g_idListview, $g_hListView
Global Const $LVN_GROUPINFO = ($LVN_FIRST - 88)
Global Const $tagNMLVGROUP = $tagNMHDR & ";int iGroupId;uint iNewState;uint iOldState"
Example()
Func Example()
Local $aInfo, $hImage, $g_idListview
GUICreate("ListView Group COLLAPSIBLE", 400, 300)
$g_idListview = GUICtrlCreateListView("", 2, 2, 394, 268)
$g_hListView = GUICtrlGetHandle($g_idListview)
GUISetState(@SW_SHOW)
; Load images
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($g_idListview, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($g_idListview, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($g_idListview, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($g_idListview, $hImage, 1)
; Add columns
_GUICtrlListView_AddColumn($g_idListview, "Column 1", 100)
_GUICtrlListView_AddColumn($g_idListview, "Column 2", 100)
_GUICtrlListView_AddColumn($g_idListview, "Column 3", 100)
; Add items
_GUICtrlListView_AddItem($g_idListview, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($g_idListview, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($g_idListview, 0, "Row 1: Col 3", 2)
_GUICtrlListView_AddItem($g_idListview, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($g_idListview, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($g_idListview, "Row 3: Col 1", 2)
; Build groups
_GUICtrlListView_EnableGroupView($g_idListview)
_GUICtrlListView_InsertGroup($g_idListview, -1, 1, "Group 1", 1)
;~ _GUICtrlListView_SetGroupInfo($g_idListview, 1, "Group 1", 0, BitOR($LVGS_COLLAPSIBLE, $LVGS_COLLAPSED))
_GUICtrlListView_SetGroupInfo($g_idListview, 1, "Group 1", 0, $LVGS_COLLAPSIBLE)
_GUICtrlListView_InsertGroup($g_idListview, -1, 2, "Group 2")
_GUICtrlListView_SetGroupInfo($g_idListview, 2, "Group 2 ~ 2/8", 0, BitOR($LVGS_COLLAPSIBLE, $LVGS_COLLAPSED))
_GUICtrlListView_SetItemGroupID($g_idListview, 0, 1)
_GUICtrlListView_SetItemGroupID($g_idListview, 1, 2)
_GUICtrlListView_SetItemGroupID($g_idListview, 2, 2)
;~ Local $aGroupItems = _GUICtrlListView_GetItemsInGroups($g_idListview)
;~ _ArrayDisplay($aGroupItems, '$aGroupItems')
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
; Loop until the user exits.
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc ;==>Example
; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlListView_GetItemsInGroups
; Description ...: Detects all member for a all groups
; Syntax ........: _GUICtrlListView_GetItemInGroups($hWnd)
; Parameters ....: $hWnd - The listview handle
; Return values .: Success Array with listview index of all member from all group
; ...............: [0][0] = count groups
; ...............: [1 .. n][] = Group ID (equal with array index)
; ...............: [n][0] = count item in group "n", [n][1....] = the item listview-index
; ...............: Failure 0 @error=1 listview has no item
; ...............: @error=2 no groups
; Author ........: BugFix
; Modified ......: Bitnugger
; ===============================================================================================================================
Func _GUICtrlListView_GetItemsInGroups($hWnd)
Local $iGroupID, $iGroupMax, $iItemMax
Local $iCount = _GUICtrlListView_GetItemCount($hWnd)
Local $iColCount = _GUICtrlListView_GetColumnCount($hWnd)
If $iCount = 0 Then Return SetError(1,0,0)
Local $aGroupItems[$iCount+1][$iColCount+1], $iGroupID, $iGroupMax=0, $iItemMax = 0
For $i = 0 To $iCount -1
$iGroupID = _GUICtrlListView_GetItemGroupID($hWnd, $i)
$iGroupMax = $iGroupID < $iGroupMax ? $iGroupMax : $iGroupID
$aGroupItems[$iGroupID][0] += 1
$aGroupItems[$iGroupID][ $aGroupItems[$iGroupID][0] ] = $i
$iItemMax = $aGroupItems[$iGroupID][0] > $iItemMax ? $aGroupItems[$iGroupID][0] : $iItemMax
Next
If $iGroupMax = 0 Then Return SetError(2,0,0)
$aGroupItems[0][0] = $iGroupMax
ReDim $aGroupItems[$iGroupMax +1][$iItemMax+1]
Return $aGroupItems
EndFunc ;==>_GUICtrlListView_GetItemsInGroups
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")
Local $iIndex, $iGroupId
Switch $hWndFrom
Case $g_hListView
Switch $iCode
Case $LVN_GROUPINFO ; A Group was clicked
$tInfo = DllStructCreate($tagNMLVGROUP, $lParam)
Local $iState = DllStructGetData($tInfo, "iNewState"), $iGroupId = DllStructGetData($tInfo, "iGroupId")
Local $aGroupInfo = _GUICtrlListView_GetGroupInfo($g_hListView,$iGroupId), $sTitle = $aGroupInfo[0]
Local $aItemsInGroups = _GUICtrlListView_GetItemsInGroups($g_hListView)
$iIndex = _ArraySearch($aItemsInGroups, $iGroupId)
If Not @error Then
Switch True
Case BitAND($iState, $LVGS_COLLAPSED)
$iState = BitAND($iState, $LVGS_COLLAPSIBLE)
$sTitle &= ' ~ ' & $aItemsInGroups[$iIndex][0] & '/8'
Case Else
$iState = BitAND($iState, BitOR($LVGS_COLLAPSIBLE, $LVGS_COLLAPSED))
$sTitle = StringRegExpReplace($sTitle, '(.+) ~.+', '\1')
EndSwitch
_GUICtrlListView_SetGroupInfo($g_hListView, $iGroupId, $sTitle, 0, $iState)
Else
ConsoleWrite('! #Error: WM_NOTIFY --> _GUICtrlListView_GetItemsInGroups' & @CRLF)
EndIf
_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") & @CRLF)
;~ DllStructSetData($tInfo, 'iNewState', BitOR(DllStructGetData($tInfo, 'iNewState'), $LVGS_SELECTED))
Local $sState, $iState = DllStructGetData($tInfo, "iNewState")
If $iState Then
If BitAND($iState, $LVGS_COLLAPSED ) Then $sState = '$LVGS_COLLAPSED'
If BitAND($iState, $LVGS_HIDDEN ) Then $sState &= ', $LVGS_HIDDEN'
If BitAND($iState, $LVGS_NOHEADER ) Then $sState &= ', $LVGS_NOHEADER'
If BitAND($iState, $LVGS_COLLAPSIBLE) Then $sState &= ', $LVGS_COLLAPSIBLE'
If BitAND($iState, $LVGS_FOCUSED ) Then $sState &= ', $LVGS_FOCUSED'
If BitAND($iState, $LVGS_SELECTED ) Then $sState &= ', $LVGS_SELECTED'
Else
$sState = '$LVGS_NORMAL'
EndIf
If StringLeft($sState, 2) = ', ' Then $sState = StringMid($sState, 3)
;~ ConsoleWrite('--> $iMask = 0x' & Hex($iMask) & @CRLF)
;~ ConsoleWrite('--> GroupID = ' & DllStructGetData($tGroup, "GroupID") & @CRLF)
;~ ConsoleWrite('--> cItems = ' & DllStructGetData($tGroup, "cItems") & @CRLF)
ConsoleWrite('--> State = 0x' & Hex($iState, 2) & ' (' & $sState & ')' & @CRLF)
Case $LVN_COLUMNCLICK ; A column was clicked Local $sState
$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_GETDISPINFO
;~ ConsoleWrite('> Case $LVN_GETDISPINFO' & @CRLF)
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
Alles anzeigen