kk_lee69 发表于 2012-8-27 01:15:01

[已解决] ListView 加上 CheckBox 风格后…CheckBox 如何变成单选的…

本帖最后由 kk_lee69 于 2012-9-1 02:48 编辑

ListView 加上 CheckBox 风格后…CheckBox 如何变成单选的….
也就是說選了一個項目後 CheckBOX 要打勾 然後 變成藍色高亮

如果換了項目 checkbox 的 打勾也要跟著換   只能單選

而把 checkbox 打勾後項目要出現選定的藍色高亮......

能將這兩者 掛鉤在一起嗎??


感謝 蛋大 的 幫忙 完成了代碼~~~~今將代碼範例 整理如下:


#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
#include <Array.au3>


$Form1 = GUICreate("Form1", 800, 600)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")


Local $iExWindowStyle = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE,$LVS_EX_CHECKBOXES,$LVS_EX_SIMPLESELECT)
Local $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES,$LVS_EX_DOUBLEBUFFER,$LVS_EX_CHECKBOXES,$LVS_EX_SIMPLESELECT)



$ListView1 = GUICtrlCreateListView("A      |B   |", 8, 8, 300, 200, -1, $iExWindowStyle)
GUISetState(@SW_SHOW)
For $I = 1 To 10
      GUICtrlCreateListViewItem($I, $ListView1)
Next

$hListView = GUICtrlGetHandle($Listview1)

_GUICtrlListView_SetExtendedListViewStyle($ListView1, $iExListViewStyle)


Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE



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

        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam); $tagNMHDR - Contains information about a notification message
        $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
        $iCode = DllStructGetData($tNMHDR, 'Code')

        Switch $hWndFrom
                Case GuiCtrlGetHandle($ListView1)
                        Switch $iCode
                                Case $NM_CLICK ; Sent by a list-view control when user clicks an item with left mouse button
                                        Local $aHit = _GUICtrlListView_HitTest($hListView)
                                        If $aHit Then _GUICtrlListView_ClickItem($hListView, $aHit)
                                        If $aHit <> -1 Then
                                                $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                                Local $Index = DllStructGetData($tInfo, "Index")
                                                _GUICtrlListView_SetItemChecked($hListView, -1, False)
                                                _GUICtrlListView_SetItemChecked($hListView, $Index)
                                        Else
                                                _GUICtrlListView_SetItemChecked($hListView, -1, False)
                                        EndIf
                                                                       
                        EndSwitch
        EndSwitch
EndFunc

kk_lee69 发表于 2012-8-29 12:00:03

自己可恥的推一下 @@

qqgghh1 发表于 2012-8-29 13:38:14

我晕了,繁体字、几个打钩。

kk_lee69 发表于 2012-8-29 17:48:47

利用 P版 的 ListView 擴展消息   只能做出一半 ......@@

                                       
      Case $LVN_SELCHANGED ; 所選條目已經改變。
                Local $tChanged, $iItem, $iPreviousItem, $iFlags, $sFlags = "Left"

                $tChanged = DllStructCreate($tagLISTVIEW_SELCHANGED, $ilParam)
                $iItem = DllStructGetData($tChanged, "CurrentItem") ; 當前所選。
                $iPreviousItem = DllStructGetData($tChanged, "PreviousItem") ; 之前所選。
                $iFlags = DllStructGetData($tChanged, "ChangeFlags") ; 選擇標識。
                If ($iFlags = $LVCF_RBUTTON) Then $sFlags = "Right"

                _GUICtrlStatusBar_SetText($hStatusBar, "Current: " & $iItem, 0)
                _GUICtrlStatusBar_SetText($hStatusBar, "Previous: " & $iPreviousItem, 1)
                _GUICtrlStatusBar_SetText($hStatusBar, "Flags: " & $sFlags & " Button", 2)
                                ;_GUICtrlListView_SetItemChecked($hListView,$iItem)
                                _GUICtrlListView_SetItemChecked($hListView,$iItem)
                                _GUICtrlListView_SetItemChecked($hListView,$iPreviousItem,0)
                                ;_GUICtrlListView_SetItemSelected($hListView,$iItem,1,1)
                                ;_GUICtrlListView_SetItemSelected($hListView,$iPreviousItem,0,0)

andersonljw 发表于 2012-8-30 12:42:31

跟踪中。。。备留。。。肯定有用

syhsieh 发表于 2012-8-31 14:40:21

看了老半天,还是不懂意思
可有图解说?

kk_lee69 发表于 2012-8-31 15:25:56

netegg 发表于 2012-8-31 18:47:05

.....
Case $NM_CLICK ; 鼠标左键点击项目时由控件发送
      $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
       Local $Index= DllStructGetData($tInfo, "Index")
       _GUICtrlListView_SetItemChecked($hListView, -1, False)
       _GUICtrlListView_SetItemChecked($hListView, $Index)
------

邪恶海盗 发表于 2012-8-31 22:31:53

有点看不懂,围观一下...

kk_lee69 发表于 2012-8-31 23:08:52

回复 9# netegg

感謝 蛋大的代碼...這點就是我上面說的 只能做一半.... 因為當你點選CHECKBOX 並不會自動選取項目.....CHECKBOX 還是複選..... 簡單的說 我想做到的是不管你點哪裡 項目也好 CHECKBOX 也好.....只允許單選然後要設為選中高亮 跟 打勾

netegg 发表于 2012-8-31 23:14:09

本帖最后由 netegg 于 2012-9-1 00:57 编辑

回复 kk_lee69

不太理解你的意思了,不是复选框实现单选效果的意思吗?

是要点击复选框的时候实现选取?

kk_lee69 发表于 2012-8-31 23:36:34

回复 12# netegg

上面的 的程式 當我點選 LISTVIEW 上面5號的位置的時候 會自動幫我打勾 CHECKBOX 這點沒問題......

但是 當我 不去點選5 而是 直接到5的前面去打勾 的時候.....並不會幫我自動把5 Selected

不過 剛剛在回答這個問題的時候 我再度CHECK 了一下 應該 只差在 選取而已

kk_lee69 发表于 2012-8-31 23:41:21

回复 12# netegg

上面的 的程式 當我點選 LISTVIEW 上面5號的位置的時候 會自動幫我打勾 CHECKBOX 這點沒問題......

但是 當我 不去點選5 而是 直接到5的前面去打勾 的時候.....並不會幫我自動把5 Selected

不過 剛剛在回答這個問題的時候 我再度CHECK 了一下 應該 只差在 選取而已

加上這行之後點 CHECKBOX會自動選取但是卻不會 打勾
_GUICtrlListView_SetItemSelected($ListView1,$Index)

不過 有點卡卡的....好像打勾沒有很順呢?? 是不是因為 抓取的 單擊事件的關係

netegg 发表于 2012-9-1 00:58:07

上面那段代码里如下加个子函数,再试试

Func _ListView_Click()
    Local $aHit
    $aHit = _GUICtrlListView_HitTest($hListView)
    If $aHit Then
      _GUICtrlListView_clickitem($hListView, $aHit)
    EndIf
EndFunc   ;==>_ListView_Click

kk_lee69 发表于 2012-9-1 01:19:19

回复 15# netegg

點擊效果 變順很多 但是想要的單選效果 變不見了.....



我看過 P版的 擴展樣式那個 UDF.... 上面的 ITEM 改變事件資料的結構上....有 目前選取的有 上次選取的...

但是 CHECKBOX 改變事件上 只有當前的....所以...一直搞不出來@@
页: [1] 2
查看完整版本: [已解决] ListView 加上 CheckBox 风格后…CheckBox 如何变成单选的…