Code : Tout sélectionner
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <WinAPI.au3>
Global Const $ODT_LISTVIEW = 102
Global Const $ODA_DRAWENTIRE = 0x1
Global Const $ODS_SELECTED = 0x0001
$hGUI = GUICreate("Test GUI", 300, 200)
GUIRegisterMsg($WM_MEASUREITEM, "WM_MEASUREITEM")
$hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems|SubItems2", 10, 10, 280, 180, BitOR($LVS_REPORT, $LVS_OWNERDRAWFIXED), $LVS_EX_GRIDLINES)
_GUICtrlListView_SetBkColor ($hListView, 0x345678)
_GUICtrlListView_SetExtendedListViewStyle($hListView, $LVS_EX_FULLROWSELECT)
For $i = 1 To 10
_GUICtrlListView_AddItem($hListView, "Item " & $i)
_GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem " & $i, 1)
_GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem2 " & $i, 2)
Next
_GUICtrlListView_SetColumnWidth($hListView, 0, 75)
_GUICtrlListView_SetColumnWidth($hListView, 1, 90)
_GUICtrlListView_SetColumnWidth($hListView, 2, 90)
GUIRegisterMsg($WM_MEASUREITEM, "")
GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
;=======================
Func WM_MEASUREITEM($hWnd, $Msg, $wParam, $lParam)
Local $tMEASUREITEMS = DllStructCreate("uint cType;uint cID;uint itmID;uint itmW;uint itmH;ulong_ptr itmData", $lParam)
If DllStructGetData($tMEASUREITEMS, "cType") <> $ODT_LISTVIEW Then Return $GUI_RUNDEFMSG
DllStructSetData($tMEASUREITEMS, "itmH", 18)
Return 1
EndFunc ;==>WM_MEASUREITEM
Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
Local $tagDRAWITEMSTRUCT, $iBrushColor, $cID, $itmID, $itmAction, $itmState, $hItm, $hDC
$tagDRAWITEMSTRUCT = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;" & _
"hwnd hItm;hwnd hDC;int itmRect[4];dword itmData", $lParam)
If DllStructGetData($tagDRAWITEMSTRUCT, "cType") <> $ODT_LISTVIEW Then Return $GUI_RUNDEFMSG
$cID = DllStructGetData($tagDRAWITEMSTRUCT, "cID")
$itmID = DllStructGetData($tagDRAWITEMSTRUCT, "itmID")
$itmAction = DllStructGetData($tagDRAWITEMSTRUCT, "itmAction")
$itmState = DllStructGetData($tagDRAWITEMSTRUCT, "itmState")
$hItm = DllStructGetData($tagDRAWITEMSTRUCT, "hItm")
$hDC = DllStructGetData($tagDRAWITEMSTRUCT, "hDC")
Switch $itmAction
Case $ODA_DRAWENTIRE
If BitAND($itmState, $ODS_SELECTED) = $itmState Then
$iBrushColor = 0xffffff
Else
$iBrushColor = 0xffddbb ; selection
EndIf
Local $aBrush = DLLCall("gdi32.dll","hwnd","CreateSolidBrush", "int", $iBrushColor)
Local $aBrushOld = _WinAPI_SelectObject($hDC, $aBrush[0])
Local $iLeft = DllStructGetData($tagDRAWITEMSTRUCT, "itmRect", 1)
Local $iTop = DllStructGetData($tagDRAWITEMSTRUCT, "itmRect", 2)
Local $iWidth = DllStructGetData($tagDRAWITEMSTRUCT, "itmRect", 3)
Local $iHeight = DllStructGetData($tagDRAWITEMSTRUCT, "itmRect", 4)
For $i = 0 to 2
Local $iSubItmText = _GUICtrlListView_GetItemText($hListView, $itmID, $i)
Local $iSubItmRect = DllStructCreate("int[4]")
Local $aSubItmRect = _GUICtrlListView_GetSubItemRect($hListView, $itmID, $i)
If $i = 0 Then $aSubItmRect[2] = 75
DllStructSetData($iSubItmRect, 1, $iLeft + $aSubItmRect[0]+1, 1)
DllStructSetData($iSubItmRect, 1, $aSubItmRect[1]+2, 2)
DllStructSetData($iSubItmRect, 1, $iLeft + $aSubItmRect[2], 3)
DllStructSetData($iSubItmRect, 1, $aSubItmRect[3]-1, 4)
_WinAPI_FillRect($hDC, DllStructGetPtr($iSubItmRect), $aBrush[0])
DllStructSetData($iSubItmRect, 1, $aSubItmRect[0]+4, 1)
DllStructSetData($iSubItmRect, 1, $aSubItmRect[1]+3, 2)
DllStructSetData($iSubItmRect, 1, $aSubItmRect[2], 3)
DllStructSetData($iSubItmRect, 1, $aSubItmRect[3], 4)
DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "str", $iSubItmText, "int", StringLen($iSubItmText), _
"ptr", DllStructGetPtr($iSubItmRect), "int", $DT_LEFT)
Next
EndSwitch
_WinAPI_SelectObject($hDC, $aBrushOld)
_WinAPI_DeleteObject($aBrush[0])
Return $GUI_RUNDEFMSG
EndFunc