找回密码  加入

AUTOIT CN

搜索
楼主: 298311657

[原创] ListView虚表 复选框 原地编辑例子 By_Crossdoor(2015-11-03更新)

[复制链接]
发表于 2015-10-17 11:33:52 | 显示全部楼层
ddddddddddddddddd
发表于 2015-10-18 07:48:50 | 显示全部楼层
很有深度的话题,学习
发表于 2015-10-18 22:09:30 | 显示全部楼层
学习下,。…………。…。…。…………     非常有用………………
发表于 2015-10-19 11:19:37 | 显示全部楼层
谢谢楼主分享   学习学习
发表于 2015-10-22 22:20:51 | 显示全部楼层
回复 1# 298311657

樓主 在請教個問題 ~~~

如何抓取到 複選框 打勾的東西呢??
发表于 2015-10-22 23:24:15 | 显示全部楼层
回复 1# 298311657
在請教一下 樓主
我在 106-109行加入
_GUICtrlListView_SetItemSelected($hListView,$iIndex,True,True)
的判斷 可達到 勾選 就 Selected Item,取消勾選 就取消 Selected

但是 當我勾選 五個以後 按到 LISTVIEW  就會變成 只有ㄧ行高亮,其他的有勾選的 就 不會有高亮

如何可以達到 勾選 與 Selected  達到一致呢??
 楼主| 发表于 2015-10-22 23:53:29 | 显示全部楼层
回复 36# kk_lee69

你要清楚对于已经勾选的数据,判定它的选择状态是通过勾选框,而不是通过选中行。
我不能理解你为什么要让所有勾选的行都处于选中状态,这是没有必要的。

如果你非要这样做,那么系统自带的listview控件无法达到你的要求,你可以自己去实现一个listview控件来达成目的。
发表于 2015-10-23 00:09:14 | 显示全部楼层
本帖最后由 kk_lee69 于 2015-10-23 00:23 编辑

回复 37# 298311657

我能理解 複選框 與 選中行 是兩件事情.....

但是 我是通常是寫類似ERP 的資料庫軟件,因此 站在使用者的角度 他會希望的 就是 操作上的便利
有人希望 用勾選的  這樣不用按鍵盤
有人覺得 可以 按 CTRL +加滑鼠 取選中

但是 對於 程式設計者來說  我只是想提供兩種方式 讓大家都滿意,但是 不會希望 兩種方式不同步
因為這樣我後續的程式 必須要寫兩套判斷

簡單的說 LISTVIEW 不透過 複選框 當然也可以複選,所以 在我的角度看來....複選框的目的 只是為了提供 使用者 多一種 勾選的方式風格而以.........所以會希望同步

所以才想說 能不能達到這個.........

很感謝樓主提供這麼好的 範例....... LISTVIEW 編輯 或者 把LISTVIEW 內容按滑鼠右鍵 複製 貼上 外加 可以讓LISTVIEW 變顏色 等等的........這些我現在都已經OK 了......

您的 LISTVIEW 幫助我很大的~~~~ 再次感謝!!
发表于 2015-10-23 00:19:22 | 显示全部楼层
回复 37# 298311657

對了 樓主 您提到.........我不能理解你为什么要让所有勾选的行都处于选中状态,这是没有必要的。

原因有二
1. 複選框勾選了  後面 跟著高亮 這樣是不是選了幾筆 都很清楚 ㄧ目暸然
2. 複選框選了3筆資料...... 結果 USER 點擊了一筆資料高亮 ......那這樣是算三筆資料 還是一筆資料,在使用者的角度 可能會產生錯亂

因此 這邊又 產生了 另外個一個問題 請教 樓主:

能夠讓 滑鼠 點擊到 其中某一筆資料的時候 不高亮嗎?? 連INDEX 都不要高亮?? 如果這樣 搭配 複選框,這樣也是一個解決方法.....
 楼主| 发表于 2015-10-23 00:25:49 | 显示全部楼层
回复 35# kk_lee69


  1. #cs ____________________________________
  2.         Au3 版本: 3.3.14.2
  3.         脚本作者: CrossDoor
  4.         电子邮件: [email]382869232@qq.com[/email]
  5.         QQ/TM: 382869232
  6. #ce _______________脚本开始_________________
  7. #PRE_UseX64=n
  8. #include <GUIConstantsEx.au3>
  9. #include <GuiListView.au3>
  10. #include <GuiImageList.au3>
  11. #include <WindowsConstants.au3>
  12. #include <WinAPISys.au3>
  13. #include <WinAPI.au3>
  14. #include <GuiEdit.au3>
  15. #include <array.au3>

  16. Global $B_DESCENDING[3] ; 排序用数组

  17. Global $hEdit, $Item = -1, $SubItem = 0
  18. Local $ichked = 0;勾选的行数
  19. Local $tText = DllStructCreate("wchar Text[256]");建个结构,用来放listview列数据
  20. Local $GUI, $hImage
  21. Local $iITEM_COUNT = 94304, $aShowdata[$iITEM_COUNT][4];注意数组最大项目数为2^24(16777216),所以$iITEM_COUNT = 4194304为二维数组$aShowdata最大行数
  22. Local $sSomeString = ""

  23. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
  24. GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
  25. $hGUI = GUICreate("ListView虚表 加载[" & $iITEM_COUNT & "]数据 复选框 原地编辑例子 By_Crossdoor", 500, 350)

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

  27. ;设置列宽
  28. GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 0, 150)
  29. GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 1, 150)
  30. GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 2, 150)
  31. GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);设定数据总数

  32. ;===========创建并关联图像列表
  33. $hImage = _GUIImageList_Create()
  34. _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 110)
  35. _GUICtrlListView_SetImageList($hListView, $hImage, 1);分配图像列表到列表视图控件

  36. $Button1 = GUICtrlCreateButton("选中行", 20, 310, 75, 25)
  37. $Button2 = GUICtrlCreateButton("未选行", 100, 310, 75, 25)
  38. $Button3 = GUICtrlCreateButton("修改", 180, 310, 75, 25)
  39. $Button4 = GUICtrlCreateButton("清空", 260, 310, 75, 25)
  40. GUISetState()

  41. ;==================在窗体显示后再初始化数据,因为初始化数组数据比较慢
  42. ;如果先初始化数组后显示窗口,会卡很久,就造成虚表也很慢的假象
  43. For $i = 0 To $iITEM_COUNT - 1
  44.         ;重绘 刷新 listview 0-13行(让ListView显示数组数据),不用太多行,只需要一屏的行数就可以
  45.         ;因为下拉滚动的时候listview会收到LVN_GETDISPINFO消息,这个消息我们在WM_NOTIFY内处理过了
  46.         If $i = 18 Then GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, $i)
  47.        
  48.         $aShowdata[$i][0] = "爷爷" & $i
  49.         $aShowdata[$i][1] = "爸爸" & $i
  50.         $aShowdata[$i][2] = "儿子" & $i
  51.         $aShowdata[$i][3] = 4096;复选框状态 4096未选中 8192选中
  52. Next

  53. While 1
  54.         $iMsg = GUIGetMsg()
  55.         Switch $iMsg
  56.                 Case -3
  57.                         ExitLoop
  58.                 Case $Button1
  59.                         $a = _GetChkIndex(8192)
  60.                         If $a[0] = -1 Then
  61.                                 MsgBox(32, "提示", "未勾选任何数据。")
  62.                         Else
  63.                                 _ArrayDisplay($a, "勾选行的索引");数组很大时,_ArrayDisplay会非常耗时
  64.                         EndIf
  65.                 Case $Button2
  66.                         $a = _GetChkIndex(4096)
  67.                         If $a[0] = -1 Then
  68.                                 MsgBox(32, "提示", "数据全都被勾选了。")
  69.                         Else
  70.                                 ;MsgBox(32, "提示", "未勾选的数据有" & UBound($a) & "行")
  71.                                 _ArrayDisplay($a, "未勾选行的索引");数组很大时,_ArrayDisplay会非常耗时
  72.                         EndIf
  73.                 Case $Button3
  74.                         If StringLen($sSomeString) Then
  75.                                 $sSomeString = ""
  76.                         Else
  77.                                 $sSomeString = Asc(Random(48, 255, 1))
  78.                         EndIf
  79.                         For $i = 0 To $iITEM_COUNT - 1
  80.                                 $aShowdata[$i][0] = "爷爷" & $i & "-" & $sSomeString
  81.                                 $aShowdata[$i][1] = "爸爸" & $i & "-" & $sSomeString
  82.                                 $aShowdata[$i][2] = "儿子" & $i & "-" & $sSomeString
  83.                         Next
  84.                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  85.                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  86.                 Case $Button4
  87.                         $aShowdata = 0
  88.                         $iITEM_COUNT = 0
  89.                         GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0)
  90.                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  91.                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  92.         EndSwitch
  93. WEnd
  94. GUIDelete()

  95. Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  96.         #forceref $hWnd, $iMsg, $iwParam
  97.         Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $s

  98.         $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  99.         $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  100.         $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  101.         $iCode = DllStructGetData($tNMHDR, "Code")
  102.         Local $iIndex = DllStructGetData($tNMHDR, 'Index')
  103.         Switch $iIDFrom
  104.                 Case $hListView
  105.                         Switch $iCode
  106.                                 Case $LVN_COLUMNCLICK ; 点击列头排序
  107.                                         $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
  108.                                         $iSub = DllStructGetData($tInfo, "SubItem")
  109.                                         _ArraySort($aShowdata, $B_DESCENDING[$iSub], 0, 0, $iSub)
  110.                                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  111.                                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  112.                                         $B_DESCENDING[$iSub] = Not $B_DESCENDING[$iSub]

  113.                                 Case $NM_CLICK;单击
  114.                                         $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  115.                                         $iIndex = DllStructGetData($tInfo, "Index")
  116.                                         $x = DllStructGetData($tInfo, "X")

  117.                                         If ($x < 16) And (3 < $x) And (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then;使用点击的x坐标来判断是否在复选框上点击
  118.                                                 If $aShowdata[$iIndex][3] = 4096 Then
  119.                                                         $ichked+=1
  120.                                                         $aShowdata[$iIndex][3] = 8192;4096未选中 8192选中
  121.                                                 Else
  122.                                                         $ichked-=1
  123.                                                         $aShowdata[$iIndex][3] = 4096;4096未选中 8192选中
  124.                                                 EndIf
  125.                                                 $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
  126.                                                 DllStructSetData($tInfo, "State", $aShowdata[$iIndex][3]);设置复选框状态
  127.                                                 ;====立刻刷新复选框显示状态 重绘$iIndex-1到$iIndex+20的项
  128.                                                 GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, $iIndex - 1, $iIndex + 20)
  129.                                         EndIf
  130.                                 Case $NM_DBLCLK ; 双击
  131.                                         $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  132.                                         $iIndex = DllStructGetData($tInfo, "Index")
  133.                                         $iSub = DllStructGetData($tInfo, "SubItem")
  134.                                         $x = DllStructGetData($tInfo, "X")
  135.                                         If ($iIndex <> -1) And ($iSub >= 0) And ($x > 16) Then;点击的x>16才响应原地编辑
  136.                                                 $Item = $iIndex
  137.                                                 $SubItem = $iSub
  138.                                                 ;==========计算编辑框坐标
  139.                                                 Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSub)
  140.                                                 Local $iEdit_X = $aRect[0] + 4
  141.                                                 Local $iEdit_Y = $aRect[1] + 3
  142.                                                 Local $iEdit_Width = _GUICtrlListView_GetColumnWidth($hListView, $iSub) + 3
  143.                                                 Local $iEdit_Height = $aRect[3] - $aRect[1] + 3
  144.                                                 If $iSub = 0 Then
  145.                                                         Local $i1 = 0, $i2 = 0
  146.                                                         If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then $i1 = 18;判断是否有复选框
  147.                                                         If _GUICtrlListView_GetImageList($hListView, 1) Then $i2 = 20;判断是否有分配图像列表到列表视图控件
  148.                                                         $iEdit_X += ($i2 + $i1)
  149.                                                         $iEdit_Width -= ($i2 + $i1)
  150.                                                 EndIf
  151.                                                 $hEdit = GUICtrlCreateInput($aShowdata[$iIndex][$iSub], $iEdit_X, $iEdit_Y, $iEdit_Width, $iEdit_Height, BitOR($WS_CHILD, $WS_VISIBLE, $ES_LEFT))
  152.                                                 GUICtrlSetFont($hEdit, 12)
  153.                                                 GUICtrlSetState($hEdit, $GUI_FOCUS)
  154.                                                 $hEdit = GUICtrlGetHandle($hEdit)
  155.                                                 Send("{RIGHT}") ;方向 →
  156. ;~                                                 _GUICtrlEdit_SetSel($hEdit, 0, -1) ;全选编辑框文字
  157.                                                 HotKeySet("{ENTER}", "_EndItemEdit");设置热键响应回车
  158.                                         EndIf

  159.                                 Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   请求显示数据
  160.                                         If Not IsArray($aShowdata) Then ContinueCase
  161.                                         $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
  162.                                         $iIndex = Int(DllStructGetData($tInfo, "Item"))
  163.                                         $iSub = Int(DllStructGetData($tInfo, "SubItem"))

  164.                                         If BitAND(DllStructGetData($tInfo, "Mask"), $LVIF_IMAGE) And $iSub = 0 Then DllStructSetData($tInfo, "Image", 0);判断是否有LVIF_IMAGE属性,有则设置列图像。不设置_GUICtrlListView_SetImageList则无

  165.                                         If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then
  166.                                                 ;===============设置复选框信息
  167.                                                 DllStructSetData($tInfo, "Mask", BitOR($LVIF_STATE, DllStructGetData($tInfo, "Mask")))
  168.                                                 DllStructSetData($tInfo, "StateMask", $LVIS_STATEIMAGEMASK)
  169.                                                 DllStructSetData($tInfo, "State", $aShowdata[$iIndex][3])
  170.                                         EndIf

  171.                                         DllStructSetData($tText, "Text", $aShowdata[$iIndex][$iSub]);列数据放入$tText结构
  172.                                         DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));用$tText结构的指针来设置列数据
  173.                                         DllStructSetData($tInfo, "TextMax", StringLen($aShowdata[$iIndex][$iSub]));设置列数据长度
  174.                         EndSwitch
  175.         EndSwitch
  176.         Return $GUI_RUNDEFMSG
  177. EndFunc   ;==>WM_NOTIFY

  178. Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
  179.         $iIDFrom = _WinAPI_LoWord($wParam)
  180.         $iCode = _WinAPI_HiWord($wParam)
  181.         Switch $lParam
  182.                 Case $hEdit
  183.                         Switch $iCode
  184.                                 Case $EN_KILLFOCUS
  185.                                         _EndItemEdit()
  186.                                 Case $EN_UPDATE

  187.                         EndSwitch
  188.         EndSwitch
  189.         Return $GUI_RUNDEFMSG
  190. EndFunc   ;==>WM_COMMAND

  191. Func _EndItemEdit()
  192.         If ($Item < UBound($aShowdata, 1)) And ($SubItem < UBound($aShowdata, 2)) Then
  193.                 Local $sText = _GUICtrlEdit_GetText($hEdit)
  194.                 _GUICtrlListView_SetItemText($hListView, $Item, $sText, $SubItem)
  195.                 _WinAPI_DestroyWindow($hEdit)
  196.                 If ($Item >= 0) Then
  197.                         $aShowdata[$Item][$SubItem] = $sText
  198.                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  199.                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  200.                 EndIf
  201.                 $Item = -1
  202.                 $SubItem = 0
  203.                 HotKeySet("{ENTER}");取消回车热键
  204.         EndIf
  205. EndFunc   ;==>_EndItemEdit

  206. Func _GetChkIndex($iChkState)
  207.         Local $aIndex[1] = [-1], $j = 0
  208.         If $ichked = 0 Then Return $aIndex
  209.         If $iChkState = 8192 Then
  210.                 ReDim $aIndex[$ichked]
  211.         Else
  212.                 ReDim $aIndex[UBound($aShowdata)-$ichked]
  213.         EndIf
  214.         For $i = 0 To UBound($aShowdata) -1
  215.                 If $aShowdata[$i][3] == $iChkState Then
  216.                         $aIndex[$j] = $i
  217.                         $j+=1
  218.                 EndIf
  219.         Next
  220.         Return $aIndex
  221. EndFunc

复制代码
 楼主| 发表于 2015-10-24 23:07:24 | 显示全部楼层
本帖最后由 298311657 于 2015-10-24 23:41 编辑

回复 39# kk_lee69

估计你想要的是这种效果,对于选中行进行醒目处理


  1. #cs ______________________
  2.         Au3 版本: 3.3.14.2
  3.         脚本作?? CrossDoor
  4.         电子邮件: [email]382869232@qq.com[/email]
  5.         QQ/TM: 382869232
  6. #ce _______________脚本开始_________________
  7. #PRE_UseX64=n
  8. #include <WindowsConstants.au3>
  9. #include <GUIConstantsEx.au3>
  10. #include <GuiImageList.au3>
  11. #include <WinAPITheme.au3>
  12. #include <GuiListView.au3>
  13. #include <WinAPISys.au3>
  14. #include <WinAPI.au3>
  15. #include <GuiEdit.au3>
  16. #include <array.au3>
  17. #include <Misc.au3>

  18. Global $B_DESCENDING[3] ; 排序用数组

  19. Global $bCtrlDown = False;listview控件ctrl键按下标识
  20. Global $hEdit, $Item = -1, $SubItem = 0

  21. Local $hUser32 = DllOpen("user32.dll")
  22. Local $ichked = 0;勾选的行数
  23. Local $tText = DllStructCreate("wchar Text[256]");建个结构,用来放listview列数据
  24. Local $GUI, $hImage
  25. Local $iITEM_COUNT = 94304, $aShowdata[$iITEM_COUNT][4];注意数组最大项目数为2^24(16777216),所以$iITEM_COUNT = 4194304为二维数组$aShowdata最大行数
  26. Local $sSomeString = ""

  27. GUIRegisterMsg($WM_KEYDOWN, "WM_KEYDOWN")
  28. GUIRegisterMsg($WM_KEYUP, "WM_KEYUP")
  29. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
  30. GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
  31. $hGUI = GUICreate("ListView虚表 加载[" & $iITEM_COUNT & "]数据 复选框 原地编辑例子 By_Crossdoor", 500, 350)

  32. $hListView = GUICtrlCreateListView("Item1|nSubItem1|nSubItem2", 2, 2, 494, 296, BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS, $LVS_OWNERDATA), $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER + $LVS_EX_CHECKBOXES)
  33. ;~ _WinAPI_SetWindowTheme(GUICtrlGetHandle($hListView), 'Explorer');设置主题

  34. ;设置列宽
  35. GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 0, 150)
  36. GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 1, 150)
  37. GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 2, 150)
  38. GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);设定数据总数

  39. ;===========创建并关联图像列表
  40. $hImage = _GUIImageList_Create()
  41. _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 110)
  42. _GUICtrlListView_SetImageList($hListView, $hImage, 1);分配图像列表到列表视图控件

  43. $Button1 = GUICtrlCreateButton("选中行", 20, 310, 75, 25)
  44. $Button2 = GUICtrlCreateButton("未选行", 100, 310, 75, 25)
  45. $Button3 = GUICtrlCreateButton("修改", 180, 310, 75, 25)
  46. $Button4 = GUICtrlCreateButton("清空", 260, 310, 75, 25)
  47. GUISetState()

  48. ;==================在窗体显示后再初始化数据,因为初始化数组数据比较慢
  49. ;如果先初始化数组后显示窗口,会卡很久,就造成虚表也很慢的假象
  50. For $i = 0 To $iITEM_COUNT - 1
  51.         ;重绘 刷新 listview 0-13行(让ListView显示数组数?),不用太多行,只需要一屏的行数就就可以
  52.         ;因为下拉滚动的时候listview会收到LVN_GETDISPINFO消息,这个消息我们在WM_NOTIFY内处理过了
  53.         If $i = 18 Then GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, $i)
  54.        
  55.         $aShowdata[$i][0] = "爷爷" & $i
  56.         $aShowdata[$i][1] = "爸爸" & $i
  57.         $aShowdata[$i][2] = "儿子" & $i
  58.         $aShowdata[$i][3] = 4096;复选框状??4096未选中 8192选中
  59. Next

  60. While 1
  61.         $bCtrlDown = _IsPressed("11", $hUser32);取ctrl按键的状态
  62.         Switch GUIGetMsg()
  63.                 Case -3
  64.                         ExitLoop
  65.                 Case $Button1
  66.                         $a = _GetChkIndex(8192)
  67.                         If $a[0] = -1 Then
  68.                                 MsgBox(32, "提示", "未勾选任何数据")
  69.                         Else
  70.                                 _ArrayDisplay($a, "勾选行的索引");数组很大时,_ArrayDisplay会非常耗时
  71.                         EndIf
  72.                 Case $Button2
  73.                         $a = _GetChkIndex(4096)
  74.                         If $a[0] = -1 Then
  75.                                  MsgBox(32, "提示", "数据全都被勾选了。")
  76.                         Else
  77.                                 ;MsgBox(32, "提示", "未勾选的数据有" & UBound($a) & "行")
  78.                                 _ArrayDisplay($a, "未勾选行的索");数组很大时,_ArrayDisplay会非常耗时
  79.                         EndIf
  80.                 Case $Button3
  81.                         If StringLen($sSomeString) Then
  82.                                 $sSomeString = ""
  83.                         Else
  84.                                 $sSomeString = Asc(Random(48, 255, 1))
  85.                         EndIf
  86.                         For $i = 0 To $iITEM_COUNT - 1
  87.                                 $aShowdata[$i][0] = "爷爷" & $i & "-" & $sSomeString
  88.                                 $aShowdata[$i][1] = "爸爸" & $i & "-" & $sSomeString
  89.                                 $aShowdata[$i][2] = "儿子" & $i & "-" & $sSomeString
  90.                         Next
  91.                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  92.                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  93.                 Case $Button4
  94.                         $aShowdata = 0
  95.                         $iITEM_COUNT = 0
  96.                         GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0)
  97.                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  98.                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  99.         EndSwitch
  100. WEnd
  101. GUIDelete()
  102. DllClose($hUser32)

  103. Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  104.         #forceref $hWnd, $iMsg, $iwParam
  105.         Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $s

  106.         $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  107.         $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  108.         $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  109.         $iCode = DllStructGetData($tNMHDR, "Code")
  110.         Local $iIndex = DllStructGetData($tNMHDR, 'Index')
  111.         Switch $iIDFrom
  112.                 Case $hListView
  113.                         Switch $iCode
  114.                                 Case $LVN_COLUMNCLICK ; 点击列头排序
  115.                                         $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
  116.                                         $iSub = DllStructGetData($tInfo, "SubItem")
  117.                                         _ArraySort($aShowdata, $B_DESCENDING[$iSub], 0, 0, $iSub)
  118.                                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  119.                                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  120.                                         $B_DESCENDING[$iSub] = Not $B_DESCENDING[$iSub]
  121.                                 Case $NM_CUSTOMDRAW;自绘消息  处理选中行背景色
  122.                                         Local $tCustDraw = DllStructCreate('hwnd hwndFrom;int idFrom;int code;dword DrawStage;hwnd hdc;long rect[4];dword ItemSpec;int ItemState;dword Itemlparam;dword clrText;dword clrTextBk;int SubItem; dword ItemType;dword clrFace;int IconEffect;int IconPhase;int PartID;int StateID;long rectText[4];int Align', $ilParam)
  123.                                         Local $iDrawStage, $iIndex
  124.                                         $iDrawStage = DllStructGetData($tCustDraw, 'DrawStage')
  125.                                         If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW ;request custom drawing of items
  126.                                         If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW ;request drawing each cell separately
  127.                                         If Not BitAND($iDrawStage, $CDDS_SUBITEM) Then Return $CDRF_DODEFAULT
  128.                                         $iIndex = DllStructGetData($tCustDraw, 'ItemSpec')
  129.                                         If $aShowdata[$iIndex][3] = 4096 Then
  130.                                                 DllStructSetData($tCustDraw, 'clrTextBk', 0xFFFFFF);BGR格式颜色值
  131.                                         Else
  132.                                                 DllStructSetData($tCustDraw, 'clrTextBk', 0xF7D3AD);BGR格式颜色值
  133.                                         EndIf
  134.                                         Return $CDRF_NEWFONT
  135.                                 Case $LVN_ITEMCHANGED ; An item has changed
  136.                                         If $bCtrlDown Then;ctrl键按下
  137.                                                 $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
  138.                                                 Local $iIndex = DllStructGetData($tInfo, "Item")
  139.                                                 Local $iNewState = DllStructGetData($tInfo, "NewState")
  140.                                                 If $iIndex > -1 And $iNewState = BitOR($LVIS_FOCUSED, $LVIS_SELECTED) Then
  141.                                                         If $aShowdata[$iIndex][3] = 4096 Then
  142.                                                                 $ichked+=1
  143.                                                                 $aShowdata[$iIndex][3] = 8192;4096未选中 8192选中
  144.                                                         Else
  145.                                                                 $ichked-=1
  146.                                                                 $aShowdata[$iIndex][3] = 4096;4096未选中 8192选中
  147.                                                         EndIf
  148.                                                         $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
  149.                                                         DllStructSetData($tInfo, "State", $aShowdata[$iIndex][3]);设置复选框状态
  150.                                                         ;====立刻刷新复选框显示状态 重绘$iIndex-1??iIndex+20的项
  151.                                                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, $iIndex - 1, $iIndex + 20)
  152.                                                 EndIf
  153.                                         EndIf
  154.                                 Case $NM_CLICK;单击
  155.                                         $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  156.                                         $iIndex = DllStructGetData($tInfo, "Index")
  157.                                         $x = DllStructGetData($tInfo, "X")
  158.                                         If ($x < 16) And (3 < $x) And (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then;使用点击的x坐标来判断是否在复选框上点击
  159.                                                 If $aShowdata[$iIndex][3] = 4096 Then
  160.                                                         $ichked+=1
  161.                                                         $aShowdata[$iIndex][3] = 8192;4096未选中 8192选中
  162.                                                 Else
  163.                                                         $ichked-=1
  164.                                                         $aShowdata[$iIndex][3] = 4096;4096未选中 8192选中
  165.                                                 EndIf
  166.                                                 $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
  167.                                                 DllStructSetData($tInfo, "State", $aShowdata[$iIndex][3]);设置复选框状态
  168.                                                 ;====立刻刷新复选框显示状态 重绘$iIndex-1??iIndex+20的项
  169.                                                 GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, $iIndex - 1, $iIndex + 20)
  170.                                         EndIf
  171.                                 Case $NM_DBLCLK ; 双击
  172.                                         $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  173.                                         $iIndex = DllStructGetData($tInfo, "Index")
  174.                                         $iSub = DllStructGetData($tInfo, "SubItem")
  175.                                         $x = DllStructGetData($tInfo, "X")
  176.                                         If ($iIndex <> -1) And ($iSub >= 0) And ($x > 16) Then;点击的x>16才响应原地编辑
  177.                                                 $Item = $iIndex
  178.                                                 $SubItem = $iSub
  179.                                                 ;==========计算编辑框坐??
  180.                                                 Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSub)
  181.                                                 Local $iEdit_X = $aRect[0] + 4
  182.                                                 Local $iEdit_Y = $aRect[1] + 3
  183.                                                 Local $iEdit_Width = _GUICtrlListView_GetColumnWidth($hListView, $iSub) + 3
  184.                                                 Local $iEdit_Height = $aRect[3] - $aRect[1] + 3
  185.                                                 If $iSub = 0 Then
  186.                                                         Local $i1 = 0, $i2 = 0
  187.                                                         If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then $i1 = 18;判断是否有复选框
  188.                                                         If _GUICtrlListView_GetImageList($hListView, 1) Then $i2 = 20;判断是否有分配图像列表到列表视图控件
  189.                                                         $iEdit_X += ($i2 + $i1)
  190.                                                         $iEdit_Width -= ($i2 + $i1)
  191.                                                 EndIf
  192.                                                 $hEdit = GUICtrlCreateInput($aShowdata[$iIndex][$iSub], $iEdit_X, $iEdit_Y, $iEdit_Width, $iEdit_Height, BitOR($WS_CHILD, $WS_VISIBLE, $ES_LEFT))
  193.                                                 GUICtrlSetFont($hEdit, 12)
  194.                                                 GUICtrlSetState($hEdit, $GUI_FOCUS)
  195.                                                 $hEdit = GUICtrlGetHandle($hEdit)
  196.                                                 Send("{RIGHT}") ;方向右键
  197. ;~                                                 _GUICtrlEdit_SetSel($hEdit, 0, -1) ;全选编辑框文字
  198.                                                 HotKeySet("{ENTER}", "_EndItemEdit");设置热键响应回车
  199.                                         EndIf

  200.                                 Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   请求显示数据
  201.                                         If Not IsArray($aShowdata) Then ContinueCase
  202.                                         $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
  203.                                         $iIndex = Int(DllStructGetData($tInfo, "Item"))
  204.                                         $iSub = Int(DllStructGetData($tInfo, "SubItem"))

  205.                                         If BitAND(DllStructGetData($tInfo, "Mask"), $LVIF_IMAGE) And $iSub = 0 Then DllStructSetData($tInfo, "Image", 0);判断是否有LVIF_IMAGE属性,有则设置列图像。不设置_GUICtrlListView_SetImageList则无

  206.                                         If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then
  207.                                                 ;===============设置复选框信息
  208.                                                 DllStructSetData($tInfo, "Mask", BitOR($LVIF_STATE, DllStructGetData($tInfo, "Mask")))
  209.                                                 DllStructSetData($tInfo, "StateMask", $LVIS_STATEIMAGEMASK)
  210.                                                 DllStructSetData($tInfo, "State", $aShowdata[$iIndex][3])
  211.                                         EndIf

  212.                                         DllStructSetData($tText, "Text", $aShowdata[$iIndex][$iSub]);列数据放入$tText结构
  213.                                         DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));$tText结构的指针来设置列数据
  214.                                         DllStructSetData($tInfo, "TextMax", StringLen($aShowdata[$iIndex][$iSub]));设置列数据字串长
  215.                         EndSwitch
  216.         EndSwitch
  217.         Return $GUI_RUNDEFMSG
  218. EndFunc   ;==>WM_NOTIFY


  219. Func WM_KEYDOWN($hWnd, $iMsg, $wParam, $lParam)
  220.         If $wParam = 27 Then $bCtrlDown = True
  221.     Return $GUI_RUNDEFMSG
  222. EndFunc   ;==>WM_KEYDOWN

  223. Func WM_KEYUP($hWnd, $iMsg, $wParam, $lParam)
  224.         If $wParam = 27 Then $bCtrlDown = False
  225.     Return $GUI_RUNDEFMSG
  226. EndFunc   ;==>WM_KEYUP

  227. Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
  228.         $iIDFrom = _WinAPI_LoWord($wParam)
  229.         $iCode = _WinAPI_HiWord($wParam)
  230.         Switch $lParam
  231.                 Case $hEdit
  232.                         Switch $iCode
  233.                                 Case $EN_KILLFOCUS
  234.                                         _EndItemEdit()
  235.                                 Case $EN_UPDATE

  236.                         EndSwitch
  237.         EndSwitch
  238.         Return $GUI_RUNDEFMSG
  239. EndFunc   ;==>WM_COMMAND

  240. Func _EndItemEdit()
  241.         If ($Item < UBound($aShowdata, 1)) And ($SubItem < UBound($aShowdata, 2)) Then
  242.                 Local $sText = _GUICtrlEdit_GetText($hEdit)
  243.                 _GUICtrlListView_SetItemText($hListView, $Item, $sText, $SubItem)
  244.                 _WinAPI_DestroyWindow($hEdit)
  245.                 If ($Item >= 0) Then
  246.                         $aShowdata[$Item][$SubItem] = $sText
  247.                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  248.                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  249.                 EndIf
  250.                 $Item = -1
  251.                 $SubItem = 0
  252.                 HotKeySet("{ENTER}");取消回车热键
  253.         EndIf
  254. EndFunc   ;==>_EndItemEdit

  255. Func _GetChkIndex($iChkState)
  256.         Local $aIndex[1] = [-1], $j = 0
  257.         If $ichked = 0 Then Return $aIndex
  258.         If $iChkState = 8192 Then
  259.                 ReDim $aIndex[$ichked]
  260.         Else
  261.                 ReDim $aIndex[UBound($aShowdata)-$ichked]
  262.         EndIf
  263.         For $i = 0 To UBound($aShowdata) -1
  264.                 If $aShowdata[$i][3] == $iChkState Then
  265.                         $aIndex[$j] = $i
  266.                         $j+=1
  267.                 EndIf
  268.         Next
  269.         Return $aIndex
  270. EndFunc

复制代码

本帖子中包含更多资源

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

x
发表于 2015-10-25 02:18:19 | 显示全部楼层
本帖最后由 kk_lee69 于 2015-10-25 02:40 编辑

回复 41# 298311657

感谢!! 楼主的回复  太感动了!! 还为了我的 又写了一段范例给我
可能是两岸的关系,所以有些语词表示 大家可能会误解意思 跟不容易了解
您的案例其实是我想要的ㄧ半而已.........

您的这个案例 也是我最近ㄧ直苦恼的问题......引发了自行定义颜色的问题
不知道是否方便看一下
我的ㄧ个发问 http://www.autoitx.com/thread-50282-1-1.html
您上面的案例 我测试也会有ㄧ样的情况 就是您的 上色是以
  1.    If $aShowdata[$iIndex][3] = 4096 Then
  2.         DllStructSetData($tCustDraw, 'clrTextBk', 0xFFFFFF);BGR格式颜色值
  3.     Else
  4.         DllStructSetData($tCustDraw, 'clrTextBk', 0xF7D3AD);BGR格式颜色值
  5.     EndIf
复制代码

当我直接改变 $aShowdata[$iIndex][3] 的值,程序并不会马上改变 也必须要缩小放大 颜色才会是对的
如何 能做到 改变了 数组的值 颜色就会跟着改呢??

至于前面的问题用 图片表示 可能会清楚点








至于 这些图片怎么来的  小弟 有测试出来一个解决的方法.......兹附上 小弟修改后的代码  
  1. #cs ____________________________________
  2.         Au3 版本: 3.3.14.2
  3.         脚本作者: CrossDoor
  4.         电子邮件: [email]382869232@qq.com[/email]
  5.         QQ/TM: 382869232
  6. #ce _______________脚本开始_________________
  7. #PRE_UseX64=n
  8. #include <GUIConstantsEx.au3>
  9. #include <GuiListView.au3>
  10. #include <GuiImageList.au3>
  11. #include <WindowsConstants.au3>
  12. #include <WinAPISys.au3>
  13. #include <GuiEdit.au3>
  14. #include <array.au3>

  15. Global $hEditCheck=0

  16. Global $B_DESCENDING[3] ; 排序用数组

  17. Global $hEdit, $Item = -1, $SubItem = 0

  18. Local $tText = DllStructCreate("wchar Text[256]");建个结构,用来放listview列数据
  19. Local $GUI, $hImage
  20. ;Local $iITEM_COUNT = 4194304, $aShowdata[$iITEM_COUNT][4];注意数组最大项目数为2^24(16777216),所以此处$iITEM_COUNT = 4194304为二维数组$aShowdata最大行数
  21. Local $iITEM_COUNT = 1304, $aShowdata[$iITEM_COUNT][4];注意数组最大项目数为2^24(16777216),所以此处$iITEM_COUNT = 4194304为二维数组$aShowdata最大行数
  22. Local $sSomeString = ""

  23. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
  24. GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
  25. $hGUI = GUICreate("ListView虚表 加载[" & $iITEM_COUNT & "]数据 复选框 原地编辑例子 By_Crossdoor", 500, 350)

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

  27. ;设置列宽
  28. GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 0, 150)
  29. GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 1, 150)
  30. GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 2, 150)
  31. GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);设定数据总数

  32. ;===========创建并关联图像列表
  33. $hImage = _GUIImageList_Create()
  34. _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 110)
  35. _GUICtrlListView_SetImageList($hListView, $hImage, 1);分配图像列表到列表视图控件

  36. $Button3 = GUICtrlCreateButton("修改", 180, 310, 75, 25)
  37. $Button4 = GUICtrlCreateButton("清空", 260, 310, 75, 25)
  38. GUISetState()

  39. ;==================在窗体显示后再初始化资料,因为初始化数组数据比较慢
  40. ;如果先初始化数组后显示窗口,会卡很久,就造成虚表也很慢的假像
  41. For $i = 0 To $iITEM_COUNT - 1
  42.         ;重绘 刷新 listview 0-13行(让ListView显示数组数据),不用太多行,只需要一屏的行数就可以
  43.         ;因为下拉滚动的时候listview会收到LVN_GETDISPINFO消息,这个消息我们在WM_NOTIFY内处理过了
  44.         If $i = 13 Then GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, $i)
  45.         
  46.         $aShowdata[$i][0] = "爷爷" & $i
  47.         $aShowdata[$i][1] = "爸爸" & $i
  48.         $aShowdata[$i][2] = "儿子" & $i
  49.         $aShowdata[$i][3] = 4096;复选框状态 4096未选中 8192选中
  50. Next

  51. While 1
  52.         $iMsg = GUIGetMsg()
  53.         Switch $iMsg
  54.                 Case -3
  55.                         ExitLoop
  56.                 Case $Button3
  57.                         If StringLen($sSomeString) Then
  58.                                 $sSomeString = ""
  59.                         Else
  60.                                 $sSomeString = Asc(Random(48, 255, 1))
  61.                         EndIf
  62.                         For $i = 0 To $iITEM_COUNT - 1
  63.                                 $aShowdata[$i][0] = "爷爷" & $i & "-" & $sSomeString
  64.                                 $aShowdata[$i][1] = "爸爸" & $i & "-" & $sSomeString
  65.                                 $aShowdata[$i][2] = "儿子" & $i & "-" & $sSomeString
  66.                         Next
  67.                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  68.                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  69.                                 Case $Button4
  70.                                                 _ArrayDisplay($aShowdata)
  71.                        ; $aShowdata = 0
  72.                        ; $iITEM_COUNT = 0
  73.                         ;GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0)
  74.                         ;GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  75.                         ;GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  76.         EndSwitch
  77. WEnd
  78. GUIDelete()

  79. Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  80.         #forceref $hWnd, $iMsg, $iwParam
  81.         Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $s

  82.         $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  83.         $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  84.         $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  85.         $iCode = DllStructGetData($tNMHDR, "Code")
  86.         Local $iIndex = DllStructGetData($tNMHDR, 'Index')
  87.         Switch $iIDFrom
  88.                 Case $hListView
  89.                         Switch $iCode
  90.                                 Case $LVN_COLUMNCLICK ; 点击列头排序
  91.                                         $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
  92.                                         $iSub = DllStructGetData($tInfo, "SubItem")
  93.                                         _ArraySort($aShowdata, $B_DESCENDING[$iSub], 0, 0, $iSub)
  94.                                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  95.                                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  96.                                         $B_DESCENDING[$iSub] = Not $B_DESCENDING[$iSub]

  97.                                 Case $NM_CLICK;单击
  98.                                         $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  99.                                         $iIndex = DllStructGetData($tInfo, "Index")
  100.                                         $x = DllStructGetData($tInfo, "X")

  101.                                         If ($x < 16) And (3 < $x) And (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then;使用x坐标来判断是否在复选框上点击
  102.                                                 If $aShowdata[$iIndex][3] = 4096 Then
  103.                                                         $aShowdata[$iIndex][3] = 8192;4096未选中 8192选中
  104.                                                                                                                 _GUICtrlListView_SetItemSelected($hListView,$iIndex,True,True)

  105.                                                 Else
  106.                                                         $aShowdata[$iIndex][3] = 4096;4096未选中 8192选中
  107.                                                                                                                 _GUICtrlListView_SetItemSelected($hListView,$iIndex,False,True)
  108.                                                 EndIf
  109.                                                 $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
  110.                                                 DllStructSetData($tInfo, "State", $aShowdata[$iIndex][3]);设置复选框状态
  111.                                                 ;====立刻刷新复选框显示状态 重绘$iIndex-1到$iIndex+20的项
  112.                                                 GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, $iIndex - 1, $iIndex + 20)
  113.                                                                                 EndIf
  114.        
  115.                                                                                
  116.                                 Case $NM_DBLCLK ; 双击
  117.                                         $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  118.                                         $iIndex = DllStructGetData($tInfo, "Index")
  119.                                         $iSub = DllStructGetData($tInfo, "SubItem")
  120.                                         $x = DllStructGetData($tInfo, "X")
  121.                                         If ($iIndex <> -1) And ($iSub >= 0) And ($x > 16) Then;点击的x>16才回应原地编辑
  122.                                                 $Item = $iIndex
  123.                                                 $SubItem = $iSub
  124.                                                 ;==========计算编辑框坐标
  125.                                                 Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSub)
  126.                                                 Local $iEdit_X = $aRect[0] + 4
  127.                                                 Local $iEdit_Y = $aRect[1] + 3
  128.                                                 Local $iEdit_Width = _GUICtrlListView_GetColumnWidth($hListView, $iSub) + 3
  129.                                                 Local $iEdit_Height = $aRect[3] - $aRect[1] + 3
  130.                                                 If $iSub = 0 Then
  131.                                                         Local $i1 = 0, $i2 = 0
  132.                                                         If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then $i1 = 18;判断是否有复选框
  133.                                                         If _GUICtrlListView_GetImageList($hListView, 1) Then $i2 = 20;判断是否有分配图像列表到列表视图控件
  134.                                                         $iEdit_X += ($i2 + $i1)
  135.                                                         $iEdit_Width -= ($i2 + $i1)
  136.                                                 EndIf
  137.                                                 $hEdit = _GUICtrlEdit_Create($hWnd, $aShowdata[$iIndex][$iSub], $iEdit_X, $iEdit_Y, $iEdit_Width, $iEdit_Height, BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT))
  138.                                                 _WinAPI_SetFocus($hEdit)
  139.                                                 Send("{RIGHT}")
  140.                                                 _GUICtrlEdit_SetSel($hEdit, 0, -1)
  141.                                                 HotKeySet("{ENTER}", "_EndItemEdit");设置热键回应回车
  142.                                         EndIf

  143.   
  144.                                 Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   请求显示数据
  145.                                         If Not IsArray($aShowdata) Then ContinueCase
  146.                                         $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
  147.                                         $iIndex = Int(DllStructGetData($tInfo, "Item"))
  148.                                         $iSub = Int(DllStructGetData($tInfo, "SubItem"))

  149.                                         If BitAND(DllStructGetData($tInfo, "Mask"), $LVIF_IMAGE) And $iSub = 0 Then DllStructSetData($tInfo, "Image", 0);判断是否有LVIF_IMAGE属性,有则设置列图像

  150.                                         If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) AND _GUICtrlListView_GetItemSelected($hListView,$iIndex)=1 Then
  151.                                                 ;===============设置复选框信息
  152.                                                 DllStructSetData($tInfo, "Mask", BitOR($LVIF_STATE, DllStructGetData($tInfo, "Mask")))
  153.                                                 DllStructSetData($tInfo, "StateMask", $LVIS_STATEIMAGEMASK)
  154.                                                 DllStructSetData($tInfo, "State", 8192)
  155.                                                                                                 $aShowdata[$iIndex][3] = 8192
  156.                                                                                         Else
  157.                                                                                                 DllStructSetData($tInfo, "Mask", BitOR($LVIF_STATE, DllStructGetData($tInfo, "Mask")))
  158.                                                 DllStructSetData($tInfo, "StateMask", $LVIS_STATEIMAGEMASK)
  159.                                                 DllStructSetData($tInfo, "State", 4096)
  160.                                                                                                 $aShowdata[$iIndex][3] = 4096

  161.                                         EndIf



  162.                                         DllStructSetData($tText, "Text", $aShowdata[$iIndex][$iSub]);列数据放入$tText结构
  163.                                         DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));用$tText结构的指针来设置列数据
  164.                                         DllStructSetData($tInfo, "TextMax", StringLen($aShowdata[$iIndex][$iSub]));设置列数据长度
  165.                         EndSwitch
  166.         EndSwitch
  167.         Return $GUI_RUNDEFMSG
  168. EndFunc   ;==>WM_NOTIFY

  169. Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
  170.         $iIDFrom = _WinAPI_LoWord($wParam)
  171.         $iCode = _WinAPI_HiWord($wParam)
  172.         Switch $lParam
  173.                 Case $hEdit
  174.                         Switch $iCode
  175.                                 Case $EN_KILLFOCUS
  176.                                         _EndItemEdit()
  177.                                 Case $EN_UPDATE

  178.                         EndSwitch
  179.         EndSwitch
  180.         Return $GUI_RUNDEFMSG
  181. EndFunc   ;==>WM_COMMAND

  182. Func _EndItemEdit()
  183.         If ($Item < UBound($aShowdata, 1)) And ($SubItem < UBound($aShowdata, 2)) Then
  184.                 Local $sText = _GUICtrlEdit_GetText($hEdit)
  185.                 _GUICtrlListView_SetItemText($hListView, $Item, $sText, $SubItem)
  186.                 _WinAPI_DestroyWindow($hEdit)
  187.                 If ($Item >= 0) Then
  188.                         $aShowdata[$Item][$SubItem] = $sText
  189.                         GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  190.                         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  191.                 EndIf
  192.                 $Item = -1
  193.                 $SubItem = 0
  194.                 HotKeySet("{ENTER}");取消回车热键
  195.         EndIf
  196. EndFunc   ;==>_EndItemEdit
复制代码

本帖子中包含更多资源

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

x
发表于 2015-10-25 02:25:41 | 显示全部楼层
本帖最后由 kk_lee69 于 2015-10-25 02:38 编辑

回复 41# 298311657

能夠 直接用按鈕 發消息給WM_NOTIF 讓她重新繪製 LISTVIEW 嗎



本帖子中包含更多资源

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

x
 楼主| 发表于 2015-10-25 09:06:34 | 显示全部楼层
本帖最后由 298311657 于 2015-10-25 09:09 编辑

回复 43# kk_lee69


数据改变后,要立即显示,需向控件发送$LVM_REDRAWITEMS消息,让控件立即刷新显示数据。

  1. ;====立刻刷新$iIndex-1到iIndex+20的项
  2. GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, $iIndex - 1, $iIndex + 20)
复制代码


你的测试代码改成这样即可

  1. Case $Button1
  2.         $aShowdata[3][3] = 8192
  3.         $aShowdata[7][3] = 8192
  4.         GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 3, 7)
复制代码
发表于 2015-10-25 12:31:08 | 显示全部楼层
回复 44# 298311657

感謝樓主~~ 這樣一來 虛擬 LISTVIEW 的功能就齊全了~~~

其實~~ 懂得 虛擬 LISTVIEW  之後 我覺得它比 標準的 LISTVIEW 好用多了~~~

除了快以外 最大的優勢是 只要改變 陣列(數組) 的內容~~~ 就是改變 LISTVIEW 的內容了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2019-5-22 02:03 , Processed in 0.078125 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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