Автор Тема: [Элементы GUI] ListView: как отловить щелчок по чекбоксу?  (Прочитано 748 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн avmaksimov [?]

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

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

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

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


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Русское сообщество AutoIt


Оффлайн Khaibit [?]

  • Осваивающий
  • **
  • Сообщений: 74
  • Репутация: 20
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.6.1
Код: AutoIt [Выделить]


Код: 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 [?]

  • Новичок
  • *
  • Сообщений: 40

  • Автор темы
  • Репутация: 2
    • Награды
Код: AutoIt [Выделить]
Да, я в курсе и на клик как раз стоит инверсия. Так вот вопрос в том, как отличить клик в первой колонке от клика по чеку? Иначе чек два раза состояние меняет, то есть возвращается к своему же.

Помечен как лучший ответ пользователем avmaksimov Отправлен Июль 31, 2018, 14:19:13

Оффлайн Khaibit [?]

  • Осваивающий
  • **
  • Сообщений: 74
  • Репутация: 20
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.6.1
Код: 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


Русское сообщество AutoIt

Re: [Элементы GUI] ListView: как отловить щелчок по чекбоксу?
« Ответ #3 Отправлен: Июль 31, 2018, 02:01:49 »

Оффлайн avmaksimov [?]

  • Новичок
  • *
  • Сообщений: 40

  • Автор темы
  • Репутация: 2
    • Награды
Khaibit
спасибо. Очень помогли.  :laugh: :laugh: :laugh: :IL_AutoIt_1:

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

, а-то клики не срабатывали в других колонках!

Оффлайн Tempo [?]

  • Продвинутый
  • ***
  • Сообщений: 404
  • Репутация: 93
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include <GUIConstants.au3>
#include <GUIListView.au3>

GUICreate("", 400, 400)
Global $g_idLV = GUICtrlCreateListView("Item|SubItem", 5, 5, 390, 390, -1, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))
For $i = 0 To 10
    GUICtrlCreateListViewItem("Item " & $i & "|" & "SubItem " & $i, $g_idLV)
Next
_GUICtrlListView_SetColumnWidth($g_idLV, 0, $LVSCW_AUTOSIZE_USEHEADER)
_GUICtrlListView_SetColumnWidth($g_idLV, 1, $LVSCW_AUTOSIZE_USEHEADER)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $idFrom, $iCode
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $idFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $idFrom
        Case $g_idLV
            Switch $iCode
                Case $NM_CLICK
                    Local $tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    Local $aHit = _GUICtrlListView_HitTest($hWndFrom, DllStructGetData($tNMITEMACTIVATE, "X"), DllStructGetData($tNMITEMACTIVATE, "Y"))
                    If Not @error And $aHit[0] <> -1 And ($aHit[2] Or $aHit[3]) Then _GUICtrlListView_SetItemChecked($hWndFrom, $aHit[0], Not _GUICtrlListView_GetItemChecked($hWndFrom, $aHit[0]))
            EndSwitch
    EndSwitch
EndFunc   ;==>WM_NOTIFY
 

« Последнее редактирование: Июль 31, 2018, 14:38:43 от Tempo »

Оффлайн avmaksimov [?]

  • Новичок
  • *
  • Сообщений: 40

  • Автор темы
  • Репутация: 2
    • Награды
Tempo, спасибо. Ещё лучше!  :o :beer: :ok:

Русское сообщество AutoIt

Re: [Элементы GUI] ListView: как отловить щелчок по чекбоксу?
« Ответ #6 Отправлен: Июль 31, 2018, 16:54:37 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
3539 Просмотров
Последний ответ Март 04, 2010, 16:04:02
от gregaz
4 Ответов
5841 Просмотров
Последний ответ Июль 07, 2010, 14:18:34
от XpycT
5 Ответов
5507 Просмотров
Последний ответ Август 16, 2010, 20:53:06
от XpycT
1 Ответов
3336 Просмотров
Последний ответ Январь 17, 2011, 16:23:20
от madmasles
2 Ответов
2554 Просмотров
Последний ответ Апрель 02, 2011, 22:24:21
от tigerby
3 Ответов
2985 Просмотров
Последний ответ Сентябрь 18, 2011, 15:25:23
от CreatoR
7 Ответов
4447 Просмотров
Последний ответ Ноябрь 13, 2011, 07:10:54
от gregaz
9 Ответов
4593 Просмотров
Последний ответ Июль 30, 2012, 23:50:51
от Kaster
2 Ответов
2317 Просмотров
Последний ответ Январь 20, 2014, 11:39:59
от havi
10 Ответов
2270 Просмотров
Последний ответ Январь 12, 2017, 14:53:19
от F9