找回密码
 加入
搜索
查看: 199|回复: 4

【求助】子窗口创建ListView控件会卡死,求助是什么问题导致

[复制链接]
发表于 2024-9-25 23:23:14 | 显示全部楼层 |阅读模式
本帖最后由 3131210 于 2024-9-25 23:26 编辑

问题就是在子窗口创建ListView虚表,只要鼠标调整列的宽度或者点击列的表头,就会卡死,不知道是不是我个例,求助是什么问题导致,如何解决
由于程序原因,要创建多个GUICtrlCreatetab控件,所以才需要使用到子窗口。如果不是在子窗口的话,就不会卡死。
还有没有别的办法创建多个GUICtrlCreatetab控件或者解决卡死问题?
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>
#include <GuiEdit.au3>
#include <array.au3>

Local $tText = DllStructCreate("wchar Text[512]") ;建个结构,用来放listview列数据
Local $GUI, $iITEM_COUNT = 10000
Local $sSomeString = ""
Local $aShowdata[0][3]


GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

$hGUI = GUICreate("ListView虚表 加载[" & $iITEM_COUNT & "]数据 复选框 原地编辑例子 By_Crossdoor", 500, 350,-1,-1)
$Button3 = GUICtrlCreateButton("修改", 180, 310, 75, 25)

$CHILDGUI2 = GUICreate("22", 500, 350, 0, 0, $WS_CHILD, -1, $hGUI)
$hListView = GUICtrlCreateListView("Item1|nSubItem1|nSubItem2", 2, 2, 494, 294, $LVS_SHOWSELALWAYS + $LVS_OWNERDATA, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 180)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 50)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 100)
GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0) ;设定数据总数


GUISetState(@SW_SHOW, $CHILDGUI2)
GUISetState(@SW_SHOW, $hGUI)

While 1
        $iMsg = GUIGetMsg()
        Switch $iMsg
                Case -3
                        ExitLoop
                Case $Button3
                        ReDim $aShowdata[$iITEM_COUNT][3]
                        $sSomeString = Random(1, 255, 1)
                        For $i = 0 To $iITEM_COUNT - 1
                                $aShowdata[$i][0] = "爷爷" & $i & "-" & $sSomeString
                                $aShowdata[$i][1] = "爸爸" & $i & "-" & $sSomeString
                                $aShowdata[$i][2] = "儿子" & $i & "-" & $sSomeString
                        Next
                        GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
                        GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
        EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $s

        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")

        Local $iIndex = DllStructGetData($tNMHDR, 'Index')
        Switch $iIDFrom
                Case $hListView
                        Switch $iCode
                                Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   请求显示数据
                                        If Not IsArray($aShowdata) Then ContinueCase
                                        If UBound($aShowdata) = 0 Then  ContinueCase
                                        $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                                        $iIndex = Int(DllStructGetData($tInfo, "Item"))
                                        $iSub = Int(DllStructGetData($tInfo, "SubItem"))
                                        DllStructSetData($tText, "Text", $aShowdata[$iIndex][$iSub]) ;列数据放入$tText结构
                                        DllStructSetData($tInfo, "Text", DllStructGetPtr($tText)) ;用$tText结构的指针来设置列数据
                                        DllStructSetData($tInfo, "TextMax", StringLen($aShowdata[$iIndex][$iSub])) ;设置列数据长度
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 楼主| 发表于 2024-9-25 23:28:31 | 显示全部楼层
本帖最后由 3131210 于 2024-9-25 23:30 编辑

卡死情况如图所示,可以复现




本帖子中包含更多资源

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

×
发表于 2024-9-26 09:48:50 | 显示全部楼层
本帖最后由 顽固不化 于 2024-9-26 14:33 编辑

很有意思的,我用GIF工具录制,必然卡死。

不录制GIF没事,用录像,没见卡死。




本帖子中包含更多资源

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

×
 楼主| 发表于 2024-9-26 20:36:22 | 显示全部楼层
本帖最后由 3131210 于 2024-9-26 20:39 编辑
顽固不化 发表于 2024-9-26 09:48
很有意思的,我用GIF工具录制,必然卡死。

不录制GIF没事,用录像,没见卡死。

我编译成exe 放到虚拟机运行 也是调整宽度比卡死

1.卡死的过程是,点击按钮刷新表的数据,然后直接调整表头宽度或者点表头  必然卡死 (期间不要点击表里面的内容)
2.如果不想卡死  点击按钮刷新表的数据,然后点击表哥里面的内容,之后随便调整表头或者点击都不会卡死。。。


3.我看你的录像里面,点击按钮后,都点了表里面的内容,所以没卡死
发表于 2024-9-27 10:23:41 | 显示全部楼层
3131210 发表于 2024-9-26 20:36
我编译成exe 放到虚拟机运行 也是调整宽度比卡死

1.卡死的过程是,点击按钮刷新表的数据,然后直接调整表 ...

这样测试,确实卡死
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-21 16:49 , Processed in 0.094640 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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