Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <ListBoxConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode",1)
Global $iListBkColor = 0x0000CC
Global $iListSelColor = 0xCCCCFF
$hGui = GuiCreate("Ownerdraw listbox demo",300,200)
GUISetOnEvent($GUI_EVENT_CLOSE, "SysEvents")
GUIRegisterMsg($WM_MEASUREITEM, "MsgEvents")
GUIRegisterMsg($WM_DRAWITEM, "MsgEvents")
$cLBox1 = GUICtrlCreateList("", 10,25,135,170, $LBS_SORT+$WS_BORDER+$WS_VSCROLL+$LBS_OWNERDRAWFIXED+$LBS_HASSTRINGS)
GUICtrlSetData(-1, "1a|1b|1c|1d|1e")
GUICtrlSetBkColor(-1, $iListBkColor)
$cLBox2 = GUICtrlCreateList("", 155,25,135,170)
GUICtrlSetData(-1, "2a|2b|2c|2d|2e")
GUICtrlSetBkColor(-1, $iListBkColor)
;~ GUICtrlSetState(-1, $GUI_FOCUS)
$lbl1 = GUICtrlCreateLabel("Ownerdraw:", 10, 5, 135, 15)
$lbl1 = GUICtrlCreateLabel("Normal:", 155, 5, 135, 15)
GUISetState(@SW_SHOW)
While 1
Sleep(1000)
WEnd
Func SysEvents()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
EndFunc
Func MsgEvents($hWnd, $Msg, $wParam, $lParam)
Local Const $NM_CUSTOMDRAW = -12
Local Const $ODT_LISTBOX = 2
Local Const $ODA_DRAWENTIRE = 0x1
Local Const $ODA_FOCUS = 0x4
Local Const $ODA_SELECT = 0x2
Local Const $ODS_SELECTED = 0x1
Local Const $DT_RIGHT = 0x2
Local Const $DT_LEFT = 0x0
Switch $Msg
Case $WM_MEASUREITEM
$tMEASUREITEMS = DllStructCreate("uint cType;uint cID;uint itmID;uint itmW;uint itmH;ptr itmData", $lParam)
DllStructSetData($tMEASUREITEMS, "itmH", 13)
Return 1
Case $WM_DRAWITEM
$tDRAWITEMS = DllStructCreate("uint cType;" & _
"uint cID;" & _
"uint itmID;" & _
"uint itmAction;" & _
"uint itmState;" & _
"hwnd hItm;" & _
"hwnd hDC;" & _
"dword itmRect[4];" & _
"dword itmData", _
$lParam)
If DllStructGetData($tDRAWITEMS, "cType") <> $ODT_LISTBOX Then Return $GUI_RUNDEFMSG
$cID = DllStructGetData($tDRAWITEMS, "cID")
$itmID = DllStructGetData($tDRAWITEMS, "itmID")
$itmAction = DllStructGetData($tDRAWITEMS, "itmAction")
$itmState = DllStructGetData($tDRAWITEMS, "itmState")
$hItm = DllStructGetData($tDRAWITEMS, "hItm")
$hDC = DllStructGetData($tDRAWITEMS, "hDC")
Switch $itmAction
Case $ODA_DRAWENTIRE, $ODA_SELECT
$tRECT = DllStructCreate("int;int;int;int",DllStructGetPtr($tDRAWITEMS, "itmRect"))
;select bkground color
If $itmState = $ODS_SELECTED Then
$iBrushColor = RGB2BGR($iListSelColor)
Else
$iBrushColor = RGB2BGR($iListBkColor)
EndIf
;draw item bkground
$aBrush = DLLCall("gdi32.dll","hwnd","CreateSolidBrush", "int", $iBrushColor)
$aBrushOld = DLLCall("gdi32.dll","hwnd","SelectObject", "hwnd", $hDC, "hwnd", $aBrush[0])
DLLCall("user32.dll","int","FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($tRECT), "hwnd", $aBrush[0])
DLLCall("gdi32.dll","hwnd","SelectObject", "hwnd", $hDC, "hwnd", $aBrushOld[0])
DLLCall("gdi32.dll","int","DeleteObject", "hwnd", $aBrush[0])
DLLCall("gdi32.dll","int","SetBkMode", "hwnd", $hDC, "int", 1)
;get the text to be drawn
$tBuffer = DllStructCreate("char[4096]")
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hItm, "int", 0x189, "int", $itmID, "ptr", DllStructGetPtr($tBuffer))
$itmText = DllStructGetData($tBuffer, 1)
;text indent
DllStructSetData($tRECT, 1, DllStructGetData($tRECT, 1)+2)
DllStructSetData($tRECT, 3, DllStructGetData($tRECT, 3)-2)
;draw item text
DllCall("user32.dll", "int", "DrawText", _
"hwnd", $hDC, _
"str", $itmText, "int", StringLen($itmText), _
"ptr", DllStructGetPtr($tRECT), _
"int", $DT_LEFT)
Case $ODA_FOCUS
;enable for focus rectangle
;~ Return $GUI_RUNDEFMSG
EndSwitch
Return 1
EndSwitch
EndFunc
Func RGB2BGR($iColor)
Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc