【求助】子窗口创建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:30 编辑
卡死情况如图所示,可以复现
本帖最后由 顽固不化 于 2024-9-26 14:33 编辑
很有意思的,我用GIF工具录制,必然卡死。
不录制GIF没事,用录像,没见卡死。
本帖最后由 3131210 于 2024-9-26 20:39 编辑
顽固不化 发表于 2024-9-26 09:48
很有意思的,我用GIF工具录制,必然卡死。
不录制GIF没事,用录像,没见卡死。
我编译成exe 放到虚拟机运行 也是调整宽度比卡死
1.卡死的过程是,点击按钮刷新表的数据,然后直接调整表头宽度或者点表头必然卡死 (期间不要点击表里面的内容)
2.如果不想卡死点击按钮刷新表的数据,然后点击表哥里面的内容,之后随便调整表头或者点击都不会卡死。。。
3.我看你的录像里面,点击按钮后,都点了表里面的内容,所以没卡死
3131210 发表于 2024-9-26 20:36
我编译成exe 放到虚拟机运行 也是调整宽度比卡死
1.卡死的过程是,点击按钮刷新表的数据,然后直接调整表 ...
这样测试,确实卡死
页:
[1]