Что нового

[Элементы GUI] Как отловить событие на любое действие с ListView?

F9

Новичок
Сообщения
71
Репутация
2
Добрый день!

Возможно туплю, не нагуглил ответа на мой вопрос:
Мне нужно отловить любое действие с элементом ListView, например перемещение по нему, клик мышкой и т.п.

Для примера, простая форма, в которой хочу отлавливать онлайн перемещения по списку.
метод _GUICtrlListView_GetItemTextString не работает. Нет даже пустого MsgBox, ощущение что Case не срабатывает... :blink: :stars:
Не пойму в чем подвох ?

Код:
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
 #include <GuiListView.au3>
#include <ComboConstants.au3>



$Form1 = GUICreate('Form1', 500, 500, 192, 114)
$supplier_method = GUICtrlCreateListView("ID|Поставщик|Метод",50,90,255,257);,-1,$LVS_EX_FULLROWSELECT+$LVS_EX_GRIDLINES)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 20)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 130)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 80)
for $sl = 1 to 10
		GUICtrlCreateListViewItem($sl & "|Supplier_"&$sl&"|MAIL",$supplier_method)
Next

Local $RadioMethod_Mail = GUICtrlCreateRadio("ПОЧТА", 350, 110, 120, 20)
Local $RadioMethod_FTP = GUICtrlCreateRadio("FTP", 350, 140, 120, 20)

$idComboBox = GUICtrlCreateCombo("",350,200,120,20,$CBS_DROPDOWNLIST)
GUICtrlSetData($idComboBox, "Aggrrrrrrrhhh|Item 2|Item 3", "Item 2")


GUISetState(@SW_SHOW)


While 1
    $msg = GUIGetMsg(1)
	Select

        Case $msg[0] = $GUI_EVENT_CLOSE
            Exit
        Case $msg[0] = $supplier_method
            MsgBox(0, '$supplier_method',"!!1111"); _GUICtrlListView_GetItemTextString ($supplier_method))
		Case $msg[0] = $RadioMethod_Mail And BitAND(GUICtrlRead($RadioMethod_Mail), $GUI_CHECKED) = $GUI_CHECKED
			 MsgBox($MB_SYSTEMMODAL, 'Info:', 'MAIL')
		Case $msg[0] = $RadioMethod_FTP And BitAND(GUICtrlRead($RadioMethod_FTP), $GUI_CHECKED) = $GUI_CHECKED
			 MsgBox($MB_SYSTEMMODAL, 'Info:', 'FTP')
		Case $msg[0] = $idComboBox
            $sComboRead = GUICtrlRead($idComboBox)
            MsgBox($MB_SYSTEMMODAL, "", $sComboRead, 0, $Form1)


    EndSelect
WEnd


Все остальные кейсы на элементы работают, ListView не работает... :scratch:
 

InnI

AutoIT Гуру
Сообщения
4,911
Репутация
1,427
F9
отловить любое действие с элементом ListView
Посмотрите пример в справке к функции
Код:
_GUICtrlListView_Create()
За перемещение мыши над списком отвечает событие $LVN_HOTTRACK.
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
InnI сказал(а):
F9
отловить любое действие с элементом ListView
Посмотрите пример в справке к функции
Код:
_GUICtrlListView_Create()
За перемещение мыши над списком отвечает событие $LVN_HOTTRACK.

А перемещение по нему курсором или щелчками мышки или любым доступным способом, очевидно:

Код:
Case $LVN_ITEMACTIVATE ; Sent by a list-view control when the user activates an item


То есть предлагаете использовать
Код:
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)


А как быть, если у меня уже имеется функция, предназнаенная для отлавливания двойного клика до другому ListView ???
Их можно совмещать ?

Код:
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	$id = GUICtrlRead($Tab1) + 1
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView = Eval("ListView" &$id)
    If Not IsHWnd(Eval("ListView" &$id)) Then $hWndListView = GUICtrlGetHandle(Eval("ListView" &$id))

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK
                    $iOne_Click_Event = True
                Case $NM_DBLCLK
                    $iDouble_Click_Event = True
			EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc ;~ ******************************************
 

InnI

AutoIT Гуру
Сообщения
4,911
Репутация
1,427
F9
Их можно совмещать ?
Вот вы в своём коде используете
Код:
Switch $hWndFrom
А какие данные перебирает этот Switch? Что находится в $hWndFrom?
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
InnI сказал(а):
F9
Их можно совмещать ?
Вот вы в своём коде используете
Код:
Switch $hWndFrom
А какие данные перебирает этот Switch? Что находится в $hWndFrom?

$hWndFrom представлен только в Func WM_NOTIFY
Код выше. Взят из хелпа кстати



Добавлено:
Сообщение автоматически объединено:

Так... кое что выяснилось от исходной тестовой формы:

Код:
Case $msg[0] = $supplier_method

получает управление при нажатии на заголовки ListView... А как заставить кейс работать при нажатии на содердимое ListView ?
 

InnI

AutoIT Гуру
Сообщения
4,911
Репутация
1,427
F9
$hWndFrom представлен только в Func WM_NOTIFY
И что находится в этой переменной?
Код:
ConsoleWrite("$hWndFrom = " & $hWndFrom & @CRLF)
ConsoleWrite("$hWndListView = " & $hWndListView & @CRLF)
http://www.vsokovikov.narod.ru/New_MSDN_API/Controls/msg_wm_notify.htm
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
$hWndFrom = 0x004F0ADE
$hWndListView = 0x004F0ADE
 

InnI

AutoIT Гуру
Сообщения
4,911
Репутация
1,427
F9
Вы меня не поняли :smile:
Мне не интересно значение переменной. Я спрашиваю - вы знаете, что находится в $hWndFrom? Что означает её значение? Что вообще делает функция WM_NOTIFY вы понимаете?

при нажатии на содержимое ListView
Код:
#include <GUIConstants.au3>
#include <GuiListView.au3>

$Form1 = GUICreate('Form1', 500, 500, 192, 114)
$supplier_method = GUICtrlCreateListView("ID|Поставщик|Метод",50,90,255,257);,-1,$LVS_EX_FULLROWSELECT+$LVS_EX_GRIDLINES)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 20)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 130)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 80)
Global $LVitems[10]
for $sl = 1 to 10
        $LVitems[$sl - 1] = GUICtrlCreateListViewItem($sl & "|Supplier_"&$sl&"|MAIL",$supplier_method)
Next
GUISetState(@SW_SHOW)

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $LVitems[0] To $LVitems[9]
            MsgBox($MB_SYSTEMMODAL, 'Info:', GUICtrlRead($msg))
    EndSwitch
WEnd
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
InnI сказал(а):
F9
Вы меня не поняли :smile:
Я спрашиваю - вы знаете, что находится в $hWndFrom? Что означает её значение? Что вообще делает функция WM_NOTIFY вы понимаете?
смысл работы WM_NOTIFY в общих чертах понятен.
Спасибо за подсказку...


А вот как бы реализовать
Код:
Case $LVitems[0] To $LVitems[9]

через
Case $msg[0] = ....
??
использую $msg[0] и $msg[1] для отслеживания двух разных $GUI_EVENT_CLOSE для основного и дочернего окна


Кстати решение с
Код:
Case $LVitems[0] To $LVitems[9]

работает только для щелчка мышки в определенную позицию ListView, перемещение курсором клавиатуры этот кейс не отлавливает ((
 

InnI

AutoIT Гуру
Сообщения
4,911
Репутация
1,427
F9
Код:
#include <GUIConstants.au3>
#include <GuiListView.au3>

$Form1 = GUICreate('Form1', 500, 500, 192, 114)
$supplier_method = GUICtrlCreateListView("ID|Поставщик|Метод",50,90,255,257);,-1,$LVS_EX_FULLROWSELECT+$LVS_EX_GRIDLINES)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 20)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 130)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 80)
for $sl = 1 to 10
        GUICtrlCreateListViewItem($sl & "|Supplier_"&$sl&"|MAIL",$supplier_method)
Next

Local $RadioMethod_Mail = GUICtrlCreateRadio("ПОЧТА", 350, 110, 120, 20)
Local $RadioMethod_FTP = GUICtrlCreateRadio("FTP", 350, 140, 120, 20)

$idComboBox = GUICtrlCreateCombo("",350,200,120,20,$CBS_DROPDOWNLIST)
GUICtrlSetData($idComboBox, "Aggrrrrrrrhhh|Item 2|Item 3", "Item 2")


$Form2 = GUICreate('Form2', 500, 500, 292, 214)
$supplier_method2 = GUICtrlCreateListView("ID|Поставщик|Метод",50,90,255,257)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 20)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 130)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 80)
for $sl = 1 to 10
        GUICtrlCreateListViewItem($sl & "|Supplier_"&$sl&"_2"&"|FTP",$supplier_method2)
Next

GUISetState(@SW_SHOW, $Form1)
GUISetState(@SW_SHOW, $Form2)

$hLV1 = GUICtrlGetHandle($supplier_method) ; handle для WM_NOTIFY
$hLV2 = GUICtrlGetHandle($supplier_method2) ; handle для WM_NOTIFY

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
    $msg = GUIGetMsg(1)
    Select

        Case $msg[0] = $GUI_EVENT_CLOSE
            If $msg[1] = $Form2 Then
              GUIDelete($Form2)
            Else
              Exit
            EndIf
        Case $msg[0] = $supplier_method
            MsgBox(0, '$supplier_method',"!!1111")
        Case $msg[0] = $RadioMethod_Mail And BitAND(GUICtrlRead($RadioMethod_Mail), $GUI_CHECKED) = $GUI_CHECKED
            MsgBox($MB_SYSTEMMODAL, 'Info:', 'MAIL')
        Case $msg[0] = $RadioMethod_FTP And BitAND(GUICtrlRead($RadioMethod_FTP), $GUI_CHECKED) = $GUI_CHECKED
            MsgBox($MB_SYSTEMMODAL, 'Info:', 'FTP')
        Case $msg[0] = $idComboBox
            $sComboRead = GUICtrlRead($idComboBox)
            MsgBox($MB_SYSTEMMODAL, "", $sComboRead, 0, $Form1)

    EndSelect
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    Local $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom") ; handle элемента уведомления
    Local $iCode = DllStructGetData($tNMHDR, "Code") ; код уведомления
    Switch $hWndFrom ; handle элемента
        Case $hLV1 ; ListView с Form1
            Switch $iCode ; разбор сообщений
                Case $LVN_KEYDOWN
                    ConsoleWrite("$LVN_KEYDOWN в списке Form1"  & @CRLF)
                Case $NM_CLICK
                    ConsoleWrite("$NM_CLICK в списке Form1"  & @CRLF)
            EndSwitch
        Case $hLV2 ; ListView с Form2
            Switch $iCode ; разбор сообщений
                Case $LVN_KEYDOWN
                    ConsoleWrite("$LVN_KEYDOWN в списке Form2"  & @CRLF)
                Case $NM_CLICK
                    ConsoleWrite("$NM_CLICK в списке Form2"  & @CRLF)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
InnI сказал(а):
F9
Код:
#include <GUIConstants.au3>
#include <GuiListView.au3>

$Form1 = GUICreate('Form1', 500, 500, 192, 114)
$supplier_method = GUICtrlCreateListView("ID|Поставщик|Метод",50,90,255,257);,-1,$LVS_EX_FULLROWSELECT+$LVS_EX_GRIDLINES)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 20)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 130)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 80)
for $sl = 1 to 10
        GUICtrlCreateListViewItem($sl & "|Supplier_"&$sl&"|MAIL",$supplier_method)
Next

Local $RadioMethod_Mail = GUICtrlCreateRadio("ПОЧТА", 350, 110, 120, 20)
Local $RadioMethod_FTP = GUICtrlCreateRadio("FTP", 350, 140, 120, 20)

$idComboBox = GUICtrlCreateCombo("",350,200,120,20,$CBS_DROPDOWNLIST)
GUICtrlSetData($idComboBox, "Aggrrrrrrrhhh|Item 2|Item 3", "Item 2")


$Form2 = GUICreate('Form2', 500, 500, 292, 214)
$supplier_method2 = GUICtrlCreateListView("ID|Поставщик|Метод",50,90,255,257)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 20)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 130)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 80)
for $sl = 1 to 10
        GUICtrlCreateListViewItem($sl & "|Supplier_"&$sl&"_2"&"|FTP",$supplier_method2)
Next

GUISetState(@SW_SHOW, $Form1)
GUISetState(@SW_SHOW, $Form2)

$hLV1 = GUICtrlGetHandle($supplier_method) ; handle для WM_NOTIFY
$hLV2 = GUICtrlGetHandle($supplier_method2) ; handle для WM_NOTIFY

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
    $msg = GUIGetMsg(1)
    Select

        Case $msg[0] = $GUI_EVENT_CLOSE
            If $msg[1] = $Form2 Then
              GUIDelete($Form2)
            Else
              Exit
            EndIf
        Case $msg[0] = $supplier_method
            MsgBox(0, '$supplier_method',"!!1111")
        Case $msg[0] = $RadioMethod_Mail And BitAND(GUICtrlRead($RadioMethod_Mail), $GUI_CHECKED) = $GUI_CHECKED
            MsgBox($MB_SYSTEMMODAL, 'Info:', 'MAIL')
        Case $msg[0] = $RadioMethod_FTP And BitAND(GUICtrlRead($RadioMethod_FTP), $GUI_CHECKED) = $GUI_CHECKED
            MsgBox($MB_SYSTEMMODAL, 'Info:', 'FTP')
        Case $msg[0] = $idComboBox
            $sComboRead = GUICtrlRead($idComboBox)
            MsgBox($MB_SYSTEMMODAL, "", $sComboRead, 0, $Form1)

    EndSelect
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    Local $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom") ; handle элемента уведомления
    Local $iCode = DllStructGetData($tNMHDR, "Code") ; код уведомления
    Switch $hWndFrom ; handle элемента
        Case $hLV1 ; ListView с Form1
            Switch $iCode ; разбор сообщений
                Case $LVN_KEYDOWN
                    ConsoleWrite("$LVN_KEYDOWN в списке Form1"  & @CRLF)
                Case $NM_CLICK
                    ConsoleWrite("$NM_CLICK в списке Form1"  & @CRLF)
            EndSwitch
        Case $hLV2 ; ListView с Form2
            Switch $iCode ; разбор сообщений
                Case $LVN_KEYDOWN
                    ConsoleWrite("$LVN_KEYDOWN в списке Form2"  & @CRLF)
                Case $NM_CLICK
                    ConsoleWrite("$NM_CLICK в списке Form2"  & @CRLF)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

Спасибо!
Дальше идею думаю смогу сам развить
 
Верх