找回密码
 加入
搜索
楼主: kk_lee69

[AU3基础] 如何使用左键单点击达成LISTVIEW连续选中状态??

  [复制链接]
发表于 2017-8-30 16:01:18 | 显示全部楼层
回复 45# kk_lee69
先谢谢了

#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <GUIListView.au3>
#include <GuiImageList.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
;#include <WinAPIShellEx.au3>
#include <GUIEdit.au3>
;#include <WinAPIEx.au3>

Opt('GUIOnEventMode', 1)

Global $idListView, $hListView, $pListViewFunc, $idAddSingleSel, $idDelSingleSel, $hListView2, $Edit1, $Inputu7, $Listview2
Global $Inputu8, $idAddSingleSela
Example()
While 1
        Sleep(1000)
WEnd

Func Example()
        ; Create GUI
        GUICreate("ctrl+single-click --> single-click", 840, 610)
        GUISetOnEvent(-3, '_Exit')
        ; Create ListView
        $idListView = GUICtrlCreateListView("", 10, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE)
        _GUICtrlListView_SetExtendedListViewStyle($idListView, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT)
        $hListView = GUICtrlGetHandle($idListView)
        GUICtrlSetBkColor($idListView, 0xCDCDCD);0xECE9D8);
        _GUICtrlListView_SetBkColor($idListView, 14675183)

        _GUICtrlListView_InsertColumn($idListView, 0, "Column 1", 94)
        _GUICtrlListView_InsertColumn($idListView, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($idListView, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($idListView, 3, "Column 4", 94)
        $hImage = _GUIImageList_Create(1, 18);30为每行的间距(即网格高度)
        _GUICtrlListView_SetImageList($idListView, $hImage, 1)
        _GUICtrlListView_SetExtendedListViewStyle($idListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP))

        Local $iItems = 18
        For $i = 0 To $iItems - 1
                GUICtrlCreateListViewItem($i & "/Column 1|" & $i & "/Column 2|" & $i & "/Column 3|" & $i & "/Column 4", $idListView)
        Next

        $pListViewFunc = DllCallbackGetPtr(DllCallbackRegister("ListViewFunc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr"))
        _WinAPI_SetWindowSubclass($hListView, $pListViewFunc, 0, 0) ; $iSubclassId = 0, $pData = 0

        $idAddSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_AddSingleSel')
        $idDelSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_DelSingleSel')
        $Listview2 = GUICtrlCreateListView("", 420, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE)
        _GUICtrlListView_SetExtendedListViewStyle($Listview2, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT)
        Local $hListView2 = GUICtrlGetHandle($Listview2)
        GUICtrlSetBkColor($Listview2, 0xC0E0FF);0xECE9D8);
        _GUICtrlListView_SetBkColor($Listview2, 14675183)
        _GUICtrlListView_InsertColumn($Listview2, 0, "id", 54)
        _GUICtrlListView_InsertColumn($Listview2, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($Listview2, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($Listview2, 3, "Column 4", 94)
        $hImage = _GUIImageList_Create(1, 18);30为每行的间距(即网格高度)
        _GUICtrlListView_SetImageList($Listview2, $hImage, 1)
        _GUICtrlListView_SetExtendedListViewStyle($Listview2, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP))
        $Edit1 = GUICtrlCreateEdit("", 10, 400, 810, 200, $WS_VSCROLL + $ES_WANTRETURN)
        GUICtrlSetFont(-1, 13, 600, 0, "微软雅黑")
        GUICtrlSetColor(-1, 0x009900)
        $Inputu7 = GUICtrlCreateLabel("", 680, 560, 90, 17)
        GUICtrlSetState($Inputu7, $GUI_HIDE)
        $Inputu8 = GUICtrlCreateLabel("", 680, 590, 90, 17)
        GUICtrlSetState($Inputu8, $GUI_HIDE)

        $idAddSingleSela = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_AddSingleSela')

        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
        GUISetState(@SW_SHOW)
EndFunc   ;==>Example

Func ListViewFunc($hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData)
        If $iMsg <> $WM_LBUTTONDOWN Then
                Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
                If Not @error Then
                        Return $result[0]
                Else
                        Return
                EndIf
        EndIf
        Switch $wParam
                Case 0x0001
                        If _GUICtrlListView_GetSelectedCount($idListView) Then
                                Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
                                If Not (@error Or $aHit[0] = -1) Then
                                        If _GUICtrlListView_GetItemSelected($idListView, $aHit[0]) Then
                                                GUICtrlSendToDummy($idDelSingleSel, $aHit[0])
                                        Else
                                                GUICtrlSendToDummy($idAddSingleSel, $aHit[0])
                                        EndIf
                                EndIf
                                Return 0
                        EndIf
                Case 0x0009
                        Return 0
        EndSwitch
        Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
        If Not @error Then
                Return $result[0]
        Else
                Return
        EndIf
        #forceref $iSubclassId, $pData
EndFunc   ;==>ListViewFunc

Func _AddSingleSel()
        Local $iItem = GUICtrlRead($idAddSingleSel)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, True)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)

EndFunc   ;==>_AddSingleSel
Func _AddSingleSela()
        Local $iItem = GUICtrlRead($idAddSingleSela)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, True)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
        _GUICtrlListView_SetItemSelected($Listview2, $iItem, True)
        _GUICtrlListView_SetItemFocused($Listview2, $iItem)
        GUICtrlSetBkColor($idListView, 0xC0E0FF)
        _GUICtrlListView_SetBkColor($idListView, 14675183)
EndFunc   ;==>_AddSingleSela
Func _DelSingleSel()
        Local $iItem = GUICtrlRead($idDelSingleSel)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, False)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
        _DEL()
EndFunc   ;==>_DelSingleSel
Func _Exit()
        _WinAPI_RemoveWindowSubclass($hListView, $pListViewFunc, 0)
        GUIDelete()
        Exit
EndFunc   ;==>_Exit

Func _WinAPI_SetWindowSubclass($hWnd, $pSubclassProc, $idSubClass, $pData = 0)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'SetWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass, _
                        'dword_ptr', $pData)
        If @error Then Return SetError(@error, @extended, 0)

        Return $aRet[0]
EndFunc   ;==>_WinAPI_SetWindowSubclass
Func _WinAPI_RemoveWindowSubclass($hWnd, $pSubclassProc, $idSubClass)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'RemoveWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass)
        If @error Then Return SetError(@error, @extended, False)
        Return $aRet[0]
EndFunc   ;==>_WinAPI_RemoveWindowSubclass
Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $ilParam)
        Local $hWndFrom, $iCode
        Local $tNMHDR, $iCode, $hMenu, $hWnd, $iMsg
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $hListView;$hWndListView;这里改成你的listview的ID
                        Switch $iCode
                                Case $NM_DBLCLK
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $idd = DllStructGetData($tInfo, "Index")
                                        GUICtrlSetData($Inputu8, $idd)
                                        _ListView2()
                                Case $NM_CUSTOMDRAW
                                        Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam)
                                        Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage")
                                        If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
                                        If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW
                                        Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem")
                                        Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec")
                                        Local $iColor, $hDC, $Font1
                                        Switch $iItem
                                                Case 2;条目行数
                                                        $hDC = DllStructGetData($tCustDraw, "hdc")
                                                        If $iSubItem = 0 Then ;设置首列, 即项目
                                                                $iColor = RGB2BGR(0xFF0000)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                        ElseIf $iSubItem = 1 Then ;设置子项, 即列索引大于0时
                                                                $iColor = RGB2BGR(0x009900)
                                                                ;_WinAPI_SelectObject($hDC, $Font2) ;设置用于设备场景内文本的字体
                                                                DllStructSetData($tCustDraw, "clrText", $iColor) ;设置文本色
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xFFFF80)) ;设置文本背景色
                                                        ElseIf $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF00FF);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        ElseIf $iSubItem = 3 Then
                                                                $iColor = RGB2BGR(0x000080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        EndIf
                                                Case 4 ;条目行数
                                                        If $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF0080);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(16710321))
                                                        EndIf
                                                        Return $CDRF_NEWFONT
                                        EndSwitch
                        EndSwitch
        EndSwitch
        Local $tagNMHDR, $Event, $hWndFrom, $IDFrom, $iCode
        Local $tagNMHDR = DllStructCreate("int;int;int", $ilParam)
        If @error Then Return $GUI_RUNDEFMSG
        $IDFrom = DllStructGetData($tagNMHDR, 2)
        $Event = DllStructGetData($tagNMHDR, 3)
        $tagNMHDR = 0
        Switch $IDFrom;选择产生事件的控件
                Case $hListView;$hWndListView;这里改成你的listview的ID

                Case $Listview2
                        Switch $Event; 选择产生的事件
                                Case $NM_CLICK ; 左击
                                        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
                                        Local $idd = _GUICtrlListView_GetItemText($Listview2, Number($Index), 0);DllStructGetData($tInfo, "Index")
                                        ;MsgBox(48, '提示', "小苹果提示"&$idd)
                                        GUICtrlSetData($Inputu7, $idd)
                                        If $iMsg <> $WM_LBUTTONDOWN Then
                                                Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "ilparam", $ilParam)
                                                If Not @error Then
                                                        Return $result[0]
                                                Else
                                                        Return
                                                EndIf
                                        EndIf
                                        Switch $wParam
                                                Case 0x0001
                                                        If _GUICtrlListView_GetSelectedCount($idListView) Then
                                                                Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($ilParam, 0xFFFF), BitShift($ilParam, 16))
                                                                If Not (@error Or $aHit[0] = -1) Then
                                                                        If _GUICtrlListView_GetItemSelected($idListView, $aHit[0]) Then
                                                                                ;GUICtrlSendToDummy($idDelSingleSel, $aHit[0])
                                                                        Else
                                                                                GUICtrlSendToDummy($idAddSingleSela, $aHit[0])
                                                                        EndIf
                                                                EndIf
                                                                Return 0
                                                        EndIf
                                                Case 0x0009
                                                        Return 0
                                        EndSwitch
                                        Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "ilparam", $ilParam)
                                        If Not @error Then
                                                Return $result[0]
                                        Else
                                                Return
                                        EndIf

                                Case $NM_DBLCLK ; 双击
                                        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
                                        If Not StringLen($Index) Then; 这里用以判断是否选定了ListViewItem
                                                MsgBox(0, "", "未选定")
                                                Return
                                        EndIf
                                        ; MsgBox(0, 0, _GUICtrlListView_GetItemText($ListView2, Number($Index), 0))
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $idd = _GUICtrlListView_GetItemText($Listview2, Number($Index), 0);DllStructGetData($tInfo, "Index")
                                        ;MsgBox(48, '提示', "小苹果提示"&$idd)
                                        GUICtrlSetData($Inputu7, $idd)

                                Case $NM_RCLICK ; 右击
;~                                         ...
                        EndSwitch
        EndSwitch



        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func RGB2BGR($iColor)
        Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc   ;==>RGB2BGR
Func _ListView2()
        GUICtrlSetData($Inputu7, "")
        ;$Strn = GUICtrlRead(GUICtrlRead($Listview2))
        ;$Strnspin = StringSplit($Strn, "|")
        Local $Inpa = GUICtrlRead($Inputu8)
        $cont = _GUICtrlListView_GetItemCount($hListView);取得数组的行列数
        $h1 = $cont + 1
        For $id = 0 To $cont - 1
                $str = _GUICtrlListView_GetItemTextArray($hListView, $Inpa)
                $h1 = $str[1]
                $h2 = $str[2]
                $h3 = $str[3]
                $h4 = $str[4]

        Next
        ;$num1 = $cont + 1
        $Number = _GUICtrlListView_GetItemCount($Listview2)
        $num1 = $Number + 1
        _GUICtrlListView_AddItem($Listview2, $num1, $Number)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h2, 1)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h3, 2)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h4, 3)
        ;GUICtrlSetBkColor($Listview2, 0xC0E0FF)
        ;_GUICtrlListView_SetBkColor($Listview2, 14675183)
        ;_GUICtrlEdit_AppendText($Edit,"记录:---------------------------------" & @CRLF)
        _GUICtrlEdit_AppendText($Edit1, "" & $h1 & "," & $h2 & "," & $h3 & "," & $h4 & @CRLF)

EndFunc   ;==>_ListView2
Func _DEL();删除

        Local $Inpa = GUICtrlRead($Inputu7) - 1
        GUICtrlSetData($Inputu7, $Inpa)
        _GUICtrlEdit_ReplaceLine($Edit1, '[\r\n]+$', '', 0, 1)
        _GUICtrlEdit_ReplaceLine($Edit1, $Inpa)
        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
        If $Index <> "" Then
                ;$msg = MsgBox(49, "删除记录", "确定要删除记录?")
                ;If $msg == 1 Then
                $DEL = (_GUICtrlListView_DeleteItemsSelected(GUICtrlGetHandle($Listview2)))
                ;Else
                ;EndIf
        Else
                ;MsgBox(0, "提示", "请选择条目", 1)
        EndIf
        GUICtrlSetData($Inputu7, "")
        GUICtrlSetData($Inputu8, "")
EndFunc   ;==>_DEL

;==========================================================================================
; 说明: 按指定的关键字或行号替换或删除Edit编辑框行字符,可选择是否替换整行、是否使用正则表达式。
; 语法: _GUICtrlEdit_ReplaceLine('控件句柄', '搜索字符或'行号[, '替换'[, 替换行标志[, 正则标志]]])
; 参数: '搜索字符串或'行号:    如果使用行号(0基)则不要用引号,否则会作为字符串搜索;
;                  使用 -1 则匹配最后一行
;    '替换'[可选]:          如'替换'字符为空(默认)则为删除。
;    替换行标志[可选]:      标志 = 1 :包含关键字的整行被替换;标志 = 0 仅替换搜索字符(默认)。
;                   如果搜索参数为行号,则此参数无效(整行被替换,等同于此参数为1)
;    正则标志[可选]:        正则标志 = 1 使用正则,为 0 不使用正则(默认),使用原始字符串匹配。
; 返回值:成功: 返回1;
;    失败: 返回0,并设置@Error为以下值:
;                    @Error = 1 编辑框为空
;                  @Error = 2 编辑文本数量超出限制(注:可用 GUICtrlSetLimit() 设置)
;                  @Error = 3 搜索的行号超出现有总行数范围
;                 @Error = 4 未搜索到匹配字符串
; 作者: Afan -- http://www.autoitx.com
;=====================================================================================start

Func _GUICtrlEdit_ReplaceLine($hWnd, $pattern, $replace = '', $flag = 0, $SRE = 0)
        Local $Str_all = GUICtrlRead($hWnd)
        If $Str_all = '' Then Return SetError(1, 0, 0)
        If _GUICtrlEdit_GetLimitText($hWnd) < StringLen($Str_all) Then Return SetError(2, 0, 0)
        Local $Index, $nLine, $strZY, $sR, $iStart, $iEnd, $str, $Len, $extended
        If IsNumber($pattern) Then
                $Index = _GUICtrlEdit_GetLineCount($hWnd)
                If $pattern = -1 Then
                        $nLine = $Index - 1
                Else
                        $nLine = $pattern
                        If $nLine > $Index - 1 Then Return SetError(3, 0, 0)
                EndIf
                $Len = StringLen(_GUICtrlEdit_GetLine($hWnd, $nLine))
                $iStart = _GUICtrlEdit_LineIndex($hWnd, $nLine)
                $iEnd = $iStart + $Len
        Else
                If $SRE = 0 Then
                        $strZY = '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)'
                        $pattern = StringRegExpReplace($pattern, $strZY, '\\$1')
                        $replace = StringRegExpReplace($replace, $strZY, '\\$1')
                EndIf
                $sR = StringRegExp($Str_all, $pattern, 1)
                If @error Then Return SetError(4, 0, 0)
                $extended = @extended
                If $flag = 1 Or $flag = -1 Then
                        $nLine = _GUICtrlEdit_LineFromChar($hWnd, $extended - 1)
                        $Len = StringLen(_GUICtrlEdit_GetLine($hWnd, $nLine))
                        $iStart = _GUICtrlEdit_LineIndex($hWnd, $nLine)
                        $iEnd = $iStart + $Len
                Else
                        $iEnd = $extended - 1
                        $str = $sR[0]
                        $Len = StringLen($str)
                        $iStart = $iEnd - $Len
                EndIf
        EndIf
        _GUICtrlEdit_SetSel($hWnd, $iStart, $iEnd)
        GUICtrlSetData($hWnd, $replace, 1)
        Return 1
EndFunc   ;==>_GUICtrlEdit_ReplaceLine
 楼主| 发表于 2017-8-30 16:49:32 | 显示全部楼层
本帖最后由 kk_lee69 于 2017-8-30 16:55 编辑

回复 46# chzj589


#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <GUIListView.au3>
#include <GuiImageList.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
;#include <WinAPIShellEx.au3>
#include <GUIEdit.au3>
;#include <WinAPIEx.au3>
 
Opt('GUIOnEventMode', 1)
 
Global $idListView, $hListView, $pListViewFunc, $idAddSingleSel, $idDelSingleSel, $hListView2, $Edit1, $Inputu7, $Listview2
Global $Inputu8, $idAddSingleSela
Example()
While 1
        Sleep(1000)
WEnd
 
Func Example()
        ; Create GUI
        GUICreate("ctrl+single-click --> single-click", 840, 610)
        GUISetOnEvent(-3, '_Exit')
        ; Create ListView
        $idListView = GUICtrlCreateListView("", 10, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE  )
        _GUICtrlListView_SetExtendedListViewStyle($idListView, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT+$LVS_EX_CHECKBOXES )
        $hListView = GUICtrlGetHandle($idListView)
       ; GUICtrlSetBkColor($idListView, 0xCDCDCD);0xECE9D8);
       ; _GUICtrlListView_SetBkColor($idListView, 14675183)
 
        _GUICtrlListView_InsertColumn($idListView, 0, "Column 1", 94)
        _GUICtrlListView_InsertColumn($idListView, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($idListView, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($idListView, 3, "Column 4", 94)
        $hImage = _GUIImageList_Create(1, 18);30?每行的?距(即网格高度)
        _GUICtrlListView_SetImageList($idListView, $hImage, 1)
        _GUICtrlListView_SetExtendedListViewStyle($idListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP+$LVS_EX_CHECKBOXES ))
 
        Local $iItems = 18
        For $i = 0 To $iItems - 1
                GUICtrlCreateListViewItem($i & "/Column 1|" & $i & "/Column 2|" & $i & "/Column 3|" & $i & "/Column 4", $idListView)
        Next
 
        $pListViewFunc = DllCallbackGetPtr(DllCallbackRegister("ListViewFunc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr"))
        _WinAPI_SetWindowSubclass($hListView, $pListViewFunc, 0, 0) ; $iSubclassId = 0, $pData = 0
 
        $idAddSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_AddSingleSel')
        $idDelSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_DelSingleSel')
        $Listview2 = GUICtrlCreateListView("", 420, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE)
        _GUICtrlListView_SetExtendedListViewStyle($Listview2, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT)
        Local $hListView2 = GUICtrlGetHandle($Listview2)
        ;GUICtrlSetBkColor($Listview2, 0xC0E0FF);0xECE9D8);
        ;_GUICtrlListView_SetBkColor($Listview2, 14675183)
        _GUICtrlListView_InsertColumn($Listview2, 0, "id", 54)
        _GUICtrlListView_InsertColumn($Listview2, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($Listview2, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($Listview2, 3, "Column 4", 94)
        $hImage = _GUIImageList_Create(1, 18);30?每行的?距(即网格高度)
        _GUICtrlListView_SetImageList($Listview2, $hImage, 1)
        _GUICtrlListView_SetExtendedListViewStyle($Listview2, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP))
        $Edit1 = GUICtrlCreateEdit("", 10, 400, 810, 200, $WS_VSCROLL + $ES_WANTRETURN)
        GUICtrlSetFont(-1, 13, 600, 0, "微?雅黑")
        ;GUICtrlSetColor(-1, 0x009900)
        $Inputu7 = GUICtrlCreateLabel("", 680, 560, 90, 17)
        GUICtrlSetState($Inputu7, $GUI_HIDE)
        $Inputu8 = GUICtrlCreateLabel("", 680, 590, 90, 17)
        GUICtrlSetState($Inputu8, $GUI_HIDE)
 
        $idAddSingleSela = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_AddSingleSela')
 
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
        GUISetState(@SW_SHOW)
EndFunc   ;==>Example
 
Func ListViewFunc($hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData)
        If $iMsg <> $WM_LBUTTONDOWN Then
                Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
                If Not @error Then
                        Return $result[0]
                Else
                        Return
                EndIf
        EndIf
        Switch $wParam
                        Case 0x0001
                                ConsoleWrite(BitAND($lParam, 0xFFFF)&@CRLF)
                                        
                        If _GUICtrlListView_GetSelectedCount($idListView) Then
                                                        If BitAND($lParam, 0xFFFF) > 16 Then
                                Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
                                If Not (@error Or $aHit[0] = -1) Then
                                        If _GUICtrlListView_GetItemSelected($idListView, $aHit[0]) Then
                                                GUICtrlSendToDummy($idDelSingleSel, $aHit[0])
                                        Else
                                                GUICtrlSendToDummy($idAddSingleSel, $aHit[0])
                                        EndIf
                                EndIf
                                Return 0
                                                        EndIf        
                                                EndIf
                Case 0x0009
                        Return 0
        EndSwitch
        Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
        If Not @error Then
                Return $result[0]
        Else
                Return
        EndIf
        #forceref $iSubclassId, $pData
EndFunc   ;==>ListViewFunc
 
Func _AddSingleSel()
        Local $iItem = GUICtrlRead($idAddSingleSel)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, True)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
 
EndFunc   ;==>_AddSingleSel
Func _AddSingleSela()
        Local $iItem = GUICtrlRead($idAddSingleSela)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, True)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
        _GUICtrlListView_SetItemSelected($Listview2, $iItem, True)
        _GUICtrlListView_SetItemFocused($Listview2, $iItem)
        ;GUICtrlSetBkColor($idListView, 0xC0E0FF)
        ;_GUICtrlListView_SetBkColor($idListView, 14675183)
EndFunc   ;==>_AddSingleSela
Func _DelSingleSel()
        Local $iItem = GUICtrlRead($idDelSingleSel)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, False)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
        _DEL()
EndFunc   ;==>_DelSingleSel
Func _Exit()
        _WinAPI_RemoveWindowSubclass($hListView, $pListViewFunc, 0)
        GUIDelete()
        Exit
EndFunc   ;==>_Exit
 
Func _WinAPI_SetWindowSubclass($hWnd, $pSubclassProc, $idSubClass, $pData = 0)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'SetWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass, _
                        'dword_ptr', $pData)
        If @error Then Return SetError(@error, @extended, 0)
 
        Return $aRet[0]
EndFunc   ;==>_WinAPI_SetWindowSubclass
Func _WinAPI_RemoveWindowSubclass($hWnd, $pSubclassProc, $idSubClass)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'RemoveWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass)
        If @error Then Return SetError(@error, @extended, False)
        Return $aRet[0]
EndFunc   ;==>_WinAPI_RemoveWindowSubclass
Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $ilParam)
        Local $hWndFrom, $iCode
        Local $tNMHDR, $iCode, $hMenu, $hWnd, $iMsg
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $hListView;$hWndListView;?里改成你的listview的ID
                        Switch $iCode
                                Case $NM_DBLCLK
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $idd = DllStructGetData($tInfo, "Index")
                                        GUICtrlSetData($Inputu8, $idd)
                                        _ListView2()
                                Case $NM_CUSTOMDRAW
                                        Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam)
                                        Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage")
                                        If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
                                        If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW
                                        Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem")
                                        Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec")
                                        Local $iColor, $hDC, $Font1
                                                                                IF _GUICtrlListView_GetItemChecked($hListView,$iItem)=True  Then
                                                                                        DllStructSetData($tCustDraw, "clrTextBk",0x738393);BGR格式顏色值 高亮背景色
                                                                                        DllStructSetData($tCustDraw, "clrText", 0xFFFFFF) ;高亮後文字改為白色
                                                                                EndIf

                                        Switch $iItem
                                                Case 2;?目行?
                                                        $hDC = DllStructGetData($tCustDraw, "hdc")
                                                        If $iSubItem = 0 Then ;?置首列, 即?目
                                                                $iColor = RGB2BGR(0xFF0000)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                        ElseIf $iSubItem = 1 Then ;?置子?, 即列索引大于0?
                                                                $iColor = RGB2BGR(0x009900)
                                                                ;_WinAPI_SelectObject($hDC, $Font2) ;?置用于???景?文本的字体
                                                                DllStructSetData($tCustDraw, "clrText", $iColor) ;?置文本色
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xFFFF80)) ;?置文本背景色
                                                        ElseIf $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF00FF);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        ElseIf $iSubItem = 3 Then
                                                                $iColor = RGB2BGR(0x000080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        EndIf
                                                Case 4 ;?目行?
                                                        If $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF0080);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(16710321))
                                                        EndIf
                                                        Return $CDRF_NEWFONT
                                                                                EndSwitch
                                                                                                
                        EndSwitch
        EndSwitch
        Local $tagNMHDR, $Event, $hWndFrom, $IDFrom, $iCode
        Local $tagNMHDR = DllStructCreate("int;int;int", $ilParam)
        If @error Then Return $GUI_RUNDEFMSG
        $IDFrom = DllStructGetData($tagNMHDR, 2)
        $Event = DllStructGetData($tagNMHDR, 3)
        $tagNMHDR = 0
        Switch $IDFrom;???生事件的控件
                Case $hListView;$hWndListView;?里改成你的listview的ID
 
                Case $Listview2
                        Switch $Event; ???生的事件
                                Case $NM_CLICK ; 左?
                                        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
                                        Local $idd = _GUICtrlListView_GetItemText($Listview2, Number($Index), 0);DllStructGetData($tInfo, "Index")
                                        ;MsgBox(48, '提示', "小苹果提示"&$idd)
                                        GUICtrlSetData($Inputu7, $idd)
                                        If $iMsg <> $WM_LBUTTONDOWN Then
                                                Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "ilparam", $ilParam)
                                                If Not @error Then
                                                        Return $result[0]
                                                Else
                                                        Return
                                                EndIf
                                        EndIf
                                        Switch $wParam
                                                Case 0x0001
                                                        If _GUICtrlListView_GetSelectedCount($idListView) Then
                                                                Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($ilParam, 0xFFFF), BitShift($ilParam, 16))
                                                                If Not (@error Or $aHit[0] = -1) Then
                                                                        If _GUICtrlListView_GetItemSelected($idListView, $aHit[0]) Then
                                                                                ;GUICtrlSendToDummy($idDelSingleSel, $aHit[0])
                                                                        Else
                                                                                GUICtrlSendToDummy($idAddSingleSela, $aHit[0])
                                                                        EndIf
                                                                EndIf
                                                                Return 0
                                                        EndIf
                                                Case 0x0009
                                                        Return 0
                                        EndSwitch
                                        Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "ilparam", $ilParam)
                                        If Not @error Then
                                                Return $result[0]
                                        Else
                                                Return
                                        EndIf
 
                                Case $NM_DBLCLK ; ??
                                        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
                                        If Not StringLen($Index) Then; ?里用以判?是否?定了ListViewItem
                                                MsgBox(0, "", "未?定")
                                                Return
                                        EndIf
                                        ; MsgBox(0, 0, _GUICtrlListView_GetItemText($ListView2, Number($Index), 0))
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $idd = _GUICtrlListView_GetItemText($Listview2, Number($Index), 0);DllStructGetData($tInfo, "Index")
                                        ;MsgBox(48, '提示', "小苹果提示"&$idd)
                                        GUICtrlSetData($Inputu7, $idd)
 
                                Case $NM_RCLICK ; 右?
;~                                         ...
                        EndSwitch
        EndSwitch
 
 
 
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func RGB2BGR($iColor)
        Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc   ;==>RGB2BGR
Func _ListView2()
        GUICtrlSetData($Inputu7, "")
        ;$Strn = GUICtrlRead(GUICtrlRead($Listview2))
        ;$Strnspin = StringSplit($Strn, "|")
        Local $Inpa = GUICtrlRead($Inputu8)
        $cont = _GUICtrlListView_GetItemCount($hListView);取得??的行列?
        $h1 = $cont + 1
        For $id = 0 To $cont - 1
                $str = _GUICtrlListView_GetItemTextArray($hListView, $Inpa)
                $h1 = $str[1]
                $h2 = $str[2]
                $h3 = $str[3]
                $h4 = $str[4]
 
        Next
        ;$num1 = $cont + 1
        $Number = _GUICtrlListView_GetItemCount($Listview2)
        $num1 = $Number + 1
        _GUICtrlListView_AddItem($Listview2, $num1, $Number)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h2, 1)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h3, 2)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h4, 3)
        ;GUICtrlSetBkColor($Listview2, 0xC0E0FF)
        ;_GUICtrlListView_SetBkColor($Listview2, 14675183)
        ;_GUICtrlEdit_AppendText($Edit,"??:---------------------------------" & @CRLF)
        _GUICtrlEdit_AppendText($Edit1, "" & $h1 & "," & $h2 & "," & $h3 & "," & $h4 & @CRLF)
 
EndFunc   ;==>_ListView2
Func _DEL();?除
 
        Local $Inpa = GUICtrlRead($Inputu7) - 1
        GUICtrlSetData($Inputu7, $Inpa)
        _GUICtrlEdit_ReplaceLine($Edit1, '[\r\n]+$', '', 0, 1)
        _GUICtrlEdit_ReplaceLine($Edit1, $Inpa)
        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
        If $Index <> "" Then
                ;$msg = MsgBox(49, "?除??", "确定要?除???")
                ;If $msg == 1 Then
                $DEL = (_GUICtrlListView_DeleteItemsSelected(GUICtrlGetHandle($Listview2)))
                ;Else
                ;EndIf
        Else
                ;MsgBox(0, "提示", "????目", 1)
        EndIf
        GUICtrlSetData($Inputu7, "")
        GUICtrlSetData($Inputu8, "")
EndFunc   ;==>_DEL
 
;==========================================================================================
; ?明: 按指定的??字或行?替?或?除Edit??框行字符,可??是否替?整行、是否使用正?表?式。
; ?法: _GUICtrlEdit_ReplaceLine('控件句柄', '搜索字符或'行?[, '替?'[, 替?行?志[, 正??志]]])
; ??: '搜索字符串或'行?:    如果使用行?(0基)?不要用引?,否??作?字符串搜索;
;                  使用 -1 ?匹配最后一行
;    '替?'[可?]:          如'替?'字符?空(默?)???除。
;    替?行?志[可?]:      ?志 = 1 :包含??字的整行被替?;?志 = 0 ?替?搜索字符(默?)。
;                   如果搜索???行?,?此???效(整行被替?,等同于此???1)
;    正??志[可?]:        正??志 = 1 使用正?,? 0 不使用正?(默?),使用原始字符串匹配。
; 返回值:成功: 返回1;
;    失?: 返回0,并?置@Error?以下值:
;                    @Error = 1 ??框?空
;                  @Error = 2 ??文本?量超出限制(注:可用 GUICtrlSetLimit() ?置)
;                  @Error = 3 搜索的行?超出?有?行?范?
;                 @Error = 4 未搜索到匹配字符串
; 作者: Afan -- http://www.autoitx.com
;=====================================================================================start
 
Func _GUICtrlEdit_ReplaceLine($hWnd, $pattern, $replace = '', $flag = 0, $SRE = 0)
        Local $Str_all = GUICtrlRead($hWnd)
        If $Str_all = '' Then Return SetError(1, 0, 0)
        If _GUICtrlEdit_GetLimitText($hWnd) < StringLen($Str_all) Then Return SetError(2, 0, 0)
        Local $Index, $nLine, $strZY, $sR, $iStart, $iEnd, $str, $Len, $extended
        If IsNumber($pattern) Then
                $Index = _GUICtrlEdit_GetLineCount($hWnd)
                If $pattern = -1 Then
                        $nLine = $Index - 1
                Else
                        $nLine = $pattern
                        If $nLine > $Index - 1 Then Return SetError(3, 0, 0)
                EndIf
                $Len = StringLen(_GUICtrlEdit_GetLine($hWnd, $nLine))
                $iStart = _GUICtrlEdit_LineIndex($hWnd, $nLine)
                $iEnd = $iStart + $Len
        Else
                If $SRE = 0 Then
                        $strZY = '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)'
                        $pattern = StringRegExpReplace($pattern, $strZY, '\\$1')
                        $replace = StringRegExpReplace($replace, $strZY, '\\$1')
                EndIf
                $sR = StringRegExp($Str_all, $pattern, 1)
                If @error Then Return SetError(4, 0, 0)
                $extended = @extended
                If $flag = 1 Or $flag = -1 Then
                        $nLine = _GUICtrlEdit_LineFromChar($hWnd, $extended - 1)
                        $Len = StringLen(_GUICtrlEdit_GetLine($hWnd, $nLine))
                        $iStart = _GUICtrlEdit_LineIndex($hWnd, $nLine)
                        $iEnd = $iStart + $Len
                Else
                        $iEnd = $extended - 1
                        $str = $sR[0]
                        $Len = StringLen($str)
                        $iStart = $iEnd - $Len
                EndIf
        EndIf
        _GUICtrlEdit_SetSel($hWnd, $iStart, $iEnd)
        GUICtrlSetData($hWnd, $replace, 1)
        Return 1
EndFunc   ;==>_GUICtrlEdit_ReplaceLine


看一下第180 行  那邊指定 如果被CHECKED  顏色就變   但是你的範例我弄不出來  理論上應該是 跟 SELEDTED 顏色依樣才對   

然後 你只要 把  單擊 SECECTED 變成  單擊 CHECKED  就可以 顏色不受 其他 LISTVIEW 影響
只是 你要抓資料  就不能抓 SELECTED  而是要抓 CHECKED
 楼主| 发表于 2017-8-30 16:54:50 | 显示全部楼层
回复 46# chzj589

能理解嗎  看一下我的另外一個範例

在公司實在沒時間處理顏色問題  也不熟
這個範例的顏色是正常的.....

#PRE_UseX64=n
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
;#include <WinAPITheme.au3>
#include <GuiListView.au3>
#include <WinAPISys.au3>
#include <WinAPI.au3>
#include <GuiEdit.au3>
#include <array.au3>
#include <Misc.au3>
 
Global $B_DESCENDING[3] ; 排序用陣列
 
Global $hActLst
Global $bCtrlDown = False;listview控制項ctrl鍵按下標識
Global $hEdit, $Item = -1, $SubItem = 0
Global $hEnter, $aAccelKeys[1][2] = [["{ENTER}", $hEnter]];虛擬控制項的控制碼和綁定的快速鍵
 
Local $hUser32 = DllOpen("user32.dll")
Local $ichked = 0;勾選的行數
Local $tText = DllStructCreate("wchar Text[256]");建個結構,用來放listview列資料
Local $GUI, $hImage
Local $iITEM_COUNT = 1000, $aShowdata[$iITEM_COUNT][4], $aShowdata2[$iITEM_COUNT][4], $aShowdata3[$iITEM_COUNT][4];注意陣列最大專案數為2^24(16777216),所以$iITEM_COUNT = 4194304為二維陣列$aShowdata最大行數
Local $sSomeString = ""
Local $hGUI, $hListView, $hListView2, $hListView3
 
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$hGUI = GUICreate("ListView虛表 載入[" & UBound($aShowdata) & "]資料 核取方塊 原地編輯例子 By_Crossdoor", 600, 605)
 
$hListView = GUICtrlCreateListView("$hListView| | ", 2, 2, 295, 296, BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS, $LVS_OWNERDATA), $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER + $LVS_EX_CHECKBOXES)
;~ _WinAPI_SetWindowTheme(GUICtrlGetHandle($hListView), "Explorer");設置主題
 
;設置列寬
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 0, 110)
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 1, 80)
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 2, 80)
GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);設定數據總數
 
 
 
$hListView2 = GUICtrlCreateListView("$hListView2| | ", 300, 2, 295, 296, BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS, $LVS_OWNERDATA), $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER + $LVS_EX_CHECKBOXES)
;~ _WinAPI_SetWindowTheme(GUICtrlGetHandle($hListView), "Explorer");設置主題
 
;設置列寬
GUICtrlSendMsg($hListView2, $LVM_SETCOLUMNWIDTH, 0, 110)
GUICtrlSendMsg($hListView2, $LVM_SETCOLUMNWIDTH, 1, 80)
GUICtrlSendMsg($hListView2, $LVM_SETCOLUMNWIDTH, 2, 80)
GUICtrlSendMsg($hListView2, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);設定數據總數
 
 
$hListView3 = GUICtrlCreateListView("$hListView3| | ", 300, 300, 295, 296, BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS, $LVS_OWNERDATA), $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER + $LVS_EX_CHECKBOXES)
;~ _WinAPI_SetWindowTheme(GUICtrlGetHandle($hListView), "Explorer");設置主題
 
;設置列寬
GUICtrlSendMsg($hListView3, $LVM_SETCOLUMNWIDTH, 0, 110)
GUICtrlSendMsg($hListView3, $LVM_SETCOLUMNWIDTH, 1, 80)
GUICtrlSendMsg($hListView3, $LVM_SETCOLUMNWIDTH, 2, 80)
GUICtrlSendMsg($hListView3, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);設定數據總數
 
;===========創建並關聯圖像清單
$hImage = _GUIImageList_Create()
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 110)
_GUICtrlListView_SetImageList($hListView, $hImage, 1);分配圖像清單到清單視圖控制項$hListView
_GUICtrlListView_SetImageList($hListView2, $hImage, 1);分配圖像清單到清單視圖控制項$hListView2
 
$Button1 = GUICtrlCreateButton("選中行", 10, 310, 70, 25)
$Button2 = GUICtrlCreateButton("未選行", 80, 310, 70, 25)
$Button3 = GUICtrlCreateButton("修改", 150, 310, 70, 25)
$Button4 = GUICtrlCreateButton("清空", 220, 310, 70, 25)
GUISetState()
 
;==================在表單顯示後再初始化資料,因為初始化陣列資料比較慢
;如果先初始化陣列後顯示視窗,會卡很久,就造成虛表也很慢的假像
For $i = 0 To $iITEM_COUNT - 1
    ;重繪 刷新 listview 0-13行(讓ListView顯示陣列資料),不用太多行,只需要一屏的行數就就可以
    ;因為下拉滾動的時候listview會收到LVN_GETDISPINFO消息,這個消息我們在WM_NOTIFY內處理過了
    If $i = 18 Then
        GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, $i)
        GUICtrlSendMsg($hListView2, $LVM_REDRAWITEMS, 0, $i)
        GUICtrlSendMsg($hListView3, $LVM_REDRAWITEMS, 0, $i)
    EndIf
    
    $aShowdata[$i][0] = "爺爺" & $i
    $aShowdata[$i][1] = "爸爸" & $i
    $aShowdata[$i][2] = "兒子" & $i
    $aShowdata[$i][3] = 4096;核取方塊狀態4096未選中 8192選中
    
    $aShowdata2[$i][0] = "2爺爺" & $i
    $aShowdata2[$i][1] = "2爸爸" & $i
    $aShowdata2[$i][2] = "2兒子" & $i
    $aShowdata2[$i][3] = 4096;核取方塊狀態4096未選中 8192選中
    
    
    $aShowdata3[$i][0] = "3爺爺" & $i
    $aShowdata3[$i][1] = "3爸爸" & $i
    $aShowdata3[$i][2] = "3兒子" & $i
    $aShowdata3[$i][3] = 4096;核取方塊狀態4096未選中 8192選中
Next
 
While 1
    $bCtrlDown = _IsPressed("11", $hUser32);取ctrl按鍵的狀態
    Switch GUIGetMsg()
        Case -3
            ExitLoop
        Case $Button1
            $aShowdata[3][3] = 8192
            $aShowdata[7][3] = 8192
            GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 3, 7)
            
;~             $a = _GetChkIndex(8192)
;~             If $a[0] = -1 Then
;~                 MsgBox(32, "提示", "未勾選任何數據")
;~             Else
;~                 _ArrayDisplay($a, "勾選行的索引");陣列很大時,_ArrayDisplay會非常耗時
;~             EndIf
        Case $Button2
            $a = _GetChkIndex(4096)
            If $a[0] = -1 Then
                 MsgBox(32, "提示", "數據全都被勾選了。")
            Else
                ;MsgBox(32, "提示", "未勾選的數據有" & UBound($a) & "行")
                _ArrayDisplay($a, "未勾選行的索");陣列很大時,_ArrayDisplay會非常耗時
            EndIf
        Case $Button3
            If StringLen($sSomeString) Then
                $sSomeString = ""
            Else
                $sSomeString = Asc(Random(48, 255, 1))
            EndIf
            For $i = 0 To $iITEM_COUNT - 1
                $aShowdata[$i][0] = "爺爺" & $i & "-" & $sSomeString
                $aShowdata[$i][1] = "爸爸" & $i & "-" & $sSomeString
                $aShowdata[$i][2] = "兒子" & $i & "-" & $sSomeString
            Next
            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()
DllClose($hUser32)
 
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 $hListView
            Switch $iCode
                Case $LVN_COLUMNCLICK ; 點擊列頭排序
                    _SortItems($iIDFrom, $ilParam, $aShowdata)
                Case $NM_CUSTOMDRAW;自繪消息  處理選中行背景色
                    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)
                    Local $iDrawStage = DllStructGetData($tCustDraw, "DrawStage")
                    If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW ;request custom drawing of items
                    If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW ;request drawing each cell separately
                    If Not BitAND($iDrawStage, $CDDS_SUBITEM) Then Return $CDRF_DODEFAULT
                    _SetchkedBkClr($tCustDraw, $aShowdata, 0xFF9933) ;高亮藍 0xFF9933  更高亮藍 0xff4e00
                                        
                    Return $CDRF_NEWFONT
                Case $LVN_ITEMCHANGED ; An item has changed
                    _CtrlSel($iIDFrom, $ilParam, $aShowdata)
                Case $LVN_BEGINSCROLL ; 滾動事件開始
                    If IsHWnd($hEdit) Then _EndItemEdit($iIDFrom, $aShowdata);如果存在$hEdit控制項,則結束編輯                           
                Case $NM_CLICK;按一下
                    If IsHWnd($hEdit) Then _EndItemEdit($iIDFrom, $aShowdata)
                    _chkboxState($iIDFrom, $ilParam, $aShowdata);刷新核取方塊狀態
                Case $NM_DBLCLK ; 按兩下
                    _StartItemEdit($iIDFrom, $ilParam, $aShowdata);開始原地編輯
                Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   請求顯示資料
                    _LVN_GETDISPINFO($iIDFrom, $ilParam, $aShowdata)
            EndSwitch
        Case $hListView2
            Switch $iCode
                Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   請求顯示資料
                    _LVN_GETDISPINFO($iIDFrom, $ilParam, $aShowdata2)
                Case $LVN_COLUMNCLICK ; 點擊列頭排序
                    _SortItems($iIDFrom, $ilParam, $aShowdata2)
                Case $NM_CUSTOMDRAW;自繪消息  處理選中行背景色
                    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)
                    Local $iDrawStage = DllStructGetData($tCustDraw, "DrawStage")
                    If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW ;request custom drawing of items
                    If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW ;request drawing each cell separately
                    If Not BitAND($iDrawStage, $CDDS_SUBITEM) Then Return $CDRF_DODEFAULT
                    _SetchkedBkClr($tCustDraw, $aShowdata2, 0x738393)
                    Return $CDRF_NEWFONT
                Case $LVN_ITEMCHANGED ; An item has changed
                    _CtrlSel($iIDFrom, $ilParam, $aShowdata2)
                Case $LVN_BEGINSCROLL ; 滾動事件開始
                    If IsHWnd($hEdit) Then _EndItemEdit($iIDFrom, $aShowdata2);如果存在$hEdit控制項,則結束編輯
                Case $NM_CLICK;按一下
                    If IsHWnd($hEdit) Then _EndItemEdit($iIDFrom, $aShowdata2)
                    _chkboxState($iIDFrom, $ilParam, $aShowdata2)
                Case $NM_DBLCLK ; 按兩下
                    _StartItemEdit($iIDFrom, $ilParam, $aShowdata2)
            EndSwitch
        Case $hListView3
            Switch $iCode
                Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   請求顯示資料
                    _LVN_GETDISPINFO($iIDFrom, $ilParam, $aShowdata3)
                Case $LVN_COLUMNCLICK ; 點擊列頭排序
                    _SortItems($iIDFrom, $ilParam, $aShowdata3)
                Case $NM_CUSTOMDRAW;自繪消息  處理選中行背景色
                    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)
                    Local $iDrawStage = DllStructGetData($tCustDraw, "DrawStage")
                    If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW ;request custom drawing of items
                    If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW ;request drawing each cell separately
                    If Not BitAND($iDrawStage, $CDDS_SUBITEM) Then Return $CDRF_DODEFAULT
                    _SetchkedBkClr($tCustDraw, $aShowdata3, 0xD307AD, 0xE3F7ED)
                    Return $CDRF_NEWFONT
                Case $LVN_ITEMCHANGED ; An item has changed
                    _CtrlSel($iIDFrom, $ilParam, $aShowdata3)
                Case $LVN_BEGINSCROLL ; 滾動事件開始
                    If IsHWnd($hEdit) Then _EndItemEdit($iIDFrom, $aShowdata3);如果存在$hEdit控制項,則結束編輯
                Case $NM_CLICK;按一下
                    If IsHWnd($hEdit) Then _EndItemEdit($iIDFrom, $aShowdata3)
                    _chkboxState($iIDFrom, $ilParam, $aShowdata3)
                Case $NM_DBLCLK ; 按兩下
                    _StartItemEdit($iIDFrom, $ilParam, $aShowdata3)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
 
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    $iIDFrom = _WinAPI_LoWord($wParam)
    $iCode = _WinAPI_HiWord($wParam)
    Switch $lParam
        Case $hEdit
            Switch $iCode
                Case $EN_KILLFOCUS;編輯方塊失去焦點,結束編輯
                    Switch $hActLst
                        Case $hListView
                            _EndItemEdit($hListView, $aShowdata)
                        Case $hListView2
                            _EndItemEdit($hListView2, $aShowdata2)
                        Case $hListView3
                            _EndItemEdit($hListView3, $aShowdata3)
                    EndSwitch
                Case $EN_UPDATE
 
            EndSwitch
        Case $hEnter;虛擬控制項消息觸發  收到回車消息才觸發
            If IsHWnd($hEdit) Then
                If $SubItem = 0 Then
                    __ClickListViewItem($hActLst, $Item, True);使用點擊來結束編輯,省去判斷listview的資料陣列
                Else
                    __ClickListViewItem($hActLst, $Item)
                EndIf
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
 
Func _SetchkedBkClr(ByRef $tCustDraw, ByRef $aDataArray, $ihighBkClr = 0xF7D3AD, $idefBkclr = 0xFFFFFF)
    Local $iIndex = DllStructGetData($tCustDraw, "ItemSpec")
    If $aDataArray[$iIndex][3] = 4096 Then
        DllStructSetData($tCustDraw, "clrTextBk", $idefBkclr);BGR格式顏色值 默認背景色
    Else
        DllStructSetData($tCustDraw, "clrTextBk", $ihighBkClr);BGR格式顏色值 高亮背景色
                DllStructSetData($tCustDraw, "clrText", 0xFFFFFF) ;高亮後文字改為白色
    EndIf
EndFunc
 
Func _chkboxState($hlst, $ilParam, ByRef $aDataArray);刷新核取方塊狀態
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iIndex = DllStructGetData($tInfo, "Index")
    $x = DllStructGetData($tInfo, "X")
;    If ($x < 16) And (3 < $x) And (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hlst), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then;使用點擊的x座標來判斷是否在核取方塊上點擊
        If $aDataArray[$iIndex][3] = 4096 Then
            $ichked+=1
            $aDataArray[$iIndex][3] = 8192;4096未選中 8192選中
        Else
            $ichked-=1
            $aDataArray[$iIndex][3] = 4096;4096未選中 8192選中
        EndIf
        ;====立刻刷新核取方塊顯示狀態 重繪$iIndex項
        GUICtrlSendMsg($hlst, $LVM_REDRAWITEMS, $iIndex, $iIndex)
 ;   EndIf    
EndFunc
 
Func _SortItems($hlst, $ilParam, ByRef $aDataArray);排序
    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    $iSub = DllStructGetData($tInfo, "SubItem")
    _ArraySort($aDataArray, $B_DESCENDING[$iSub], 0, 0, $iSub)
    GUICtrlSendMsg($hlst, $LVM_REDRAWITEMS, 0, 20)
    $B_DESCENDING[$iSub] = Not $B_DESCENDING[$iSub]
EndFunc
 
Func _CtrlSel($hlst, $ilParam, ByRef $aDataArray);按住ctrl鍵點選item
    If $bCtrlDown Then;ctrl鍵按下
        $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
        Local $iIndex = DllStructGetData($tInfo, "Item")
        Local $iNewState = DllStructGetData($tInfo, "NewState")
        If $iIndex > -1 And $iNewState = BitOR($LVIS_FOCUSED, $LVIS_SELECTED) Then
            If $aDataArray[$iIndex][3] = 4096 Then
                $ichked+=1
                $aDataArray[$iIndex][3] = 8192;4096未選中 8192選中
            Else
                $ichked-=1
                $aDataArray[$iIndex][3] = 4096;4096未選中 8192選中
            EndIf
            $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
            DllStructSetData($tInfo, "State", $aDataArray[$iIndex][3]);設置核取方塊狀態
            ;====立刻刷新核取方塊顯示狀態 重繪$iIndex項
            GUICtrlSendMsg($hlst, $LVM_REDRAWITEMS, $iIndex, $iIndex)
        EndIf
    EndIf
EndFunc
 
Func _LVN_GETDISPINFO($hlst, $ilParam, ByRef $aDataArray)
    If Not IsArray($aDataArray) Then Return
    $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);判斷是否有LVIF_IMAGE屬性,有則設置列圖像。不設置_GUICtrlListView_SetImageList則無
 
    If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hlst), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then
        ;===============設置核取方塊資訊
        DllStructSetData($tInfo, "Mask", BitOR($LVIF_STATE, DllStructGetData($tInfo, "Mask")))
        DllStructSetData($tInfo, "StateMask", $LVIS_STATEIMAGEMASK)
        DllStructSetData($tInfo, "State", $aDataArray[$iIndex][3])
    EndIf
 
    DllStructSetData($tText, "Text", $aDataArray[$iIndex][$iSub]);列資料放入$tText結構
    DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));$tText結構的指標來設置列資料
    DllStructSetData($tInfo, "TextMax", StringLen($aDataArray[$iIndex][$iSub]));設置列資料字串長
EndFunc
 
Func _StartItemEdit($hlst, $ilParam, ByRef $aDataArray)
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $iIndex = DllStructGetData($tInfo, "Index")
    $iSub = DllStructGetData($tInfo, "SubItem")
    $x = DllStructGetData($tInfo, "X")
    If ($iIndex <> -1) And ($iSub >= 0) And ($x > 16) Then;點擊的x>16才回應原地編輯
        $hActLst = $hlst
        If _GUICtrlListView_EnsureVisible($hlst, $iIndex) Then GUICtrlSendMsg($hlst, $LVM_REDRAWITEMS, $iIndex, $iIndex + 1);確保列表視圖專案可見
        Local $alstPos = ControlGetPos($hGUI, "", $hlst)
        $Item = $iIndex
        $SubItem = $iSub
        ;==========計算編輯方塊座標
        Local $aRect = _GUICtrlListView_GetSubItemRect($hlst, $iIndex, $iSub)
        Local $iEdit_X = $aRect[0] + $alstPos[0] + 4
        Local $iEdit_Y = $aRect[1] + $alstPos[1] + 3
        Local $iEdit_Width = _GUICtrlListView_GetColumnWidth($hlst, $iSub) - 1
        Local $iEdit_Height = $aRect[3] - $aRect[1]
        If $iSub = 0 Then
            Local $i1 = 0, $i2 = 0
            If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hlst), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then $i1 = 17;判斷是否有核取方塊
            If _GUICtrlListView_GetImageList($hlst, 1) Then $i2 = 19;判斷是否有分配圖像清單到清單視圖控制項
            $iEdit_X += ($i2 + $i1)
            $iEdit_Width -= ($i2 + $i1)
        EndIf
        Local $iEdit = GUICtrlCreateInput($aDataArray[$iIndex][$iSub], $iEdit_X, $iEdit_Y, $iEdit_Width, $iEdit_Height, BitOR($WS_CHILD, $WS_VISIBLE, $ES_LEFT))
        GUICtrlSetFont($iEdit, 11)
        GUICtrlSetState($iEdit, $GUI_FOCUS)
        $hEdit = GUICtrlGetHandle($iEdit)
        _WinAPI_BringWindowToTop($hEdit)
        _GUICtrlEdit_SetSel($hEdit, 0, -1) ;全選編輯方塊文字
        Local $iEnter = GUICtrlCreateDummy()
        $hEnter = GUICtrlGetHandle($iEnter)
        GUISetAccelerators($aAccelKeys, $hGUI);在虛擬控制項上綁定一個回車快捷按鍵
    EndIf    
EndFunc
 
Func _EndItemEdit($hlst, ByRef $aDataArray)
    If ($Item < UBound($aDataArray, 1)) And ($SubItem < UBound($aDataArray, 2)) And ($hActLst == $hlst) Then
        Local $sText = _GUICtrlEdit_GetText($hEdit)
        _GUICtrlListView_SetItemText($hlst, $Item, $sText, $SubItem)
        If IsHWnd($hEdit) Then _WinAPI_DestroyWindow($hEdit)
        If IsHWnd($hEnter) Then _WinAPI_DestroyWindow($hEnter)
        $hEnter = Null
        $hEdit = Null
        If ($Item >= 0) Then $aDataArray[$Item][$SubItem] = $sText
        $Item = -1
        $SubItem = 0
    EndIf
EndFunc
 
Func _GetChkIndex($iChkState)
    Local $aIndex[1] = [-1], $j = 0
    If $ichked = 0 Then Return $aIndex
    If $iChkState = 8192 Then
        ReDim $aIndex[$ichked]
    Else
        ReDim $aIndex[UBound($aShowdata)-$ichked]
    EndIf
    For $i = 0 To UBound($aShowdata) -1
        If $aShowdata[$i][3] == $iChkState Then
            $aIndex[$j] = $i
            $j+=1
        EndIf
    Next
    Return $aIndex
EndFunc
 
Func __ClickListViewItem($hWnd, $iIndex, $baddX = False)
    If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
 
    Local $tRECT = _GUICtrlListView_GetItemRectEx($hWnd, $iIndex, $LVIR_LABEL)
    Local $tPoint = _WinAPI_PointFromRect($tRECT, True)
    $tPoint = _WinAPI_ClientToScreen($hWnd, $tPoint)
    Local $iX, $iY
    _WinAPI_GetXYFromPoint($tPoint, $iX, $iY)
    If $baddX Then $iX += DllStructGetData($tRECT, "Right")
    Local $iMode = Opt("MouseCoordMode", 1)
    Local $aPos = MouseGetPos()
    MouseClick("left", $iX, $iY, 1, 0)
    MouseMove($aPos[0], $aPos[1], 0)
    Opt("MouseCoordMode", $iMode)
EndFunc
 楼主| 发表于 2017-8-30 17:54:16 | 显示全部楼层
回复 46# chzj589

改好了 你看一下這個的效果

#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <GUIListView.au3>
#include <GuiImageList.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
;#include <WinAPIShellEx.au3>
#include <GUIEdit.au3>
;#include <WinAPIEx.au3>
 
Opt('GUIOnEventMode', 1)
 
Global $idListView, $hListView, $pListViewFunc, $idAddSingleSel, $idDelSingleSel, $hListView2, $Edit1, $Inputu7, $Listview2
Global $Inputu8, $idAddSingleSela
Example()
While 1
        Sleep(1000)
WEnd
 
Func Example()
        ; Create GUI
        GUICreate("ctrl+single-click --> single-click", 840, 610)
        GUISetOnEvent(-3, '_Exit')
        ; Create ListView
        $idListView = GUICtrlCreateListView("", 10, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE  )
        _GUICtrlListView_SetExtendedListViewStyle($idListView, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT+$LVS_EX_CHECKBOXES )
        $hListView = GUICtrlGetHandle($idListView)
       ; GUICtrlSetBkColor($idListView, 0xCDCDCD);0xECE9D8);
       ; _GUICtrlListView_SetBkColor($idListView, 14675183)
 
        _GUICtrlListView_InsertColumn($idListView, 0, "Column 1", 94)
        _GUICtrlListView_InsertColumn($idListView, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($idListView, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($idListView, 3, "Column 4", 94)
        $hImage = _GUIImageList_Create(1, 18);30?每行的?距(即网格高度)
        _GUICtrlListView_SetImageList($idListView, $hImage, 1)
        _GUICtrlListView_SetExtendedListViewStyle($idListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP+$LVS_EX_CHECKBOXES ))
 
        Local $iItems = 18
        For $i = 0 To $iItems - 1
                GUICtrlCreateListViewItem($i & "/Column 1|" & $i & "/Column 2|" & $i & "/Column 3|" & $i & "/Column 4", $idListView)
        Next
 
        $pListViewFunc = DllCallbackGetPtr(DllCallbackRegister("ListViewFunc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr"))
        _WinAPI_SetWindowSubclass($hListView, $pListViewFunc, 0, 0) ; $iSubclassId = 0, $pData = 0
 
        $idAddSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_AddSingleSel')
        $idDelSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_DelSingleSel')
        $Listview2 = GUICtrlCreateListView("", 420, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE)
        _GUICtrlListView_SetExtendedListViewStyle($Listview2, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT)
        Local $hListView2 = GUICtrlGetHandle($Listview2)
        ;GUICtrlSetBkColor($Listview2, 0xC0E0FF);0xECE9D8);
        ;_GUICtrlListView_SetBkColor($Listview2, 14675183)
        _GUICtrlListView_InsertColumn($Listview2, 0, "id", 54)
        _GUICtrlListView_InsertColumn($Listview2, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($Listview2, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($Listview2, 3, "Column 4", 94)
        $hImage = _GUIImageList_Create(1, 18);30?每行的?距(即网格高度)
        _GUICtrlListView_SetImageList($Listview2, $hImage, 1)
        _GUICtrlListView_SetExtendedListViewStyle($Listview2, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP))
        $Edit1 = GUICtrlCreateEdit("", 10, 400, 810, 200, $WS_VSCROLL + $ES_WANTRETURN)
        GUICtrlSetFont(-1, 13, 600, 0, "微?雅黑")
        ;GUICtrlSetColor(-1, 0x009900)
        $Inputu7 = GUICtrlCreateLabel("", 680, 560, 90, 17)
        GUICtrlSetState($Inputu7, $GUI_HIDE)
        $Inputu8 = GUICtrlCreateLabel("", 680, 590, 90, 17)
        GUICtrlSetState($Inputu8, $GUI_HIDE)
 
        $idAddSingleSela = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_AddSingleSela')
 
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
        GUISetState(@SW_SHOW)
EndFunc   ;==>Example
 
Func ListViewFunc($hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData)
        If $iMsg <> $WM_LBUTTONDOWN Then
                Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
                If Not @error Then
                        Return $result[0]
                Else
                        Return
                EndIf
        EndIf
        Switch $wParam
              Case 0x0001
                 If _GUICtrlListView_GetSelectedCount($idListView) Then
                     Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
                        If Not (@error Or $aHit[0] = -1) Then
                            If _GUICtrlListView_GetItemSelected($idListView, $aHit[0]) Then
                                 GUICtrlSendToDummy($idDelSingleSel, $aHit[0])
                            Else
                                GUICtrlSendToDummy($idAddSingleSel, $aHit[0])
                            EndIf
                        EndIf
                        Return 0
                                Else        
                                ;        If BitAND($lParam, 0xFFFF) > 16 Then
                                ;                Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
                                ;                IF _GUICtrlListView_GetItemChecked($idListView,$aHit[0])=True  Then
                                ;                        _GUICtrlListView_SetItemChecked($idListView,$aHit[0],False)
                                ;                Else
                                ;                        _GUICtrlListView_SetItemChecked($idListView,$aHit[0],True)
                                ;                EndIf
                                ;                GUICtrlSendMsg($hListView2, $LVM_REDRAWITEMS,$aHit[0], $aHit[0])

                                ;        EndIf        
                EndIf
              Case 0x0009
                        Return 0
        EndSwitch
        Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
        If Not @error Then
                Return $result[0]
        Else
                Return
        EndIf
        #forceref $iSubclassId, $pData
EndFunc   ;==>ListViewFunc
 
Func _AddSingleSel()
        Local $iItem = GUICtrlRead($idAddSingleSel)
        ;_GUICtrlListView_SetItemSelected($idListView, $iItem, True)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
                _GUICtrlListView_SetItemChecked($idListView,$iItem,True)
EndFunc   ;==>_AddSingleSel
Func _AddSingleSela()
        Local $iItem = GUICtrlRead($idAddSingleSela)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, True)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
        _GUICtrlListView_SetItemSelected($Listview2, $iItem, True)
        _GUICtrlListView_SetItemFocused($Listview2, $iItem)
        ;GUICtrlSetBkColor($idListView, 0xC0E0FF)
        ;_GUICtrlListView_SetBkColor($idListView, 14675183)
EndFunc   ;==>_AddSingleSela
Func _DelSingleSel()
        Local $iItem = GUICtrlRead($idDelSingleSel)
       ; _GUICtrlListView_SetItemSelected($idListView, $iItem, False)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
                _GUICtrlListView_SetItemChecked($idListView,$iItem,False)
        _DEL()
EndFunc   ;==>_DelSingleSel
Func _Exit()
        _WinAPI_RemoveWindowSubclass($hListView, $pListViewFunc, 0)
        GUIDelete()
        Exit
EndFunc   ;==>_Exit
 
Func _WinAPI_SetWindowSubclass($hWnd, $pSubclassProc, $idSubClass, $pData = 0)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'SetWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass, _
                        'dword_ptr', $pData)
        If @error Then Return SetError(@error, @extended, 0)
 
        Return $aRet[0]
EndFunc   ;==>_WinAPI_SetWindowSubclass
Func _WinAPI_RemoveWindowSubclass($hWnd, $pSubclassProc, $idSubClass)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'RemoveWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass)
        If @error Then Return SetError(@error, @extended, False)
        Return $aRet[0]
EndFunc   ;==>_WinAPI_RemoveWindowSubclass
Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $ilParam)
        Local $hWndFrom, $iCode
        Local $tNMHDR, $iCode, $hMenu, $hWnd, $iMsg
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $hListView;$hWndListView;?里改成你的listview的ID
                        Switch $iCode
                                Case $NM_DBLCLK
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $idd = DllStructGetData($tInfo, "Index")
                                        GUICtrlSetData($Inputu8, $idd)
                                        _ListView2()
                                Case $NM_CUSTOMDRAW
                                        Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam)
                                        Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage")
                                        If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
                                        If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW
                                        Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem")
                                        Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec")
                                        Local $iColor, $hDC, $Font1
                                        IF _GUICtrlListView_GetItemChecked($hListView,$iItem)=True  Then
                                           DllStructSetData($tCustDraw, "clrTextBk",0xFF901E);BGR格式顏色值 高亮背景色
                                           DllStructSetData($tCustDraw, "clrText", 0xFFFFFF) ;高亮後文字改為白色
                                        EndIf
 
                                        Switch $iItem
                                                Case 2;?目行?
                                                        $hDC = DllStructGetData($tCustDraw, "hdc")
                                                        If $iSubItem = 0 Then ;?置首列, 即?目
                                                                $iColor = RGB2BGR(0xFF0000)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                        ElseIf $iSubItem = 1 Then ;?置子?, 即列索引大于0?
                                                                $iColor = RGB2BGR(0x009900)
                                                                ;_WinAPI_SelectObject($hDC, $Font2) ;?置用于???景?文本的字体
                                                                DllStructSetData($tCustDraw, "clrText", $iColor) ;?置文本色
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xFFFF80)) ;?置文本背景色
                                                        ElseIf $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF00FF);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        ElseIf $iSubItem = 3 Then
                                                                $iColor = RGB2BGR(0x000080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        EndIf
                                                Case 4 ;?目行?
                                                        If $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF0080);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(16710321))
                                                        EndIf
                                                        Return $CDRF_NEWFONT
                                                                                EndSwitch
                                                                                                
                        EndSwitch
        EndSwitch
        Local $tagNMHDR, $Event, $hWndFrom, $IDFrom, $iCode
        Local $tagNMHDR = DllStructCreate("int;int;int", $ilParam)
        If @error Then Return $GUI_RUNDEFMSG
        $IDFrom = DllStructGetData($tagNMHDR, 2)
        $Event = DllStructGetData($tagNMHDR, 3)
        $tagNMHDR = 0
        Switch $IDFrom;???生事件的控件
                Case $hListView;$hWndListView;?里改成你的listview的ID
 
                Case $Listview2
                        Switch $Event; ???生的事件
                                Case $NM_CLICK ; 左?
                                        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
                                        Local $idd = _GUICtrlListView_GetItemText($Listview2, Number($Index), 0);DllStructGetData($tInfo, "Index")
                                        ;MsgBox(48, '提示', "小苹果提示"&$idd)
                                        GUICtrlSetData($Inputu7, $idd)
                                        If $iMsg <> $WM_LBUTTONDOWN Then
                                                Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "ilparam", $ilParam)
                                                If Not @error Then
                                                        Return $result[0]
                                                Else
                                                        Return
                                                EndIf
                                        EndIf
                                        Switch $wParam
                                                Case 0x0001
                                                        If _GUICtrlListView_GetSelectedCount($idListView) Then
                                                                Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($ilParam, 0xFFFF), BitShift($ilParam, 16))
                                                                If Not (@error Or $aHit[0] = -1) Then
                                                                        If _GUICtrlListView_GetItemSelected($idListView, $aHit[0]) Then
                                                                                ;GUICtrlSendToDummy($idDelSingleSel, $aHit[0])
                                                                        Else
                                                                                GUICtrlSendToDummy($idAddSingleSela, $aHit[0])
                                                                        EndIf
                                                                EndIf
                                                                Return 0
                                                        EndIf
                                                Case 0x0009
                                                        Return 0
                                        EndSwitch
                                        Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "ilparam", $ilParam)
                                        If Not @error Then
                                                Return $result[0]
                                        Else
                                                Return
                                        EndIf
 
                                Case $NM_DBLCLK ; ??
                                        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
                                        If Not StringLen($Index) Then; ?里用以判?是否?定了ListViewItem
                                                MsgBox(0, "", "未?定")
                                                Return
                                        EndIf
                                        ; MsgBox(0, 0, _GUICtrlListView_GetItemText($ListView2, Number($Index), 0))
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $idd = _GUICtrlListView_GetItemText($Listview2, Number($Index), 0);DllStructGetData($tInfo, "Index")
                                        ;MsgBox(48, '提示', "小苹果提示"&$idd)
                                        GUICtrlSetData($Inputu7, $idd)
 
                                Case $NM_RCLICK ; 右?
;~                                         ...
                        EndSwitch
        EndSwitch
 
 
 
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func RGB2BGR($iColor)
        Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc   ;==>RGB2BGR
Func _ListView2()
        GUICtrlSetData($Inputu7, "")
        ;$Strn = GUICtrlRead(GUICtrlRead($Listview2))
        ;$Strnspin = StringSplit($Strn, "|")
        Local $Inpa = GUICtrlRead($Inputu8)
        $cont = _GUICtrlListView_GetItemCount($hListView);取得??的行列?
        $h1 = $cont + 1
        For $id = 0 To $cont - 1
                $str = _GUICtrlListView_GetItemTextArray($hListView, $Inpa)
                $h1 = $str[1]
                $h2 = $str[2]
                $h3 = $str[3]
                $h4 = $str[4]
 
        Next
        ;$num1 = $cont + 1
        $Number = _GUICtrlListView_GetItemCount($Listview2)
        $num1 = $Number + 1
        _GUICtrlListView_AddItem($Listview2, $num1, $Number)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h2, 1)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h3, 2)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h4, 3)
        ;GUICtrlSetBkColor($Listview2, 0xC0E0FF)
        ;_GUICtrlListView_SetBkColor($Listview2, 14675183)
        ;_GUICtrlEdit_AppendText($Edit,"??:---------------------------------" & @CRLF)
        _GUICtrlEdit_AppendText($Edit1, "" & $h1 & "," & $h2 & "," & $h3 & "," & $h4 & @CRLF)
 
EndFunc   ;==>_ListView2
Func _DEL();?除
 
        Local $Inpa = GUICtrlRead($Inputu7) - 1
        GUICtrlSetData($Inputu7, $Inpa)
        _GUICtrlEdit_ReplaceLine($Edit1, '[\r\n]+$', '', 0, 1)
        _GUICtrlEdit_ReplaceLine($Edit1, $Inpa)
        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
        If $Index <> "" Then
                ;$msg = MsgBox(49, "?除??", "确定要?除???")
                ;If $msg == 1 Then
                $DEL = (_GUICtrlListView_DeleteItemsSelected(GUICtrlGetHandle($Listview2)))
                ;Else
                ;EndIf
        Else
                ;MsgBox(0, "提示", "????目", 1)
        EndIf
        GUICtrlSetData($Inputu7, "")
        GUICtrlSetData($Inputu8, "")
EndFunc   ;==>_DEL
 
;==========================================================================================
; ?明: 按指定的??字或行?替?或?除Edit??框行字符,可??是否替?整行、是否使用正?表?式。
; ?法: _GUICtrlEdit_ReplaceLine('控件句柄', '搜索字符或'行?[, '替?'[, 替?行?志[, 正??志]]])
; ??: '搜索字符串或'行?:    如果使用行?(0基)?不要用引?,否??作?字符串搜索;
;                  使用 -1 ?匹配最后一行
;    '替?'[可?]:          如'替?'字符?空(默?)???除。
;    替?行?志[可?]:      ?志 = 1 :包含??字的整行被替?;?志 = 0 ?替?搜索字符(默?)。
;                   如果搜索???行?,?此???效(整行被替?,等同于此???1)
;    正??志[可?]:        正??志 = 1 使用正?,? 0 不使用正?(默?),使用原始字符串匹配。
; 返回值:成功: 返回1;
;    失?: 返回0,并?置@Error?以下值:
;                    @Error = 1 ??框?空
;                  @Error = 2 ??文本?量超出限制(注:可用 GUICtrlSetLimit() ?置)
;                  @Error = 3 搜索的行?超出?有?行?范?
;                 @Error = 4 未搜索到匹配字符串
; 作者: Afan -- http://www.autoitx.com
;=====================================================================================start
 
Func _GUICtrlEdit_ReplaceLine($hWnd, $pattern, $replace = '', $flag = 0, $SRE = 0)
        Local $Str_all = GUICtrlRead($hWnd)
        If $Str_all = '' Then Return SetError(1, 0, 0)
        If _GUICtrlEdit_GetLimitText($hWnd) < StringLen($Str_all) Then Return SetError(2, 0, 0)
        Local $Index, $nLine, $strZY, $sR, $iStart, $iEnd, $str, $Len, $extended
        If IsNumber($pattern) Then
                $Index = _GUICtrlEdit_GetLineCount($hWnd)
                If $pattern = -1 Then
                        $nLine = $Index - 1
                Else
                        $nLine = $pattern
                        If $nLine > $Index - 1 Then Return SetError(3, 0, 0)
                EndIf
                $Len = StringLen(_GUICtrlEdit_GetLine($hWnd, $nLine))
                $iStart = _GUICtrlEdit_LineIndex($hWnd, $nLine)
                $iEnd = $iStart + $Len
        Else
                If $SRE = 0 Then
                        $strZY = '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)'
                        $pattern = StringRegExpReplace($pattern, $strZY, '\\$1')
                        $replace = StringRegExpReplace($replace, $strZY, '\\$1')
                EndIf
                $sR = StringRegExp($Str_all, $pattern, 1)
                If @error Then Return SetError(4, 0, 0)
                $extended = @extended
                If $flag = 1 Or $flag = -1 Then
                        $nLine = _GUICtrlEdit_LineFromChar($hWnd, $extended - 1)
                        $Len = StringLen(_GUICtrlEdit_GetLine($hWnd, $nLine))
                        $iStart = _GUICtrlEdit_LineIndex($hWnd, $nLine)
                        $iEnd = $iStart + $Len
                Else
                        $iEnd = $extended - 1
                        $str = $sR[0]
                        $Len = StringLen($str)
                        $iStart = $iEnd - $Len
                EndIf
        EndIf
        _GUICtrlEdit_SetSel($hWnd, $iStart, $iEnd)
        GUICtrlSetData($hWnd, $replace, 1)
        Return 1
EndFunc   ;==>_GUICtrlEdit_ReplaceLine
发表于 2017-8-30 18:18:18 | 显示全部楼层
回复 49# kk_lee69
谢谢!测试后:
第一行颜色还不行,
点击后,再点击不能返回原来颜色
 楼主| 发表于 2017-8-30 20:55:55 | 显示全部楼层
回复 50# chzj589

這樣就可以了  不過 你使用 _GUICtrlListView_GetSelectedIndices 這樣是讀取不到資料的喔

要改用 _GUICtrlListView_GetItemChecked

只改了 LISTVIEW1


#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <GUIListView.au3>
#include <GuiImageList.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
;#include <WinAPIShellEx.au3>
#include <GUIEdit.au3>
;#include <WinAPIEx.au3>
 
Opt('GUIOnEventMode', 1)
 
Global $idListView, $hListView, $pListViewFunc, $idAddSingleSel, $idDelSingleSel, $hListView2, $Edit1, $Inputu7, $Listview2
Global $Inputu8, $idAddSingleSela
Example()
While 1
        Sleep(1000)
WEnd
 
Func Example()
        ; Create GUI
        GUICreate("ctrl+single-click --> single-click", 840, 610)
        GUISetOnEvent(-3, '_Exit')
        ; Create ListView
        $idListView = GUICtrlCreateListView("", 10, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE  )
        _GUICtrlListView_SetExtendedListViewStyle($idListView, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT+$LVS_EX_CHECKBOXES )
        $hListView = GUICtrlGetHandle($idListView)
       ; GUICtrlSetBkColor($idListView, 0xCDCDCD);0xECE9D8);
       ; _GUICtrlListView_SetBkColor($idListView, 14675183)
 
        _GUICtrlListView_InsertColumn($idListView, 0, "Column 1", 94)
        _GUICtrlListView_InsertColumn($idListView, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($idListView, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($idListView, 3, "Column 4", 94)
        $hImage = _GUIImageList_Create(1, 18);30?每行的?距(即网格高度)
        _GUICtrlListView_SetImageList($idListView, $hImage, 1)
        _GUICtrlListView_SetExtendedListViewStyle($idListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP+$LVS_EX_CHECKBOXES ))
 
        Local $iItems = 18
        For $i = 0 To $iItems - 1
                GUICtrlCreateListViewItem($i & "/Column 1|" & $i & "/Column 2|" & $i & "/Column 3|" & $i & "/Column 4", $idListView)
        Next
 
        $pListViewFunc = DllCallbackGetPtr(DllCallbackRegister("ListViewFunc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr"))
        _WinAPI_SetWindowSubclass($hListView, $pListViewFunc, 0, 0) ; $iSubclassId = 0, $pData = 0
 
        $idAddSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_AddSingleSel')
        $idDelSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_DelSingleSel')
        $Listview2 = GUICtrlCreateListView("", 420, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE)
        _GUICtrlListView_SetExtendedListViewStyle($Listview2, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT)
        Local $hListView2 = GUICtrlGetHandle($Listview2)
        ;GUICtrlSetBkColor($Listview2, 0xC0E0FF);0xECE9D8);
        ;_GUICtrlListView_SetBkColor($Listview2, 14675183)
        _GUICtrlListView_InsertColumn($Listview2, 0, "id", 54)
        _GUICtrlListView_InsertColumn($Listview2, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($Listview2, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($Listview2, 3, "Column 4", 94)
        $hImage = _GUIImageList_Create(1, 18);30?每行的?距(即网格高度)
        _GUICtrlListView_SetImageList($Listview2, $hImage, 1)
        _GUICtrlListView_SetExtendedListViewStyle($Listview2, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP))
        $Edit1 = GUICtrlCreateEdit("", 10, 400, 810, 200, $WS_VSCROLL + $ES_WANTRETURN)
        GUICtrlSetFont(-1, 13, 600, 0, "微?雅黑")
        ;GUICtrlSetColor(-1, 0x009900)
        $Inputu7 = GUICtrlCreateLabel("", 680, 560, 90, 17)
        GUICtrlSetState($Inputu7, $GUI_HIDE)
        $Inputu8 = GUICtrlCreateLabel("", 680, 590, 90, 17)
        GUICtrlSetState($Inputu8, $GUI_HIDE)
 
        $idAddSingleSela = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_AddSingleSela')
 
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
        GUISetState(@SW_SHOW)
EndFunc   ;==>Example
 
Func ListViewFunc($hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData)
        If $iMsg <> $WM_LBUTTONDOWN Then
                Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
                If Not @error Then
                        Return $result[0]
                Else
                        Return
                EndIf
        EndIf
        Switch $wParam
              Case 0x0001
                 If _GUICtrlListView_GetSelectedCount($idListView) Then
                     Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
                        If Not (@error Or $aHit[0] = -1) Then
                            If _GUICtrlListView_GetItemSelected($idListView, $aHit[0]) Then
                                 GUICtrlSendToDummy($idDelSingleSel, $aHit[0])
                            Else
                                GUICtrlSendToDummy($idAddSingleSel, $aHit[0])
                            EndIf
                        EndIf
                        Return 0
                   Else    
                                       If BitAND($lParam, 0xFFFF) > 16 Then
                                               Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
                                               IF _GUICtrlListView_GetItemChecked($idListView,$aHit[0])=True  Then
                                                       _GUICtrlListView_SetItemChecked($idListView,$aHit[0],False)
                                               Else
                                                       _GUICtrlListView_SetItemChecked($idListView,$aHit[0],True)
                                               EndIf
                                               GUICtrlSendMsg($idListView, $LVM_REDRAWITEMS,$aHit[0], $aHit[0])
 
                                       EndIf   
                EndIf
              Case 0x0009
                        Return 0
        EndSwitch
        Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
        If Not @error Then
                Return $result[0]
        Else
                Return
        EndIf
        #forceref $iSubclassId, $pData
EndFunc   ;==>ListViewFunc
 
Func _AddSingleSel()
        Local $iItem = GUICtrlRead($idAddSingleSel)
                ; _GUICtrlListView_SetItemSelected($idListView, -1, False,True)
         _GUICtrlListView_SetItemChecked($idListView,$iItem,True)
       ; _GUICtrlListView_SetItemFocused($idListView, $iItem)

EndFunc   ;==>_AddSingleSel
Func _AddSingleSela()
        Local $iItem = GUICtrlRead($idAddSingleSela)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, True)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
        _GUICtrlListView_SetItemSelected($Listview2, $iItem, True)
        _GUICtrlListView_SetItemFocused($Listview2, $iItem)
        ;GUICtrlSetBkColor($idListView, 0xC0E0FF)
        ;_GUICtrlListView_SetBkColor($idListView, 14675183)
EndFunc   ;==>_AddSingleSela
Func _DelSingleSel()
        Local $iItem = GUICtrlRead($idDelSingleSel)
     ;  _GUICtrlListView_SetItemSelected($idListView, -1, False,True)
         _GUICtrlListView_SetItemChecked($idListView,$iItem,False)
                ; _GUICtrlListView_SetItemFocused($idListView, $iItem)
        _DEL()
EndFunc   ;==>_DelSingleSel
Func _Exit()
        _WinAPI_RemoveWindowSubclass($hListView, $pListViewFunc, 0)
        GUIDelete()
        Exit
EndFunc   ;==>_Exit
 
Func _WinAPI_SetWindowSubclass($hWnd, $pSubclassProc, $idSubClass, $pData = 0)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'SetWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass, _
                        'dword_ptr', $pData)
        If @error Then Return SetError(@error, @extended, 0)
 
        Return $aRet[0]
EndFunc   ;==>_WinAPI_SetWindowSubclass
Func _WinAPI_RemoveWindowSubclass($hWnd, $pSubclassProc, $idSubClass)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'RemoveWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass)
        If @error Then Return SetError(@error, @extended, False)
        Return $aRet[0]
EndFunc   ;==>_WinAPI_RemoveWindowSubclass
Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $ilParam)
        Local $hWndFrom, $iCode
        Local $tNMHDR, $iCode, $hMenu, $hWnd, $iMsg
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $hListView;$hWndListView;?里改成你的listview的ID
                        Switch $iCode
                                                                Case  $NM_CLICK
                                                                        _GUICtrlListView_SetItemSelected($idListView, -1, False)
                                Case $NM_DBLCLK
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $idd = DllStructGetData($tInfo, "Index")
                                        GUICtrlSetData($Inputu8, $idd)
                                        _ListView2()
                                Case $NM_CUSTOMDRAW
                                        Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam)
                                        Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage")
                                        If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
                                        If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW
                                        Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem")
                                        Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec")
                                        Local $iColor, $hDC, $Font1
                                        IF _GUICtrlListView_GetItemChecked($hListView,$iItem)=True  Then
                                           DllStructSetData($tCustDraw, "clrTextBk",0xFF901E);BGR格式顏色值 高亮背景色
                                           DllStructSetData($tCustDraw, "clrText", 0xFFFFFF) ;高亮後文字改為白色
                                                                                  ; GUICtrlSendMsg($idListView, $LVM_REDRAWITEMS,$iItem, $iItem)
                                        EndIf
 
                                        Switch $iItem
                                                Case 2;?目行?
                                                        $hDC = DllStructGetData($tCustDraw, "hdc")
                                                        If $iSubItem = 0 Then ;?置首列, 即?目
                                                                $iColor = RGB2BGR(0xFF0000)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                        ElseIf $iSubItem = 1 Then ;?置子?, 即列索引大于0?
                                                                $iColor = RGB2BGR(0x009900)
                                                                ;_WinAPI_SelectObject($hDC, $Font2) ;?置用于???景?文本的字体
                                                                DllStructSetData($tCustDraw, "clrText", $iColor) ;?置文本色
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xFFFF80)) ;?置文本背景色
                                                        ElseIf $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF00FF);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        ElseIf $iSubItem = 3 Then
                                                                $iColor = RGB2BGR(0x000080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        EndIf
                                                Case 4 ;?目行?
                                                        If $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF0080);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(16710321))
                                                        EndIf
                                                        Return $CDRF_NEWFONT
                                                                                EndSwitch
                                                                                                
                        EndSwitch
        EndSwitch
        Local $tagNMHDR, $Event, $hWndFrom, $IDFrom, $iCode
        Local $tagNMHDR = DllStructCreate("int;int;int", $ilParam)
        If @error Then Return $GUI_RUNDEFMSG
        $IDFrom = DllStructGetData($tagNMHDR, 2)
        $Event = DllStructGetData($tagNMHDR, 3)
        $tagNMHDR = 0
        Switch $IDFrom;???生事件的控件
                Case $hListView;$hWndListView;?里改成你的listview的ID
 
                Case $Listview2
                        Switch $Event; ???生的事件
                                Case $NM_CLICK ; 左?
                                        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
                                        Local $idd = _GUICtrlListView_GetItemText($Listview2, Number($Index), 0);DllStructGetData($tInfo, "Index")
                                        ;MsgBox(48, '提示', "小苹果提示"&$idd)
                                        GUICtrlSetData($Inputu7, $idd)
                                        If $iMsg <> $WM_LBUTTONDOWN Then
                                                Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "ilparam", $ilParam)
                                                If Not @error Then
                                                        Return $result[0]
                                                Else
                                                        Return
                                                EndIf
                                        EndIf
                                        Switch $wParam
                                                Case 0x0001
                                                        If _GUICtrlListView_GetSelectedCount($idListView) Then
                                                                Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($ilParam, 0xFFFF), BitShift($ilParam, 16))
                                                                If Not (@error Or $aHit[0] = -1) Then
                                                                        If _GUICtrlListView_GetItemSelected($idListView, $aHit[0]) Then
                                                                                ;GUICtrlSendToDummy($idDelSingleSel, $aHit[0])
                                                                        Else
                                                                                GUICtrlSendToDummy($idAddSingleSela, $aHit[0])
                                                                        EndIf
                                                                EndIf
                                                                Return 0
                                                        EndIf
                                                Case 0x0009
                                                        Return 0
                                        EndSwitch
                                        Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "ilparam", $ilParam)
                                        If Not @error Then
                                                Return $result[0]
                                        Else
                                                Return
                                        EndIf
 
                                Case $NM_DBLCLK ; ??
                                        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
                                        If Not StringLen($Index) Then; ?里用以判?是否?定了ListViewItem
                                                MsgBox(0, "", "未?定")
                                                Return
                                        EndIf
                                        ; MsgBox(0, 0, _GUICtrlListView_GetItemText($ListView2, Number($Index), 0))
                                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $idd = _GUICtrlListView_GetItemText($Listview2, Number($Index), 0);DllStructGetData($tInfo, "Index")
                                        ;MsgBox(48, '提示', "小苹果提示"&$idd)
                                        GUICtrlSetData($Inputu7, $idd)
 
                                Case $NM_RCLICK ; 右?
;~                                         ...
                        EndSwitch
        EndSwitch
 
 
 
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func RGB2BGR($iColor)
        Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc   ;==>RGB2BGR
Func _ListView2()
        GUICtrlSetData($Inputu7, "")
        ;$Strn = GUICtrlRead(GUICtrlRead($Listview2))
        ;$Strnspin = StringSplit($Strn, "|")
        Local $Inpa = GUICtrlRead($Inputu8)
        $cont = _GUICtrlListView_GetItemCount($hListView);取得??的行列?
        $h1 = $cont + 1
        For $id = 0 To $cont - 1
                $str = _GUICtrlListView_GetItemTextArray($hListView, $Inpa)
                $h1 = $str[1]
                $h2 = $str[2]
                $h3 = $str[3]
                $h4 = $str[4]
 
        Next
        ;$num1 = $cont + 1
        $Number = _GUICtrlListView_GetItemCount($Listview2)
        $num1 = $Number + 1
        _GUICtrlListView_AddItem($Listview2, $num1, $Number)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h2, 1)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h3, 2)
        _GUICtrlListView_AddSubItem($Listview2, $Number, $h4, 3)
        ;GUICtrlSetBkColor($Listview2, 0xC0E0FF)
        ;_GUICtrlListView_SetBkColor($Listview2, 14675183)
        ;_GUICtrlEdit_AppendText($Edit,"??:---------------------------------" & @CRLF)
        _GUICtrlEdit_AppendText($Edit1, "" & $h1 & "," & $h2 & "," & $h3 & "," & $h4 & @CRLF)
 
EndFunc   ;==>_ListView2
Func _DEL();?除
 
        Local $Inpa = GUICtrlRead($Inputu7) - 1
        GUICtrlSetData($Inputu7, $Inpa)
        _GUICtrlEdit_ReplaceLine($Edit1, '[\r\n]+$', '', 0, 1)
        _GUICtrlEdit_ReplaceLine($Edit1, $Inpa)
        $Index = _GUICtrlListView_GetSelectedIndices($Listview2)
        If $Index <> "" Then
                ;$msg = MsgBox(49, "?除??", "确定要?除???")
                ;If $msg == 1 Then
                $DEL = (_GUICtrlListView_DeleteItemsSelected(GUICtrlGetHandle($Listview2)))
                ;Else
                ;EndIf
        Else
                ;MsgBox(0, "提示", "????目", 1)
        EndIf
        GUICtrlSetData($Inputu7, "")
        GUICtrlSetData($Inputu8, "")
EndFunc   ;==>_DEL
 
;==========================================================================================
; ?明: 按指定的??字或行?替?或?除Edit??框行字符,可??是否替?整行、是否使用正?表?式。
; ?法: _GUICtrlEdit_ReplaceLine('控件句柄', '搜索字符或'行?[, '替?'[, 替?行?志[, 正??志]]])
; ??: '搜索字符串或'行?:    如果使用行?(0基)?不要用引?,否??作?字符串搜索;
;                  使用 -1 ?匹配最后一行
;    '替?'[可?]:          如'替?'字符?空(默?)???除。
;    替?行?志[可?]:      ?志 = 1 :包含??字的整行被替?;?志 = 0 ?替?搜索字符(默?)。
;                   如果搜索???行?,?此???效(整行被替?,等同于此???1)
;    正??志[可?]:        正??志 = 1 使用正?,? 0 不使用正?(默?),使用原始字符串匹配。
; 返回值:成功: 返回1;
;    失?: 返回0,并?置@Error?以下值:
;                    @Error = 1 ??框?空
;                  @Error = 2 ??文本?量超出限制(注:可用 GUICtrlSetLimit() ?置)
;                  @Error = 3 搜索的行?超出?有?行?范?
;                 @Error = 4 未搜索到匹配字符串
; 作者: Afan -- http://www.autoitx.com
;=====================================================================================start
 
Func _GUICtrlEdit_ReplaceLine($hWnd, $pattern, $replace = '', $flag = 0, $SRE = 0)
        Local $Str_all = GUICtrlRead($hWnd)
        If $Str_all = '' Then Return SetError(1, 0, 0)
        If _GUICtrlEdit_GetLimitText($hWnd) < StringLen($Str_all) Then Return SetError(2, 0, 0)
        Local $Index, $nLine, $strZY, $sR, $iStart, $iEnd, $str, $Len, $extended
        If IsNumber($pattern) Then
                $Index = _GUICtrlEdit_GetLineCount($hWnd)
                If $pattern = -1 Then
                        $nLine = $Index - 1
                Else
                        $nLine = $pattern
                        If $nLine > $Index - 1 Then Return SetError(3, 0, 0)
                EndIf
                $Len = StringLen(_GUICtrlEdit_GetLine($hWnd, $nLine))
                $iStart = _GUICtrlEdit_LineIndex($hWnd, $nLine)
                $iEnd = $iStart + $Len
        Else
                If $SRE = 0 Then
                        $strZY = '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)'
                        $pattern = StringRegExpReplace($pattern, $strZY, '\\$1')
                        $replace = StringRegExpReplace($replace, $strZY, '\\$1')
                EndIf
                $sR = StringRegExp($Str_all, $pattern, 1)
                If @error Then Return SetError(4, 0, 0)
                $extended = @extended
                If $flag = 1 Or $flag = -1 Then
                        $nLine = _GUICtrlEdit_LineFromChar($hWnd, $extended - 1)
                        $Len = StringLen(_GUICtrlEdit_GetLine($hWnd, $nLine))
                        $iStart = _GUICtrlEdit_LineIndex($hWnd, $nLine)
                        $iEnd = $iStart + $Len
                Else
                        $iEnd = $extended - 1
                        $str = $sR[0]
                        $Len = StringLen($str)
                        $iStart = $iEnd - $Len
                EndIf
        EndIf
        _GUICtrlEdit_SetSel($hWnd, $iStart, $iEnd)
        GUICtrlSetData($hWnd, $replace, 1)
        Return 1
EndFunc   ;==>_GUICtrlEdit_ReplaceLine
 楼主| 发表于 2017-8-31 01:09:08 | 显示全部楼层
回复 46# chzj589

如果你不介意 使用  checked 來判斷  其實下面的寫法更簡單....不需要使用 回調函數....


#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <GUIListView.au3>
#include <GuiImageList.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
;#include <WinAPIShellEx.au3>
#include <GUIEdit.au3>
;#include <WinAPIEx.au3>
 
Opt('GUIOnEventMode', 1)
 
Global $idListView, $hListView, $pListViewFunc, $idAddSingleSel, $idDelSingleSel
 
Example()
While 1
        Sleep(1000)
WEnd
 
Func Example()
        ; Create GUI
          GUICreate("ctrl+single-click --> single-click", 840, 610)
        GUISetOnEvent(-3, '_Exit')
                GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
        ; Create ListView
        $idListView = GUICtrlCreateListView("", 10, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE+$LVS_EX_CHECKBOXES)
        _GUICtrlListView_SetExtendedListViewStyle($idListView, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT+$LVS_EX_CHECKBOXES)
        $hListView = GUICtrlGetHandle($idListView)
 
        ; Add columns to ListView
        _GUICtrlListView_InsertColumn($idListView, 0, "Column 1", 94)
        _GUICtrlListView_InsertColumn($idListView, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($idListView, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($idListView, 3, "Column 4", 94)
 
        ; Fill ListView
        Local $iItems = 100
        For $i = 0 To $iItems - 1
                GUICtrlCreateListViewItem($i & "/Column 1|" & $i & "/Column 2|" & $i & "/Column 3|" & $i & "/Column 4", $idListView)
        Next
 
 
                 $Listview2 = GUICtrlCreateListView("", 420, 10, 400, 380, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE)

 
  
 
        ; Show GUI
        GUISetState(@SW_SHOW)
EndFunc   ;==>Example
 
Func _Exit()
    ;    _WinAPI_RemoveWindowSubclass($hListView, $pListViewFunc, 0)
        GUIDelete()
        Exit
EndFunc   ;==>_Exit
 

Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $ilParam)
        Local $hWndFrom, $iCode
        Local $tNMHDR, $iCode, $hMenu, $hWnd, $iMsg
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $hListView;$hWndListView;?里改成你的listview的ID
                        Switch $iCode
                                                        Case  $NM_CLICK
                                                                $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                                                $iIndex = DllStructGetData($tInfo, "Index")
                                                                $iSub = DllStructGetData($tInfo, "SubItem")
                                                                $aPOSLx = DllStructGetData($tInfo, "X")
                                                                If ($aPOSLx >=16) OR ($aPOSLx <=3 ) Then
                                  IF _GUICtrlListView_GetItemChecked($hListView,$iIndex)=True  Then
                                                                         _GUICtrlListView_SetItemChecked($idListView,$iIndex,False)
                                                                  Else
                                                                           _GUICtrlListView_SetItemChecked($idListView,$iIndex,True)
                                                                  EndIf
                                                                EndIf   
                                                                        _GUICtrlListView_SetItemSelected($idListView, -1, False)
                                                                        
                                                                Case $NM_RCLICK ; 右擊
                                                                        _GUICtrlListView_SetItemSelected($idListView, -1, False)

                                Case $NM_DBLCLK

                                Case $NM_CUSTOMDRAW
                                        Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam)
                                        Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage")
                                        If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
                                        If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW
                                        Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem")
                                        Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec")
                                        Local $iColor, $hDC, $Font1
                                        IF _GUICtrlListView_GetItemChecked($hListView,$iItem)=True  Then
                                           DllStructSetData($tCustDraw, "clrTextBk",0xFF901E);BGR格式顏色值 高亮背景色
                                           DllStructSetData($tCustDraw, "clrText", 0xFFFFFF) ;高亮後文字改為白色
                                                                                  ; GUICtrlSendMsg($idListView, $LVM_REDRAWITEMS,$iItem, $iItem)
                                        EndIf
 
                                        Switch $iItem
                                                Case 2;?目行?
                                                        $hDC = DllStructGetData($tCustDraw, "hdc")
                                                        If $iSubItem = 0 Then ;?置首列, 即?目
                                                                $iColor = RGB2BGR(0xFF0000)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                        ElseIf $iSubItem = 1 Then ;?置子?, 即列索引大于0?
                                                                $iColor = RGB2BGR(0x009900)
                                                                ;_WinAPI_SelectObject($hDC, $Font2) ;?置用于???景?文本的字体
                                                                DllStructSetData($tCustDraw, "clrText", $iColor) ;?置文本色
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xFFFF80)) ;?置文本背景色
                                                        ElseIf $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF00FF);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        ElseIf $iSubItem = 3 Then
                                                                $iColor = RGB2BGR(0x000080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                ;DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xC0C0C0))
                                                        EndIf
                                                Case 4 ;?目行?
                                                        If $iSubItem = 2 Then
                                                                $iColor = RGB2BGR(0xFF0080);0x008080)
                                                                ;_WinAPI_SelectObject($hDC, $Font1)
                                                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(16710321))
                                                        EndIf
                                                        Return $CDRF_NEWFONT
                                                                                EndSwitch
                                                                                                
                        EndSwitch
        EndSwitch

 
 
 
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Func RGB2BGR($iColor)
        Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc   ;==>RGB2BGR
发表于 2017-8-31 09:19:52 | 显示全部楼层
回复 52# kk_lee69
早上测试,通过了。谢谢
发表于 2017-8-31 12:04:40 | 显示全部楼层
回复 52# kk_lee69
测试效果,好玩

本帖子中包含更多资源

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

×
发表于 2017-8-31 16:38:10 | 显示全部楼层
本帖最后由 yamakawa 于 2017-8-31 17:12 编辑

我也来玩玩
随便弄的,,见笑见笑
闲的无聊,随手改了下。。。
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
;#include <WinAPITheme.au3>
#include <GuiListView.au3>
#include <WinAPISys.au3>
#include <WinAPI.au3>
#include <GuiEdit.au3>
#include <array.au3>
#include <Misc.au3>

;----------
Global $hGui, $lListView, $rListView
Global $test,$copy,$del
Global $iSelItem


;-----------

$hGui = GUICreate("Test for multiCheck listview", 850, 350, -1, -1)
;=======左边列表
$lListView = GUICtrlCreateListView("", 5, 10, 380, 280)
_GUICtrlListView_SetExtendedListViewStyle($lListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
_GUICtrlListView_AddColumn($lListView, "列一", 85, 2)
_GUICtrlListView_AddColumn($lListView, "列二", 85, 2)
_GUICtrlListView_AddColumn($lListView, "列三", 85, 2)
_GUICtrlListView_AddColumn($lListView, "列四", 85, 2)
For $i = 0 To 99
        _GUICtrlListView_AddItem($lListView, "行" & $i + 1 & "列 1")
        For $ii = 1 To 3
                _GUICtrlListView_AddSubItem($lListView, $i, "行" & $i + 1 & "列 " & $ii + 1, $ii)
        Next
Next
;======右边列表
$rListView = GUICtrlCreateListView("", 465, 10, 380, 280)
_GUICtrlListView_SetExtendedListViewStyle($rListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
_GUICtrlListView_AddColumn($rListView, "列1", 85, 2)
_GUICtrlListView_AddColumn($rListView, "列2", 85, 2)
_GUICtrlListView_AddColumn($rListView, "列3", 85, 2)
_GUICtrlListView_AddColumn($rListView, "列4", 85, 2)

;============================加个按钮,测试用)
$test = GUICtrlCreateButton("   test    ", 20, 300)
$del = GUICtrlCreateButton("   Del   ",465,300)
$copy = GUICtrlCreateButton("Copy >>",400,150)
;=======随机复选几个
For $i = 0 To 9
        If Not _GUICtrlListView_GetItemChecked($lListView, $i) Then _GUICtrlListView_SetItemChecked($lListView, Random(0, 12, 1))
Next
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()

While 1
        Switch GUIGetMsg()
                Case -3
                        Exit
                Case $del
                    _GUICtrlListView_DeleteAllItems($rListView)
                Case $copy
                    _GUICtrlListView_BeginUpdate($rListView)
                    _GUICtrlListView_DeleteAllItems($rListView)
                        For $i = 0 To 99
                                If _GUICtrlListView_GetItemChecked($lListView, $i) Then GUICtrlCreateListViewItem( _GUICtrlListView_GetItemTextString($lListView, $i) ,$rListView)
                        Next
                            _GUICtrlListView_EndUpdate($rListView)
                Case $test
                        ConsoleWrite("!=====当前选中项=====" & @CRLF)
                        For $i = 0 To 99
                                If _GUICtrlListView_GetItemChecked($lListView, $i) Then ConsoleWrite("-----------" & $i + 1 & @CRLF)
                        Next
                        ConsoleWrite("+=====================" & @CRLF)
        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_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
                                        Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $Index = DllStructGetData($tInfo, "Index"), _
                                                        $SubItem = DllStructGetData($tInfo, "SubItem"), _
                                                        $X = DllStructGetData($tInfo, "X")
                                        _GUICtrlListView_RedrawItems($hWndFrom, $Index, $Index) 
                                Case -150, -177 ;虚拟列表用。。。显示列表
                                Case $NM_CUSTOMDRAW
                                        Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam)
                                        Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")
                                        Switch $dwDrawStage 
                                                Case $CDDS_PREPAINT
                                                        Return $CDRF_NOTIFYITEMDRAW 
                                                Case $CDDS_ITEMPREPAINT
                                                        Return $CDRF_NOTIFYSUBITEMDRAW
                                                Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) 
                                                        Local $iItem = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") 
                                                        Local $iSubitem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubitem")
                                                        Local $hDC = DllStructGetData($tNMLVCUSTOMDRAW, 'hdc')

                                                        Switch $iItem
                                                                Case 0 To 9 
                                                                        $iColor1 = RGB2BGR(0xFBFFD8)
                                                                        $iColor2 = RGB2BGR(-1)
                                                                        $iColor3 = RGB2BGR(0xFF0000)
                                                                        If Mod($iSubitem, 2) Then 
                                                                                DllStructSetData($tNMLVCUSTOMDRAW, 'clrTextBk', $iColor1)
                                                                                DllStructSetData($tNMLVCUSTOMDRAW, 'clrText', 0)
                                                                        Else 
                                                                                DllStructSetData($tNMLVCUSTOMDRAW, 'clrTextBk', $iColor2)
                                                                                DllStructSetData($tNMLVCUSTOMDRAW, 'clrText', $iColor3)
                                                                        EndIf
                                                                Case 10 To 19 
                                                                        $iColor1 = RGB2BGR(0xFBFFD8)
                                                                        $iColor2 = RGB2BGR(0x3DF8FF)
                                                                        If Mod($iItem, 2) Then
                                                                                If Mod($iSubitem, 2) Then
                                                                                        DllStructSetData($tNMLVCUSTOMDRAW, 'clrTextBk', $iColor1)
                                                                                Else
                                                                                        DllStructSetData($tNMLVCUSTOMDRAW, 'clrTextBk', $iColor2)
                                                                                EndIf
                                                                        Else
                                                                                If Mod($iSubitem, 2) Then
                                                                                        DllStructSetData($tNMLVCUSTOMDRAW, 'clrTextBk', $iColor2)
                                                                                Else
                                                                                        DllStructSetData($tNMLVCUSTOMDRAW, 'clrTextBk', $iColor1)
                                                                                EndIf
                                                                        EndIf
                                                                Case 20 To 29
                                                                        $iColor1 = RGB2BGR(0xFBFFD8)
                                                                        $iColor2 = RGB2BGR(-1)
                                                                        If Mod($iItem, 2) Then 
                                                                                DllStructSetData($tNMLVCUSTOMDRAW, 'clrTextBk', $iColor2)
                                                                        Else
                                                                                DllStructSetData($tNMLVCUSTOMDRAW, 'clrTextBk', $iColor1)
                                                                        EndIf
                                                        EndSwitch
                                                        If _GUICtrlListView_GetItemChecked($lListView, $iItem) Then $tNMLVCUSTOMDRAW.ClrTextbk = 0xff00cc
                                        EndSwitch
                                        Return $CDRF_NEWFONT 
                                Case $LVN_ITEMCHANGED 
                                        Local $tNMLISTVIEW = DllStructCreate($tagNMLISTVIEW, $ilParam)
                                        If Not _GUICtrlListView_GetItemChecked($lListView, DllStructGetData($tNMLISTVIEW, "Item")) Then
                                                _GUICtrlListView_SetItemChecked($lListView, DllStructGetData($tNMLISTVIEW, "Item"))
                                        Else
                                                _GUICtrlListView_SetItemChecked($lListView, DllStructGetData($tNMLISTVIEW, "Item"), False)
                                        EndIf
                                        $iSelItem = DllStructGetData($tNMLISTVIEW, "Item")
                                        _GUICtrlListView_SetItemSelected($hWndFrom, $iSelItem, False) 
                                        _GUICtrlListView_SetItemState($hWndFrom, $iSelItem, 0, $LVIS_FOCUSED)

                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func RGB2BGR($iColor)
        Return StringRegExpReplace($iColor, "0x(..)(..)(..)", "0x$3$2$1")
EndFunc   ;==>RGB2BGR
 楼主| 发表于 2017-8-31 23:58:55 | 显示全部楼层
回复 55# yamakawa

懂  VB 嗎??

http://www.vbforums.com/showthre ... -selected-backcolor

可否看一下這篇  上面同樣有 失去焦點後  會變灰色的疑問  有人通過
WM_KILLFOCUS

可阻止變色  可惜那是VB  我只看得懂 AU3
 楼主| 发表于 2017-9-1 00:37:31 | 显示全部楼层
回复 55# yamakawa

這位大哥  有件事情 還得請您幫幫忙 !!!

根據  chzj589 的希望 他其實是 希望 失去焦點後 不要 變成灰色

而根據我的了解  我給了他一個解決方案  我使用的是 逃避 SELECTED 的狀態
然後 自繪背景色的方法.....

但是 我的另外一篇 有提到 改變選取的顏色方法  我測試過了 選取的顏色 好像也不會變灰色

如果我們把兩者合併.................

不逃避 SELECTED 狀態  而直接改變 SECECTED 的顏色.....

這樣是否 也可以達到 不要變成灰色呢??
发表于 2017-9-1 08:47:11 | 显示全部楼层
回复 56# kk_lee69


    你给的那个链接,也是用的控件子类化技术。。俺还没吃透。。。试试吧。。。要耐心哦俺也不知道能不能搞定
发表于 2017-9-1 09:13:49 | 显示全部楼层
回复 58# yamakawa
55楼的例子里"   Del   ",能全部删除列表2的数据。
我是:
左键双击第一列表框条目,选择的条目添加显示在第二列表,选择的数据显示在编辑框,
左键单击第二列表框条目,右键单击第一列表框对应条目,删除第二列表框选择条目与对应编辑框数据。
请教,
能不用左键单击第二列表框条目,直接右键单击第一列表框对应条目,就能删除第二列表框选择条目吗?
发表于 2017-9-1 09:28:19 | 显示全部楼层
回复 59# chzj589
刚才问题没说清楚。

能不用左键单击第二列表框条目,直接右键单击第一列表框选择高亮条目,就能删除第二列表框对应条目吗?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 16:36 , Processed in 0.089346 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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