找回密码
 加入
搜索
查看: 157|回复: 6

[AU3基础] 请教关于如何解决ListViewGUI在XP下CheckBox的错位问题

[复制链接]
发表于 2026-2-21 20:32:20 | 显示全部楼层 |阅读模式
本帖最后由 yuantian 于 2026-2-21 22:21 编辑

大家新年好(趁着还没出初五)


想请教一下大家关于ListView中,
添加首行复选框(CheckBox),
在XP系统下勾选错位。
Win7及以上系统,显示正常。
测试了好几个版本的编译工具,都不行。

不知道哪个大佬路过能指点几句,谢谢

================================================================================
下面为各系统显示截图:
1. Win7及以上系统显示结果

2. XP系统下显示结果(图标不重要,重点是前面的复选框[明显偏下])

================================================================================

以下为代码片段:
#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>

; 主窗口创建
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 $hImageList_32 = _GUIImageList_Create(32, 32, 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)

; 显示窗口
GUISetState(@SW_SHOW, $hGUI)

; 消息循环
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        ExitLoop
        EndSwitch
WEnd
Exit

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2026-2-22 17:45:21 | 显示全部楼层
#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

评分

参与人数 1金钱 +40 收起 理由
yuantian + 40 太牛了,很给力!

查看全部评分

发表于 2026-2-21 23:04:22 | 显示全部楼层
1. 降版  3.3.14.2 以下看看
2.xp 系統編輯
有時在win7 編譯的,在xp 就怪怪的,原碼搬到 xp 環境及調試後就可以了
 楼主| 发表于 2026-2-21 23:13:40 | 显示全部楼层
yohoboy 发表于 2026-2-21 23:04
1. 降版  3.3.14.2 以下看看
2.xp 系統編輯
有時在win7 編譯的,在xp 就怪怪的,原碼搬到 xp 環境及調試後 ...

感谢回复。。
1. 我截图2,就是在虚拟机中尝试运行的,结果还是错位。
2. 编译版本我测试了3.3.13.12(已经是很旧的版本了,结果还是不行)




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2026-2-22 13:22:40 | 显示全部楼层
再换版本试试,比如3.3.6.1,再说不同系统显示有差异也正常,只要没有原则性问题就行...
 楼主| 发表于 2026-2-22 19:58:45 | 显示全部楼层

我勒个去,,太牛了发哥!!!!


效果立竿见影




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2026-2-22 20:01:24 | 显示全部楼层
邪恶海盗 发表于 2026-2-22 13:22
再换版本试试,比如3.3.6.1,再说不同系统显示有差异也正常,只要没有原则性问题就行... ...

我水平还是太差。。还需要再多练练
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2026-3-15 22:59 , Processed in 0.084035 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表