Общий раздел по AutoIt > GUI - Графический интерфейс пользователя

[Элементы GUI] ListView: как отловить щелчок по чекбоксу?

(1/2) > >>

avmaksimov:
Хочу сделать так, чтобы по клику менялся чек-бокс. Всё ок, только теперь когда щелкаешь по чек-боксу, то он сам не меняется. Почему? Потому что он меняет значение и потом срабатывает клик, который ещё раз инвертирует значение (или наоборот).

Использую сообытие $NM_CLICK. Так вот для первой колонки он совпадает: что для чек-бокса, что по тексту. Это как-то можно побороть? Может быть, я что-то делаю не так?

Для иллюстрации доработал чуть пример из GUICtrlListView_ClickItem, добавив чек-боксы.

Помогите, пожалуйста.

Khaibit:
Код: AutoIt _GUICtrlListView_SetItemChecked

_GUICtrlListView_GetItemChecked


Код: AutoIt Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $g_idListView
    If Not IsHWnd($g_idListView) Then $hWndListView = GUICtrlGetHandle($g_idListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    _GUICtrlListView_SetItemChecked($hWndListView, DllStructGetData($tInfo, "Index"));<<<<<<<<<<<<<<<<<
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

avmaksimov:

--- Цитата: Khaibit от Июль 30, 2018, 18:24:18 ---Код: AutoIt _GUICtrlListView_SetItemChecked

_GUICtrlListView_GetItemChecked

--- Конец цитаты ---
Да, я в курсе и на клик как раз стоит инверсия. Так вот вопрос в том, как отличить клик в первой колонке от клика по чеку? Иначе чек два раза состояние меняет, то есть возвращается к своему же.

Khaibit:
Код: AutoIt Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $g_idListView
    If Not IsHWnd($g_idListView) Then $hWndListView = GUICtrlGetHandle($g_idListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $index = DllStructGetData($tInfo, "Index")
                    Local $iX = DllStructGetData($tInfo, "X")
                    Local $aIconRect = _GUICtrlListView_GetItemRect($hWndListView, $index, 2)
                    If $iX > $aIconRect[0]  And $iX < $aIconRect[2] Then
                        If _GUICtrlListView_GetItemChecked($hWndListView, $index) = 0 Then
                            _GUICtrlListView_SetItemChecked($hWndListView, $index, 1)
                        Else
                            _GUICtrlListView_SetItemChecked($hWndListView, $index, 0)
                        EndIf
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

avmaksimov:
Khaibit
спасибо. Очень помогли.  :laugh: :laugh: :laugh: :IL_AutoIt_1:

Только чуть поменял вашу проверку на Код: AutoIt If (DllStructGetData($tInfo, "SubItem") > 0) Or ($iX > $aIconRect[0]  And $iX < $aIconRect[2]) Then
, а-то клики не срабатывали в других колонках!

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии