; Tri avec auto-création des items par DllCall
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
Global $g_iCurCol = -1
Global $g_iSortDir = 1
Global $g_bSet = False
Global $g_iCol = -1
Example()
Func Example()
$g_iCurCol = -1
$g_iSortDir = 1
$g_bSet = False
$g_iCol = -1
Local $hGUI = GUICreate("Test", 300, 200)
Local $idLv = GUICtrlCreateListView("Column1|Col2|Col3", 10, 10, 280, 180)
GUICtrlRegisterListViewSort(-1, "LVSort2") ; Crée la fonction 'SortLV' pour le tri 'callback'
MyGUICtrlCreateListViewItem("ABC|666|10.05.2004", $idLv, -1)
MyGUICtrlCreateListViewItem("DEF|444|11.05.2005", $idLv, -1)
MyGUICtrlCreateListViewItem("CDE|444|12.05.2004", $idLv, -1)
GUISetState(@SW_SHOW)
; Boucle jusqu'à ce que l'utilisateur quitte.
Local $idMsg = GUIGetMsg()
While $idMsg <> $GUI_EVENT_CLOSE
If $idMsg = $idLv Then
$g_bSet = False
$g_iCurCol = $g_iCol
GUICtrlSendMsg($idLv, $LVM_SETSELECTEDCOLUMN, GUICtrlGetState($idLv), 0)
DllCall("user32.dll", "int", "InvalidateRect", "hwnd", ControlGetHandle($hGUI, "", $idLv), "int", 0, "int", 1)
EndIf
$idMsg = GUIGetMsg()
WEnd
EndFunc ;==>Example
; Notre fonction de tri callback
Func LVSort2($hWnd, $idItem1, $idItem2, $idColumn)
Local $sVal1, $sVal2, $iResult
; Change la direction de tri
If $idColumn = $g_iCurCol Then
If Not $g_bSet Then
$g_iSortDir = $g_iSortDir * -1
$g_bSet = True
EndIf
Else
$g_iSortDir = 1
EndIf
$g_iCol = $idColumn
$sVal1 = GetSubItemText($hWnd, $idItem1, $idColumn)
$sVal2 = GetSubItemText($hWnd, $idItem2, $idColumn)
; Si c'est le 3ème colonne (celle qui commence par 0), alors compare les dates
If $idColumn = 2 Then
$sVal1 = StringRight($sVal1, 4) & StringMid($sVal1, 4, 2) & StringLeft($sVal1, 2)
$sVal2 = StringRight($sVal2, 4) & StringMid($sVal2, 4, 2) & StringLeft($sVal2, 2)
EndIf
$iResult = 0 ; Pas de changement des positions de item1 et de item2
If $sVal1 < $sVal2 Then
$iResult = -1 ; Met item2 avant item1
ElseIf $sVal1 > $sVal2 Then
$iResult = 1 ;Mettez item2 derrière élément1
EndIf
$iResult = $iResult * $g_iSortDir
Return $iResult
EndFunc ;==>LVSort2
; Crée et insére des items directement dans la Listview
Func MyGUICtrlCreateListViewItem($sText, $idCtrl, $iIndex)
Local $tLvitem = DllStructCreate("uint;int,int,uint;uint;ptr;int;int;int;int;")
Local $tText = DllStructCreate("char[260]")
Local $aText = StringSplit($sText, "|")
If $iIndex = -1 Then $iIndex = GUICtrlSendMsg($idCtrl, $LVM_GETITEMCOUNT, 0, 0)
DllStructSetData($tText, 1, $aText[1]) ;Enregistrez le texte de l'élément dans la structure
DllStructSetData($tLvitem, 1, BitOR($LVIF_TEXT, $LVIF_PARAM))
DllStructSetData($tLvitem, 2, $iIndex)
DllStructSetData($tLvitem, 6, DllStructGetPtr($tText))
; Définit le lParam de la structure sur l'index unique de ligne dans le listview
DllStructSetData($tLvitem, 9, $iIndex)
$iIndex = GUICtrlSendMsg($idCtrl, $LVM_INSERTITEMA, 0, DllStructGetPtr($tLvitem))
If $iIndex > -1 Then
; Insére maintenant le reste du texte de la colonne
For $i = 2 To $aText[0]
DllStructSetData($tText, 1, $aText[$i])
DllStructSetData($tLvitem, 3, $i - 1) ;Stocker l'index de sous-élément
GUICtrlSendMsg($idCtrl, $LVM_SETITEMTEXTA, $iIndex, DllStructGetPtr($tLvitem))
Next
EndIf
; Change la largeur de colonne pour ajuster le texte de l'item
For $i = 0 To 2
GUICtrlSendMsg($idCtrl, $LVM_SETCOLUMNWIDTH, $i, -1)
GUICtrlSendMsg($idCtrl, $LVM_SETCOLUMNWIDTH, $i, -2)
Next
EndFunc ;==>MyGUICtrlCreateListViewItem
; Récupére le texte d'un item listview dans une colonne spécifiée
Func GetSubItemText($idCtrl, $idItem, $iColumn)
Local $tLvfi = DllStructCreate("uint;ptr;int;int[2];int")
DllStructSetData($tLvfi, 1, $LVFI_PARAM)
DllStructSetData($tLvfi, 3, $idItem)
Local $tBuffer = DllStructCreate("char[260]")
Local $iIndex = GUICtrlSendMsg($idCtrl, $LVM_FINDITEM, -1, DllStructGetPtr($tLvfi));
Local $tLvi = DllStructCreate("uint;int,int,uint;uint;ptr;int;int;int;int")
DllStructSetData($tLvi, 1, $LVIF_TEXT)
DllStructSetData($tLvi, 2, $iIndex)
DllStructSetData($tLvi, 3, $iColumn)
DllStructSetData($tLvi, 6, DllStructGetPtr($tBuffer))
DllStructSetData($tLvi, 7, 260)
GUICtrlSendMsg($idCtrl, $LVM_GETITEMA, 0, DllStructGetPtr($tLvi));
Local $sItemText = DllStructGetData($tBuffer, 1)
Return $sItemText
EndFunc ;==>GetSubItemText