Что нового

[Баг] GUICtrlCreateListView и параметры строки

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Похоже, нашел баг. Кликайте в следующем коде по строкам в ListView:
Код:
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>

$hGUI = GUICreate('ListView', 200, 200)
$idLV = GUICtrlCreateListView('Column', 10, 40, 180, 150)
$idBtn = GUICtrlCreateButton('Test', 50, 10, 100, 20)
For $i = 0 To 9
	_GUICtrlListView_InsertItem($idLV, 'Item_' & $i, -1, -1, $idBtn); параметр = $idBtn
Next
GUISetState()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $idBtn
			MsgBox(64, 'Info', 'Button click or ListView item?', 0, $hGUI)
	EndSwitch
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я уже подробно описывал, откуда такое поведение LV. Для того, чтобы с элементами LV можно было работать как с другими элементами GUI, AutoIt использует $iParam для хранения ID элемента LV. Таким образом не делается никаких различий между элементами LV и другими элементами GUI.

Если LV заполняется функциями из UDF, то для разрешения данного конфликта нужно прописать заглушку в WM_NOTIFY:

Код:
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

	Local $tNMHDR = DllStructCreate($tagNMHDR , $lParam)
	Local $hTarget = DllStructGetData($tNMHDR, 'hWndFrom')
	Local $nNC = DllStructGetData($tNMHDR, 'Code')

	Switch $hTarget
		Case $hLV
			Switch $nNC
				Case $LVN_ITEMACTIVATE
					Return 0
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
для разрешения данного конфликта нужно прописать заглушку в WM_NOTIFY
Прописал, не помогает.
Код:
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate('ListView', 200, 200)
$idLV = GUICtrlCreateListView('Column', 10, 40, 180, 150)
$hLV = GUICtrlGetHandle(-1)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
$idBtn = GUICtrlCreateButton('Test', 50, 10, 100, 20)
For $i = 0 To 9
	_GUICtrlListView_InsertItem($idLV, 'Item_' & $i, -1, -1, $idBtn); параметр = $idBtn
Next
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $idBtn
			MsgBox(64, 'Info', 'Button click or ListView item?', 0, $hGUI)
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate($tagNMHDR , $lParam)
    Local $hTarget = DllStructGetData($tNMHDR, 'hWndFrom')
    Local $nNC = DllStructGetData($tNMHDR, 'Code')
    Switch $hTarget
		Case $hLV
            Switch $nNC
				Case $LVN_ITEMACTIVATE
					ConsoleWrite('ITEMACTIVATE' & @LF)
                    Return 0
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Значит что-то поменялось. Раньше LV не рагировал на одиночный клик. Добавьте заглушку на $NM_CLICK.
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
Добавьте заглушку на $NM_CLICK.
Спасибо, помогло.
Решение:
Код:
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate('ListView', 200, 200)
$idLV = GUICtrlCreateListView('Column', 10, 40, 180, 150)
$hLV = GUICtrlGetHandle(-1)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
$idBtn = GUICtrlCreateButton('Test', 50, 10, 100, 20)
For $i = 0 To 9
	_GUICtrlListView_InsertItem($idLV, 'Item_' & $i, -1, -1, $idBtn); параметр = $idBtn
Next
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $idBtn
			MsgBox(64, 'Info', 'Button click', 0, $hGUI)
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate($tagNMHDR , $lParam)
    Local $hTarget = DllStructGetData($tNMHDR, 'hWndFrom')
    Local $nNC = DllStructGetData($tNMHDR, 'Code')
    Switch $hTarget
		Case $hLV
            Switch $nNC
				Case $NM_CLICK
					ConsoleWrite('CLICK' & @LF)
                    Return 0
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
На самом деле, поскольку максимальное значение элементов на GUI в AutoIt ограничено 65532, то можно просто использовать диапазон значений от 65536 при использовании $iParam.
 
Верх