lhylm 发表于 2012-10-3 15:28:43

listview双击或右击一项内容时该项变白问题 [已解决]

本帖最后由 lhylm 于 2012-10-6 07:02 编辑

各位大侠帮帮忙!!!谢谢!!前面在论坛里看到一篇listview加载数万级数据不卡滞的源码,刚好我用的着。不过我在应用中发现一个问题:就是双击或右击一项内容时,该项就变白了,如下图:

源码附件:

kk_lee69 发表于 2012-10-3 16:14:34

回复 1# lhylm

那應該是 因為 MSGBOX 彈出.....造成後面的畫面沒有 重劃的問題
   
試看看不要用彈出 訊息的方式看看 後面 還會不會 變白

lhylm 发表于 2012-10-3 21:20:50

回复 2# kk_lee69

谢谢!不弹出msgbox窗口,没有问题!如果要msgbox弹出,如何解决???

lhylm 发表于 2012-10-3 21:21:01

回复 2# kk_lee69

谢谢!不弹出msgbox窗口,没有问题!如果要msgbox弹出,如何解决???

kk_lee69 发表于 2012-10-3 22:36:00

回复 4# lhylm
基本上我會這樣處理啦....你仔細的看範例的 程式裡面有一段是屬於 繪圖方面的消息的

那段應該有所謂的 重劃的指令......

把重劃指令 加入到你的MSGBOX 前面先重劃畫面在處理MSGBOX看看 可不可以通過

孙晓虎2011 发表于 2012-10-4 09:35:23

前来学习一下。

hzxymkb 发表于 2012-10-4 20:47:43

帮主大人好久不见了!

lhylm 发表于 2012-10-4 23:47:34

回复 7# hzxymkb

放假,闲了!来这里看看弟兄们!

006001 发表于 2012-10-5 09:17:57

有空多来学点知识,参考点源码也是非常不错的。

kk_lee69 发表于 2012-10-5 09:49:33

本帖最后由 kk_lee69 于 2012-10-5 10:14 编辑

回复 8# lhylm


    有解.....如果 非得用MSGBOX   借一下 甲壳虫 兄的範例如下:; Script Start - Add your code below here

;~ 關於虛擬列表的一份說明
;~ http://blog.vckbase.com/iwaswzq/archive/2006/07/07/21113.aspx
#cs ____________________________________
      Au3 版本: 3.3.9.0
      腳本作者: CrossDoor
      電子郵件: 382869232@qq.com
      QQ/TM: 382869232
#ce _______________腳本開始_________________
#Region ;**** 參數創建於 ACNWrapper_GUI ****
#PRE_UseX64=n
#EndRegion ;**** 參數創建於 ACNWrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <array.au3>

Global $B_DESCENDING ; 排序用陣列

Local $tText = DllStructCreate("wchar Text");建個結構,用來放listview列資料
Local $GUI, $hImage, $iITEM_COUNT = 10000
Local $sSomeString = ""
Local $aBoy[$iITEM_COUNT], $aGirl[$iITEM_COUNT]
For $i = 0 To $iITEM_COUNT - 1;初始化陣列
      $aBoy[$i] = "爺爺" & $i
      $aBoy[$i] = "爸爸" & $i
      $aBoy[$i] = "兒子" & $i
      $aGirl[$i] = "奶奶" & $i
      $aGirl[$i] = "媽媽" & $i
      $aGirl[$i] = "女兒" & $i
Next
Local $aShowdata = $aBoy

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$hGUI = GUICreate("ListView虛擬清單 載入[" & $iITEM_COUNT & "]數據", 500, 350)

$hListView = GUICtrlCreateListView("Item1|nSubItem1|nSubItem2", 2, 2, 494, 294, $LVS_SHOWSELALWAYS + $LVS_OWNERDATA, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER)

;設置列寬
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 0, 150)
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 1, 150)
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 2, 150)
GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);分配清單記憶體。 為什麼要這樣做?因為虛擬清單必須要知道資料總量

;創建並關聯圖像清單
$hImage = _GUIImageList_Create()
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 115)
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

$Button1 = GUICtrlCreateButton("男", 20, 310, 75, 25)
$Button2 = GUICtrlCreateButton("女", 100, 310, 75, 25)
$Button3 = GUICtrlCreateButton("修改", 180, 310, 75, 25)
$Button4 = GUICtrlCreateButton("清空", 260, 310, 75, 25)
GUISetState()

Local $iCol

While 1
      $iMsg = GUIGetMsg()
      Switch $iMsg
                Case -3
                              ExitLoop
                Case $Button1
                        $aShowdata = $aBoy
                        GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
                        GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
                Case $Button2
                        $aShowdata = $aGirl
                        GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
                        GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
                Case $Button3
                        If StringLen($sSomeString) Then
                              $sSomeString = ""
                        Else
                              $sSomeString = Asc(Random(48, 255, 1))
                        EndIf
                        GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
                        GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
                Case $Button4
                        $aShowdata = 0
                        $iITEM_COUNT = 0
                        GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0)
                        GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
                        GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
                Case $hListView ; 點擊列標題,排序
                        $iCol = GUICtrlGetState($hListView)
                        _ArraySort($aShowdata, $B_DESCENDING[$iCol], 0, 0, $iCol)
                        GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
                        GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
                        $B_DESCENDING[$iCol] = Not $B_DESCENDING[$iCol]
      EndSwitch
WEnd
GUIDelete()

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
      #forceref $hWnd, $iMsg, $iwParam
      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 $NM_DBLCLK ; 按兩下

;~                                    Test() ;<==在退出WM_NOTIFY之前無法讀取清單內容

                                        AdlibRegister("Test", 10) ;   <==   利用定時,先退出WM_NOTIFY再讀取則正常

                              Case - 150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177
                                        If Not IsArray($aShowdata) Then ContinueCase
                                        $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                                        $iIndex = Int(DllStructGetData($tInfo, "Item"))
                                        $iSub = Int(DllStructGetData($tInfo, "SubItem"))
                                        IF BitAND(DllStructGetData($tInfo, "Mask"), $LVIF_IMAGE) And $iSub = 0 THEN DllStructSetData($tInfo, "Image", 0);設置列圖像
                                        $s = $aShowdata[$iIndex][$iSub] & "-" & $sSomeString
                                        DllStructSetData($tText, "Text", $s);列資料放入$tText結構
                                        DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));用$tText結構的指標來設置列資料
                                        DllStructSetData($tInfo, "TextMax", StringLen($s));設置列數據長度
                        EndSwitch
      EndSwitch
      Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func Test() ; 讀取清單內容
      AdlibUnRegister("Test")
      Local $item = _GUICtrlListView_GetItemTextArray($hListView, -1) ; 讀取選擇的條目
      If $item >= 3 Then
                MsgBox(0, "", $item & "|" & $item & "|" & $item)
      EndIf
EndFunc

kk_lee69 发表于 2012-10-5 09:50:24

回复 8# lhylm


    AdlibRegister("Test", 10) ;   <==   利用定時,先退出WM_NOTIFY再讀取則正常

kk_lee69 发表于 2012-10-5 10:28:51

回复 8# lhylm

或者 方法二在
MSGBOX 之前加上

_GUICtrlListView_BeginUpdate($hWnd)

結束後再恢復

    _GUICtrlListView_EndUpdate($hWnd)

fhqbbfcu2050 发表于 2012-10-6 02:00:43

咱也看看,没遇到过不知道...

fhqbbfcu2050 发表于 2012-10-6 02:01:18

学学楼上的方法..

lhylm 发表于 2012-10-6 07:02:05

回复 12# kk_lee69

谢谢!大侠,热心回复!问题解决。
页: [1]
查看完整版本: listview双击或右击一项内容时该项变白问题 [已解决]