找回密码  加入

AUTOIT CN

搜索
楼主: 298311657

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

[复制链接]
发表于 2017-10-9 17:29:07 | 显示全部楼层
感谢楼主分享
发表于 2017-12-4 09:26:27 | 显示全部楼层
必须回复啊
发表于 2017-12-4 09:50:30 | 显示全部楼层
谢谢楼主分享。
发表于 2017-12-13 21:24:57 | 显示全部楼层
谢谢分享,研究一下
发表于 2017-12-17 15:50:43 | 显示全部楼层
现在回复算不算挖坟
发表于 2017-12-17 22:01:18 | 显示全部楼层
不错啊。很实用啊。。
发表于 2017-12-22 18:52:54 | 显示全部楼层
回复 1# 298311657


   
谢谢分享!!。。
发表于 2018-2-27 13:04:03 | 显示全部楼层
参考参考。。。。
发表于 2018-3-5 11:11:02 | 显示全部楼层
支持一下..
发表于 2018-3-5 12:35:19 | 显示全部楼层
回复 1# 298311657


    这个必须要学习一下~~~
发表于 2018-3-17 15:21:38 | 显示全部楼层
感谢楼主分享
发表于 2018-3-22 22:56:02 | 显示全部楼层
回复 1# 298311657

請問 圖標 可以加在SUBITEM 嗎
 楼主| 发表于 2018-3-26 18:10:05 | 显示全部楼层
回复 177# kk_lee69


使用下面的方法:
  1. _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_SUBITEMIMAGES)); ++++++++++++++++++++++++允许显示子项目图像
复制代码
这是完整示例:
  1. #cs ____________________________________
  2.     Au3 版本: 3.3.14.2
  3.     脚本作者: CrossDoor
  4.     电子邮件: [email]382869232@qq.com[/email]
  5.     QQ/TM: 382869232
  6. #ce _______________脚本开始_________________
  7. #include <GUIConstantsEx.au3>
  8. #include <GuiListView.au3>
  9. #include <GuiImageList.au3>
  10. #include <WindowsConstants.au3>
  11. #include <WinAPISys.au3>
  12. #include <GuiEdit.au3>
  13. #include <array.au3>

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

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

  16. Local $tText = DllStructCreate("wchar Text[512]");建个结构,用来放listview列数据
  17. Local $GUI, $hImage, $iITEM_COUNT = 10000
  18. Local $sSomeString = ""
  19. Local $aShowdata[$iITEM_COUNT][4]
  20. For $i = 0 To $iITEM_COUNT - 1;初始化数组
  21.     $aShowdata[$i][0] = "爷爷" & $i
  22.     $aShowdata[$i][1] = "爸爸" & $i
  23.     $aShowdata[$i][2] = "儿子" & $i
  24.     $aShowdata[$i][3] = 4096;复选框状态 4096未选中 8192选中
  25. Next

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

  29. $hListView = GUICtrlCreateListView("Item1|nSubItem1|nSubItem2", 2, 2, 494, 294, $LVS_SHOWSELALWAYS + $LVS_OWNERDATA, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER + $LVS_EX_CHECKBOXES)
  30. _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_SUBITEMIMAGES)); ++++++++++++++++++++++++允许显示子项目图像

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

  36. ;===========创建并关联图像列表
  37. $hImage = _GUIImageList_Create()
  38. _GUIImageList_SetIconSize($hImage, 32, 16); ++++++++++++++++++++++++设置图像列表大小
  39. _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 110)
  40. _GUICtrlListView_SetImageList($hListView, $hImage, 1);分配图像列表到列表视图控件

  41. $Button3 = GUICtrlCreateButton("修改", 180, 310, 75, 25)
  42. $Button4 = GUICtrlCreateButton("清空", 260, 310, 75, 25)
  43. GUISetState()

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

  71. Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  72.     #forceref $hWnd, $iMsg, $iwParam
  73.     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $s

  74.     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  75.     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  76.     $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  77.     $iCode = DllStructGetData($tNMHDR, "Code")
  78.     Local $iIndex = DllStructGetData($tNMHDR, 'Index')
  79.     Switch $iIDFrom
  80.         Case $hListView
  81.             Switch $iCode
  82.                 Case $LVN_COLUMNCLICK ; 点击列头排序
  83.                     $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
  84.                     $iSub = DllStructGetData($tInfo, "SubItem")
  85.                     _ArraySort($aShowdata, $B_DESCENDING[$iSub], 0, 0, $iSub)
  86.                     GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  87.                     GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  88.                     $B_DESCENDING[$iSub] = Not $B_DESCENDING[$iSub]

  89.                 Case $NM_CLICK;单击
  90.                     $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  91.                     $iIndex = DllStructGetData($tInfo, "Index")
  92.                     $x = DllStructGetData($tInfo, "X")

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

  131.                 Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   请求显示数据
  132.                     If Not IsArray($aShowdata) Then ContinueCase
  133.                     $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
  134.                     $iIndex = Int(DllStructGetData($tInfo, "Item"))
  135.                     $iSub = Int(DllStructGetData($tInfo, "SubItem"))

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

  137.                     If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) And $iSub = 0 Then ;++++++++++++++++++++++++在0列设置复选框信息,同列也可以在子列设置复选框,但子列选中操作需另写代码
  138.                         DllStructSetData($tInfo, "Mask", BitOR($LVIF_STATE,DllStructGetData($tInfo, "Mask")))
  139.                         DllStructSetData($tInfo, "StateMask", $LVIS_STATEIMAGEMASK)
  140.                         DllStructSetData($tInfo, "State", $aShowdata[$iIndex][3])
  141.                     EndIf

  142.                     DllStructSetData($tText, "Text", $aShowdata[$iIndex][$iSub]);列数据放入$tText结构
  143.                     DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));用$tText结构的指针来设置列数据
  144.                     DllStructSetData($tInfo, "TextMax", StringLen($aShowdata[$iIndex][$iSub]));设置列数据长度

  145.                     If BitAND(DllStructGetData($tInfo, "Mask"), $LVIF_IMAGE) And $iSub = 1 Then DllStructSetData($tInfo, "Image", 0); ++++++++++++++++++++++++判断是否子列1是否有LVIF_IMAGE属性,有则设置列图像,其它子列同理
  146.             EndSwitch
  147.     EndSwitch
  148.     Return $GUI_RUNDEFMSG
  149. EndFunc   ;==>WM_NOTIFY

  150. Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
  151.     $iIDFrom = _WinAPI_LoWord($wParam)
  152.     $iCode = _WinAPI_HiWord($wParam)
  153.     Switch $lParam
  154.         Case $hEdit
  155.             Switch $iCode
  156.                 Case $EN_KILLFOCUS
  157.                     _EndItemEdit()
  158.                 Case $EN_UPDATE

  159.             EndSwitch
  160.     EndSwitch
  161.     Return $GUI_RUNDEFMSG
  162. EndFunc   ;==>WM_COMMAND

  163. Func _EndItemEdit()
  164.     If ($Item < UBound($aShowdata,1)) And ($SubItem < UBound($aShowdata,2)) Then
  165.         Local $sText = _GUICtrlEdit_GetText($hEdit)
  166.         _GUICtrlListView_SetItemText($hListView, $Item, $sText, $SubItem)
  167.         _WinAPI_DestroyWindow($hEdit)
  168.         If ($Item >= 0) Then
  169.             $aShowdata[$Item][$SubItem] = $sText
  170.             GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
  171.             GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
  172.         EndIf
  173.         $Item = -1
  174.         $SubItem = 0
  175.         HotKeySet("{ENTER}");取消回车热键
  176.     EndIf
  177. EndFunc
复制代码
发表于 2018-4-2 00:09:16 | 显示全部楼层
回复 5# wangms

老大  有上線幫我看一下

关于listview虚表直接读取数据库的方法,求助修改范例成SQL的!!

官网有个范例 是listview虚表 直接拿SQLlite 的数据库 当作 listview虚表的数据 直接使用,这样的好处是 即使你的数据再多 也是分次 读取 就不会卡了
无奈 小弟 对于 SQLLITE的 UDF 实在没辙,我研究了半天 总是搞不懂原理
无法改成 把SQL DB 当作数据库来源的方法 ,所以上来求助

listview虚表 我已经很熟了  所以理论上不应该是我不会使用,只是以前的方法都是读进
数组  然后 利用数组 当作listview虚表 的数据源

只是最近遇到了 数据太多 读进数组太慢  想要改成 分次读取 分次秀出的方法

所以才把脑筋动到了 数据库上……

看看 可不可以給個範例
发表于 2018-4-2 10:44:40 | 显示全部楼层
这个要看看,谢谢楼主分享。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2020-12-2 20:57 , Processed in 0.234375 second(s), 14 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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