yamakawa 发表于 2017-9-4 10:42:32

{:face (394):}听不懂你意思

另外,这两天经常504,网站不能访问,,,,,郁闷。。因为我在国外?

chzj589 发表于 2017-9-4 11:04:12

本帖最后由 chzj589 于 2017-9-4 11:06 编辑

回复 76# yamakawa
昨天下午论坛就不能打开,到刚才才恢复。
我的意思是:
有四个Listview列表,点击Listview1、Listview2、Listview3条目,要显示在Listview4。
己点击了Listview1、Listview2各三条,在点击Listview3列表三条时,其中有一条错误,
想在点击Listview3列表,清除己显示在Listview4列表上的条目。
用: _GUICtrlListView_DeleteAllItems($Listview4),
会把己输入的条目全部删除。
用:_GUICtrlListView_DeleteItem($idListview, 5)
输入的Listview1、Listview2、Listview3条目的序号与Listview4的序号以不一样,
不点击Listview4列表条目,如何获取序号?
怎么才能删除一条Listview4列表条目?

yamakawa 发表于 2017-9-4 12:22:02

listview创建一个列宽为0的列,保存 (复制来源列表,原index)
然后 _GUICtrlListView_FindText(listview4,string(复制来源列表,原index))就能获取索引了。。
如果这个列索引不是0 。那么得用_GUICtrlListView_FindInText

chzj589 发表于 2017-9-4 13:26:59

回复 78# yamakawa
$Index = _GUICtrlListView_GetSelectedIndices($Listview2)
_GUICtrlListView_FindText($Listview1,string($Listview2,$Index));就能获取索引了。。
出现:

"F:\论坛案例\ListView例子资料\ListView 子项目显示到另一个列表.au3"(848,58) : 错误: 语法错误 (非法字符)
_GUICtrlListView_FindInText($Listview1,string($hListview2?

yamakawa 发表于 2017-9-4 14:31:41

本帖最后由 yamakawa 于 2017-9-4 15:58 编辑

回复 79# chzj589


    {:face (394):}。。。晕了。老司机怎么会犯这初级毛病?

正好在玩wm_drawitem,用手头代码改下你看看效果

好像有点bug。。。。和wm_notify同时用,,,如果滚动条滚动过快会停止响应?!
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <WinAPI.au3>
#include <ButtonConstants.au3>
#cs
autoit.com yamakawa
测试环境 win10 x64
autoit3 3.3.14.2
#ce
;版本判断
Local $verArray = StringSplit(@AutoItVersion,".")
If $verArray < 14 Then MsgBox(4096,"来自Autoit.com -Yamakawa的提示","本段代码测试于 Autoit 3.3.14.2!" & @CRLF & @CRLF & @CRLF & "当前版本低于3.3.14.2 如果出现问题,请自行修改!")
;低于3.3.14.2则弹出提示。不兼容可能是版本问题

Global Const $ODT_LISTVIEW = 102
Global Const $ODA_DRAWENTIRE = 0x1
Global Const $ODA_SELECT = 0x2
Global Const $ODA_FOCUS = 0x4
Global Const $ODS_SELECTED = 0x0001

$hGUI = GUICreate("Test GUI", 650, 300)
;===第一个列表
$lListView = GUICtrlCreateListView("Items|SubItems", 10, 10, 280, 180, BitOR($LVS_REPORT, $LVS_OWNERDRAWFIXED))
$hlListView = GUICtrlGetHandle(-1)
_GUICtrlListView_SetExtendedListViewStyle($hlListView, $LVS_EX_FULLROWSELECT)
For $i = 1 To 15
        _GUICtrlListView_AddItem($hlListView, "Item" & $i & "   ")
        _GUICtrlListView_AddSubItem($hlListView, $i - 1, "SubItem" & $i & "   ", 1)
Next
_GUICtrlListView_SetColumnWidth($hlListView, 0, 120)
_GUICtrlListView_SetColumnWidth($hlListView, 1, 120)
;第二个列表
$rListView = GUICtrlCreateListView("", 310, 10, 280, 180)
$hrListView = GUICtrlGetHandle(-1)
_GUICtrlListView_SetExtendedListViewStyle($hrListView, $LVS_EX_FULLROWSELECT)

_GUICtrlListView_InsertColumn($hrListView, 0, "隐藏列", 0)
_GUICtrlListView_InsertColumn($hrListView, 1, "列1", 120)
_GUICtrlListView_InsertColumn($hrListView, 2, "列2", 120)


GUICtrlCreateLabel("双击左边列表项," & @CRLF & "如果当前项在右边列表不存在,则建立" & @CRLF & "如果当前项在右边列表存在,则删除",10,200)
$do = GUICtrlCreateButton("text", 10, 250)
GUICtrlSetStyle(-1, BitOR($WS_TABSTOP, $BS_NOTIFY, $BS_OWNERDRAW)) ; Set the ownerdrawn flag
GUICtrlCreateLabel("←←←←←←←这个按钮感觉如何(我指的形状)", 50, 255)
GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

While 1
        Switch GUIGetMsg()
                Case -3
                        Exit
                Case $do
                        MsgBox(0, "", "do is clicked", 0, $hGUI)
        EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
      #forceref $hWnd, $iMsg, $iwParam
      Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo

      $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
      $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
      $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
      $iCode = DllStructGetData($tNMHDR, "Code")
      
      Switch $iIDFrom
                Case $lListView
                        Switch $iCode
                                                        Case $NM_DBLCLK
                                     $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                                                        Local $index = DllStructGetData($tInfo, "Index")
                                                                        Local $newIndex = _GUICtrlListView_FindText($rListView,String($lListView & "," & $index))
                                                                        If $newIndex <> -1 Then
                                                                                _GUICtrlListView_DeleteItem ( $rListView, $newIndex )
                                                                        Else
                                                                                GUICtrlCreateListViewItem(String($lListView & "," & $index) &"|" & _GUICtrlListView_GetItemTextString($lListView, -1), $rListView)
                                                                        EndIf
                                    Return 1 ; not to allow the default processing
             ;~                     Return 0 ; allow the default processing
                        EndSwitch
      EndSwitch
      Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam);嘿嘿。新GET的。。。
        Local $tagDRAWITEMSTRUCT, $iBrushColor, $cID, $itmID, $itmAction, $itmState, $hItm, $hDC, $bSelected, $oldColor
        $tagDRAWITEMSTRUCT = DllStructCreate( _
                        "uint cType;" & _
                        "uint cID;" & _
                        "uint itmID;" & _
                        "uint itmAction;" & _
                        "uint itmState;" & _
                        "hwnd hItm;" & _
                        "handle hDC;" & _
                        "long itmRect;" & _
                        "ulong_ptr itmData" _
                        , $lParam)

        If $tagDRAWITEMSTRUCT.cType <> $ODT_LISTVIEW Then Return $GUI_RUNDEFMSG
        If $tagDRAWITEMSTRUCT.itmAction <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG
        $txtcolor = BitAND($tagDRAWITEMSTRUCT.itmState, $ODS_SELECTED) = $ODS_SELECTED ? 0xffffff : 0x000000
        _WinAPI_SetTextColor($tagDRAWITEMSTRUCT.hDC, $txtcolor)

        Local $tRect = DllStructGetPtr($tagDRAWITEMSTRUCT, "itmRect")
        $iBrushColor = BitAND($tagDRAWITEMSTRUCT.itmState, $ODS_SELECTED) = $ODS_SELECTED ? 0xff7bcc : 0xffffff ;旧版这句可能需要修改
        Local $aBrush = _WinAPI_CreateSolidBrush($iBrushColor)
        Local $aBrushOld = _WinAPI_SelectObject($tagDRAWITEMSTRUCT.hDC, $aBrush)
        _WinAPI_FillRect($tagDRAWITEMSTRUCT.hDC, $tRect, $aBrush)
        _WinAPI_SelectObject($tagDRAWITEMSTRUCT.hDC, $aBrushOld)
        _WinAPI_DeleteObject($aBrush)

        For $i = 0 To _GUICtrlListView_GetColumnCount($tagDRAWITEMSTRUCT.hItm)
                Local $iItmText = _GUICtrlListView_GetItemText($tagDRAWITEMSTRUCT.hItm, $tagDRAWITEMSTRUCT.itmID, $i)
                Local $iItmRect = DllStructCreate($tagRect)
                If $i Then $iItmRect.top = $i ;这句啥意思还不理解。。。。。。怎么想来想去好像是列索引的意思???可是这个结构中不是指的top么??
                DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $tagDRAWITEMSTRUCT.hItm, 'uint', $LVM_GETSUBITEMRECT, 'wparam', $tagDRAWITEMSTRUCT.itmID, 'lparam', DllStructGetPtr($iItmRect))
                $iItmRect.left = $i ? $iItmRect.left + 5 : $iItmRect.left + 10 ;首项缩进10,其他缩进5
                Local $iItmText = _GUICtrlListView_GetItemText($tagDRAWITEMSTRUCT.hItm, $tagDRAWITEMSTRUCT.itmID, $i)
                _WinAPI_DrawText($tagDRAWITEMSTRUCT.hDC, $iItmText, $iItmRect, $DT_LEFT)
        Next
       
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_DRAWITEM

chzj589 发表于 2017-9-5 11:35:54

回复 80# yamakawa

效果很棒,谢谢!解决问题。
唉,当年考驾照没认真学习科目1与科目2,现在上路老是被扣分.(开玩笑)
基础没学好,这是实话.
页: 1 2 3 4 5 [6]
查看完整版本: 如何使用左键单点击达成LISTVIEW连续选中状态??