kk_lee69 发表于 2014-11-29 21:25:56

有办法在虚拟 LISTVIEW 里面加入$LVS_EX_CHECKBOXES 的风格吗??

有办法在虚拟 LISTVIEW 里面加入$LVS_EX_CHECKBOXES 的风格吗??

以下是虚拟 LISTVIEW+$LVS_EX_CHECKBOXES 后的效果,可以看出$LVS_EX_CHECKBOXES 的位置有出来,但是图案没出来 ,有人可以解决这个问题吗??


;~ 關於虛擬列表的一份說明
;~ 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);不加CHECKBOX
$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)

;設置列寬
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)
      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 $LVN_COLUMNCLICK ; 點擊列頭排序
                                                                                $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
                                        $iSub = DllStructGetData($tInfo, "SubItem")
                                        _ArraySort($aShowdata, $B_DESCENDING[$iSub], 0, 0, $iSub)
                                        GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
                                        GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
                                        $B_DESCENDING[$iSub] = Not $B_DESCENDING[$iSub]
                              Case $NM_DBLCLK ; 按兩下
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        $iIndex = DllStructGetData($tInfo, "Index")
                                        $iSub = DllStructGetData($tInfo, "SubItem")
                                        MsgBox(0, $iIndex, $aShowdata[$iIndex][$iSub])
                              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

netegg 发表于 2014-12-1 08:08:02

本帖最后由 netegg 于 2014-12-1 08:11 编辑

你这问题越来越看不明白了,虚拟listview,连界面都没有,造出checkbox放什么地方,要不就根本不是虚拟的,是个实体,不过操作的不是listview,只是画个表显示而已

kk_lee69 发表于 2014-12-1 10:31:04

回复 2# netegg

蛋大~~ 我上面的範例 使用 第 37行 或者 使用第38行兩個效果不一樣,第38行 有多加 $LVS_EX_CHECKBOXES,跟 第37行比起來, 你會發現 其實 checkBOX 的位置有跑出來 只是
沒畫面沒有做用罷了

netegg 发表于 2014-12-1 10:34:00

回复 3# kk_lee69
很正常,加了checkbox,读的不是项值,是checkbox的值

kk_lee69 发表于 2014-12-1 11:08:56

回复 4# netegg
恩~~但是空間出來的 CHECKBOX 的圖案沒出來~~我在想的是能不能讓圖案出來,讓CHECKBOX有作用, 在上面的模式下

netegg 发表于 2014-12-1 11:17:06

要模拟出似乎在操作listview,又不让别人知道?

kk_lee69 发表于 2014-12-1 13:31:18

回复 6# netegg

是呀有點像是 你的那篇 listview(4) 在子項加入複選框

但是我要的是 實現 原本 listview 加入 checkbox 風格原本應該有的功能

netegg 发表于 2014-12-1 13:49:29

单列还是多列

netegg 发表于 2014-12-1 14:16:59

说实话,你直接说说要求吧,我真被你搞糊涂了

kk_lee69 发表于 2014-12-1 14:27:16

本帖最后由 kk_lee69 于 2014-12-1 14:28 编辑

回复 8# netegg

多行想達到如下圖

netegg 发表于 2014-12-1 14:58:12

这不是出来了吗

netegg 发表于 2014-12-1 15:08:33

这样。。。。。?

netegg 发表于 2014-12-1 15:09:49

加一行
    GUICtrlSetStyle(-1, -1,$LVS_EX_CHECKBOXES)

kk_lee69 发表于 2014-12-1 15:16:50

回复 11# netegg

圖是我剪貼圖片畫的@@

kk_lee69 发表于 2014-12-1 15:21:46

回复 11# netegg

圖是我剪貼圖片畫的@@

實際上 是第一張圖只是我希望 可以變成 下面的圖片

你下面的那張圖   的案例我也看過 但是 不是用於 上面的 程式碼

可不可以直接修改上面的程式碼 達到 我想要的功能
页: [1] 2 3
查看完整版本: 有办法在虚拟 LISTVIEW 里面加入$LVS_EX_CHECKBOXES 的风格吗??