#Region ;**** 参数创建于 ACNWrapper_GUI ****
#PRE_UseUpx=n
#PRE_UseX64=n
#PRE_Res_requestedExecutionLevel=None
#PRE_Run_Tidy=y
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WinAPI.au3>
#include <WinAPIEx.au3>
#include <FrameConstants.au3>
Global Const $CBS_UNCHECKEDNORMAL = 1
Global Const $BP_CHECKBOX = 3
Global Const $CBS_CHECKEDNORMAL = 5
; 主窗口创建
Global $hGUI = GUICreate("ListView32*32图标", 800, 500, -1, -1)
Local $nLV_CtrlID = GUICtrlCreateListView("名称|类型", 20, 20, 760, 460, BitOR($LVS_REPORT, $LVS_NOCOLUMNHEADER, $LVS_SINGLESEL))
_GUICtrlListView_SetExtendedListViewStyle($nLV_CtrlID, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_DOUBLEBUFFER, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
Global $image_width = 32
Global $image_height = 32
Global $hImageList_32 = _GUIImageList_Create($image_width, $image_height, 5, 0)
_GUIImageList_AddIcon($hImageList_32, @SystemDir & "\shell32.dll", 1) ; 文件夹
_GUIImageList_AddIcon($hImageList_32, @SystemDir & "\shell32.dll", 2) ; 此电脑
_GUIImageList_AddIcon($hImageList_32, @SystemDir & "\shell32.dll", 3) ; 本地磁盘
_GUIImageList_AddIcon($hImageList_32, @SystemDir & "\shell32.dll", 4) ; 文本文档
_GUIImageList_AddIcon($hImageList_32, @SystemDir & "\shell32.dll", 13) ; 图片
_GUICtrlListView_SetImageList($nLV_CtrlID, $hImageList_32, 1)
_GUICtrlListView_SetColumnWidth($nLV_CtrlID, 0, 120)
_GUICtrlListView_SetColumnWidth($nLV_CtrlID, 1, 150)
_GUICtrlListView_AddItem($nLV_CtrlID, "我的文件夹", 0)
_GUICtrlListView_AddSubItem($nLV_CtrlID, 0, "文件夹", 1)
_GUICtrlListView_AddItem($nLV_CtrlID, "此电脑", 1)
_GUICtrlListView_AddSubItem($nLV_CtrlID, 1, "系统图标", 1)
_GUICtrlListView_AddItem($nLV_CtrlID, "C盘", 2)
Global $hListView = GUICtrlGetHandle($nLV_CtrlID)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
; 显示窗口
GUISetState(@SW_SHOW, $hGUI)
; 消息循环
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
Func HandleListViewCustomDraw($hWnd, $pnmv)
Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $pnmv)
Local $dwDrawStage = DllStructGetData($tCustDraw, "dwDrawStage")
Switch $dwDrawStage
Case $CDDS_PREPAINT
Return $CDRF_NOTIFYITEMDRAW
Case $CDDS_ITEMPREPAINT
Local $hDC = DllStructGetData($tCustDraw, "hdc")
Local $nItem = DllStructGetData($tCustDraw, "dwItemSpec")
Local $tRect = _GUICtrlListView_GetItemRectEx($hListView, $nItem, $LVIR_BOUNDS)
Local $iRowHeight = $tRect.Bottom - $tRect.Top
Local $bSelected = _GUICtrlListView_GetItemSelected($hListView, $nItem)
Local $iBgColor = $bSelected ? $COLOR_HIGHLIGHT : $COLOR_WINDOW
Local $iTextColor = $bSelected ? $COLOR_HIGHLIGHTTEXT : $COLOR_WINDOWTEXT
Local $hBrush = _WinAPI_CreateSolidBrush(_WinAPI_GetSysColor($iBgColor))
_WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrush)
_WinAPI_DeleteObject($hBrush)
_WinAPI_SetTextColor($hDC, _WinAPI_GetSysColor($iTextColor))
_WinAPI_SetBkMode($hDC, $TRANSPARENT)
Local $iState = _GUICtrlListView_GetItemState($hListView, $nItem, $LVIS_STATEIMAGEMASK)
Local $bChecked = (BitShift($iState, 12) = 2)
Local $cbSize = 16
Local $yCB = $tRect.Top + ($iRowHeight - $cbSize) / 2
Local $tRCCheck = DllStructCreate($tagRECT)
DllStructSetData($tRCCheck, "Left", $tRect.Left + 4)
DllStructSetData($tRCCheck, "Top", $yCB)
DllStructSetData($tRCCheck, "Right", $tRect.Left + 4 + $cbSize)
DllStructSetData($tRCCheck, "Bottom", $yCB + $cbSize)
Local $hTheme = _WinAPI_OpenThemeData($hListView, "BUTTON")
If $hTheme Then
Local $iStateID = $bChecked ? $CBS_CHECKEDNORMAL : $CBS_UNCHECKEDNORMAL
_WinAPI_DrawThemeBackground($hTheme, $BP_CHECKBOX, $iStateID, $hDC, DllStructGetPtr($tRCCheck))
_WinAPI_CloseThemeData($hTheme)
Else
Local $uFlags = BitOR($DFCS_BUTTONCHECK, $bChecked ? $DFCS_CHECKED : 0)
_WinAPI_DrawFrameControl($hDC, DllStructGetPtr($tRCCheck), $DFC_BUTTON, $uFlags)
EndIf
Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListView)
For $iSub = 0 To $iColumnCount - 1
Local $aSubRect = _GUICtrlListView_GetSubItemRect($hListView, $nItem, $iSub)
Local $iDrawX = $aSubRect[0]
If $iSub = 0 Then
$iDrawX += 24
Local $iImgIndex = _GUICtrlListView_GetItemImage($hListView, $nItem, 0)
If $iImgIndex >= 0 Then
Local $iIconY = $tRect.Top + ($iRowHeight - $image_height) / 2
_GUIImageList_Draw($hImageList_32, $iImgIndex, $hDC, $iDrawX, $iIconY, $ILD_TRANSPARENT)
$iDrawX += $image_width + 4
EndIf
EndIf
Local $sText = _GUICtrlListView_GetItemText($hListView, $nItem, $iSub)
Local $tTextRect = DllStructCreate($tagRECT)
DllStructSetData($tTextRect, "Left", $iDrawX + 4)
DllStructSetData($tTextRect, "Top", $aSubRect[1])
DllStructSetData($tTextRect, "Right", $aSubRect[2] - 4)
DllStructSetData($tTextRect, "Bottom", $aSubRect[3])
_WinAPI_DrawText($hDC, $sText, $tTextRect, BitOR($DT_LEFT, $DT_VCENTER, $DT_SINGLELINE, $DT_END_ELLIPSIS))
Next
Return $CDRF_SKIPDEFAULT
EndSwitch
Return $CDRF_DODEFAULT
EndFunc ;==>HandleListViewCustomDraw
Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam)
Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
Local $code = DllStructGetData($tNMHDR, "Code")
Local $hwndFrom = DllStructGetData($tNMHDR, "hWndFrom")
Switch $hwndFrom
Case $hListView
Switch $code
Case $NM_CUSTOMDRAW
Return HandleListViewCustomDraw($hWndGUI, $lParam)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
|