3131210 发表于 2024-9-25 23:23:14

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

本帖最后由 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") ;建个结构,用来放listview列数据
Local $GUI, $iITEM_COUNT = 10000
Local $sSomeString = ""
Local $aShowdata


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]
                        $sSomeString = Random(1, 255, 1)
                        For $i = 0 To $iITEM_COUNT - 1
                              $aShowdata[$i] = "爷爷" & $i & "-" & $sSomeString
                              $aShowdata[$i] = "爸爸" & $i & "-" & $sSomeString
                              $aShowdata[$i] = "儿子" & $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 ThenContinueCase
                                        $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

3131210 发表于 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没事,用录像,没见卡死。




3131210 发表于 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.卡死的过程是,点击按钮刷新表的数据,然后直接调整表 ...

这样测试,确实卡死
页: [1]
查看完整版本: 【求助】子窗口创建ListView控件会卡死,求助是什么问题导致