Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <GuiConstants.au3>
#include <GuiEdit.au3>
#include <EditConstants.au3>
#include <WinAPI.au3>
#include <Misc.au3>
HotKeySet("{ENTER}", "_Enregistre")
Opt("MustDeclareVars", 1)
Opt("GUIOnEventMode", 1)
Global $Array1[3][10] = [["Actif", "Check", "ID Text", "Nom", "Option1", "Option2", "Option3", "Autre1", "Autre2", "Autre3"], _
["True", "False", "Text1", "Text2", "True", "False", "True", "Text3", "Text4", "Text5"], _
["True", "True", "Text11", "Text22", "False", "False", "True", "Text3", "Text4", "Text5"] _
]
Global $Array2[3][3] = [["ID Text", "Fichier", "Ico"], _
["Text1", @SystemDir & "\shell32.dll", 63], _
["Text11", @SystemDir & "\shell32.dll", 112] _
]
Global $hEdit, $hDC, $hBrush, $Item = -1, $SubItem = 0
Global $Style = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)
Global $StateFocusListview = False
Global $hGUI = GUICreate("Form", 507, 220, 265, 161)
GUISetOnEvent($GUI_EVENT_CLOSE, "FormClose")
Local $Label1 = GUICtrlCreateLabel("Actif", 8, 10, 40, 15)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
Global $Label = GUICtrlCreateLabel("Nom", 85, 10, 200, 15)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
Local $Label3 = GUICtrlCreateLabel("Options 1", 288, 10, 65, 15)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
Local $Label4 = GUICtrlCreateLabel("Options 2", 360, 10, 65, 15)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
Local $Label5 = GUICtrlCreateLabel("Options 3", 432, 10, 65, 15)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
Global $hListView = _GUICtrlListView_Create($hGUI, "", 8, 25, 490, 150, BitOR($LVS_EDITLABELS, $LVS_REPORT, $LVS_NOCOLUMNHEADER, $WS_BORDER))
_GUICtrlListView_SetExtendedListViewStyle($hListView, $LVS_EX_SUBITEMIMAGES)
Local $ButtonArray1 = GUICtrlCreateButton("Array1", 8, 184, 75, 25)
GUICtrlSetOnEvent(-1, "ButtonArray1")
Local $ButtonArray2 = GUICtrlCreateButton("Array2", 88, 184, 75, 25)
GUICtrlSetOnEvent(-1, "ButtonArray2")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState(@SW_SHOW)
ConsoleWrite($hListView & @CRLF)
; Load images
Global $ListViewImage = _GUIImageList_Create(16, 16, 5, 3)
_GUIImageList_AddIcon($ListViewImage, @SystemDir & "\shell32.dll", 131)
_GUIImageList_AddIcon($ListViewImage, @SystemDir & "\shell32.dll", 110)
_GUIImageList_AddIcon($ListViewImage, @SystemDir & "\shell32.dll", 219) ; En cas d'erreur
_GUICtrlListView_SetImageList($hListView, $ListViewImage, 1)
; Add columns
_GUICtrlListView_AddColumn($hListView, "", 4) ; Première colonne pour palier à la séléction
_GUICtrlListView_AddColumn($hListView, "", 36)
_GUICtrlListView_AddColumn($hListView, "", 0) ; Séparation
_GUICtrlListView_AddColumn($hListView, "", 20)
_GUICtrlListView_AddColumn($hListView, "", 10) ; Séparation
_GUICtrlListView_AddColumn($hListView, "", 200)
_GUICtrlListView_AddColumn($hListView, "", 30) ; Séparation
_GUICtrlListView_AddColumn($hListView, "", 20)
_GUICtrlListView_AddColumn($hListView, "", 50) ; Séparation
_GUICtrlListView_AddColumn($hListView, "", 20)
_GUICtrlListView_AddColumn($hListView, "", 50) ; Séparation
_GUICtrlListView_AddColumn($hListView, "", 20)
_GUICtrlListView_AddColumn($hListView, "", 0) ; Colonne cachée: $Array1[2]
LoadData()
While 1
Sleep(100)
WEnd
Func LoadData()
Local $iIndex
Local $y = 1
For $i = 1 To UBound($Array1) -1
If $Array1[$i][0] = "True" Then
If $Array1[$i][3] <> "" Then
_GUICtrlListView_AddItem($hListView, "")
If $Array1[$i][1] = "True" Then
_GUICtrlListView_SetItemImage($hListView, $i - 1, 1, $y)
Else
_GUICtrlListView_SetItemImage($hListView, $i - 1, 0, $y)
EndIf
$iIndex = _ArraySearch($Array2, $Array1[$i][2], 0, -1, 1, 0, 1, 0)
If Not @error Then
Local $iIndexNewImg = _GUIImageList_AddIcon($ListViewImage, $Array2[$iIndex][1], $Array2[$iIndex][2])
_GUICtrlListView_SetItemImage($hListView, $i - 1, $iIndexNewImg, $y + 2)
Else
_GUICtrlListView_SetItemImage($hListView, $i - 1, 2, $y + 2)
EndIf
_GUICtrlListView_AddSubItem($hListView, $i - 1, $Array1[$i][3], $y + 4)
If $Array1[$i][4] = "True" Then
_GUICtrlListView_SetItemImage($hListView, $i - 1, 1, $y + 6)
Else
_GUICtrlListView_SetItemImage($hListView, $i - 1, 0, $y + 6)
EndIf
If $Array1[$i][5] = "True" Then
_GUICtrlListView_SetItemImage($hListView, $i - 1, 1, $y + 8)
Else
_GUICtrlListView_SetItemImage($hListView, $i - 1, 0, $y + 8)
EndIf
If $Array1[$i][6] = "True" Then
_GUICtrlListView_SetItemImage($hListView, $i - 1, 1, $y + 10)
Else
_GUICtrlListView_SetItemImage($hListView, $i - 1, 0, $y + 10)
EndIf
_GUICtrlListView_AddSubItem($hListView, $i - 1, $Array1[$i][2], $y + 11)
EndIf
EndIf
Next
EndFunc
Func FormClose()
Exit
EndFunc
Func ButtonArray1()
_ArrayDisplay($Array1)
EndFunc
Func ButtonArray2()
_ArrayDisplay($Array2)
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $tNMHDR, $hWndFrom, $iCode
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hListView
Switch $iCode
Case $NM_DBLCLK
Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
If ($aHit[0] <> -1) And ($aHit[1] = 0) Then
$Item = $aHit[0]
$SubItem = 0
Local $aRect = _GUICtrlListView_GetItemRect($hListView, $Item)
ElseIf ($aHit[0] <> -1) And ($aHit[1] > 0) Then
$Item = $aHit[0]
$SubItem = $aHit[1]
Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
Else
Return $GUI_RUNDEFMSG
EndIf
Local $iItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
If $iItemText <> "" And $SubItem = 5 Then
; Local $iLen = _GUICtrlListView_GetStringWidth($hListView, $iItemText)
$hEdit = _GUICtrlEdit_Create($hGUI, $iItemText, $aRect[0] + 12, $aRect[1] + 26, 200 , 17, $Style)
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0x0000FF)
FrameRect($hDC, 0, 0, 200 , 17, $hBrush)
EndIf
$StateFocusListview = True
Case $NM_CLICK
Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
If ($aHit[0] <> -1) And ($aHit[1] = 0) Then
$Item = $aHit[0]
$SubItem = 0
ElseIf ($aHit[0] <> -1) And ($aHit[1] > 0) Then
$Item = $aHit[0]
$SubItem = $aHit[1]
Else
Return $GUI_RUNDEFMSG
EndIf
If $SubItem = 1 Or $SubItem = 7 Or $SubItem = 9 Or $SubItem = 11 Then
Local $iIndexImg = _GUICtrlListView_GetItemImage($hListView, $Item, $SubItem)
Local $RefSearch = _GUICtrlListView_GetItemText($hListView, $Item, 12) ; Return le texte caché de la colonne 12
Local $iIndex = _ArraySearch($Array1, $RefSearch, 0, -1, 1, 0, 1, 2)
If Not @error Then
If $iIndexImg = 0 Then
_GUICtrlListView_SetItemImage($hListView, $Item, 1, $SubItem)
Local $NewState = "True"
ElseIf $iIndexImg = 1 Then
_GUICtrlListView_SetItemImage($hListView, $Item, 0, $SubItem)
Local $NewState = "False"
Else
_GUICtrlListView_SetItemImage($hListView, $Item, 2, $SubItem)
Local $NewState = "False"
EndIf
If $SubItem = 1 Then
$Array1[$iIndex][1] = $NewState
ElseIf $SubItem = 7 Then
$Array1[$iIndex][4] = $NewState
ElseIf $SubItem = 9 Then
$Array1[$iIndex][5] = $NewState
ElseIf $SubItem = 11 Then
$Array1[$iIndex][6] = $NewState
EndIf
EndIf
EndIf
Case -121 ; ???
If $StateFocusListview = False Then
ControlFocus("", "", $hListView)
$StateFocusListview = True
EndIf
Case $NM_KILLFOCUS
$StateFocusListview = False
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
Local $stRect = DllStructCreate("int;int;int;int")
DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)
DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
EndFunc
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $iCode = BitShift($wParam, 16)
Switch $lParam
Case $hEdit
Switch $iCode
Case $EN_KILLFOCUS
_Enregistre()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func _Enregistre()
Local $iText = _GUICtrlEdit_GetText($hEdit)
_GUICtrlListView_SetItemText($hListView, $Item, $iText, $SubItem)
Local $RefSearch = _GUICtrlListView_GetItemText($hListView, $Item, 12) ; Return le texte caché de la colonne 12
Local $iIndex = _ArraySearch($Array1, $RefSearch, 0, -1, 1, 0, 1, 2)
If Not @error Then
$Array1[$iIndex][3] = $iText
EndIf
_WinAPI_DeleteObject($hBrush)
_WinAPI_ReleaseDC($hEdit, $hDC)
_WinAPI_DestroyWindow($hEdit)
$Item = -1
$SubItem = 0
EndFunc