Что нового

Возврат значения из ListView при нажатии на стрели UP/DOWN

vovsla

Осваивающий
Сообщения
607
Репутация
36
Почему-то при получении _GUICtrlListView_GetItemTextArray из элемента ListView по событию $LVN_KEYDOWN возвращается предыдущее значение. По событию $LVN_ITEMCHANGED возвращается сначала предыдущее значение, потом текущее.
Как можно получить только выбранное значение?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Vovsla,
Можно сделать так.
Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>

Global $hListView

_Main()

Func _Main()

    Local $GUI, $hImage
    $GUI = GUICreate("Создание ListView", 400, 300)

    $hListView = _GUICtrlListView_Create($GUI, "", 2, 2, 394, 268)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
    GUISetState()

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    ; Загружает изображения
    $hImage = _GUIImageList_Create()
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
    _GUICtrlListView_SetImageList($hListView, $hImage, 1)

    ; Добавляет колонки
    _GUICtrlListView_InsertColumn($hListView, 0, "Колонка 1", 100)
    _GUICtrlListView_InsertColumn($hListView, 1, "Колонка 2", 100)
    _GUICtrlListView_InsertColumn($hListView, 2, "Колонка 3", 100)

    ; Добавляет пункты
    _GUICtrlListView_AddItem($hListView, "Стр 1: Кол 1", 0)
    _GUICtrlListView_AddSubItem($hListView, 0, "Стр 1: Кол 2", 1)
    _GUICtrlListView_AddSubItem($hListView, 0, "Стр 1: Кол 3", 2)
    _GUICtrlListView_AddItem($hListView, "Стр 2: Кол 1", 1)
    _GUICtrlListView_AddSubItem($hListView, 1, "Стр 2: Кол 2", 1)
    _GUICtrlListView_AddItem($hListView, "Стр 3: Кол 1", 2)

    ; Цикл выполняется, пока окно не будет закрыто
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc   ;==>_Main

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $iDX

	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hListView
			Switch $iCode
				Case $LVN_KEYDOWN
					$tInfo = DllStructCreate($tagNMLVKEYDOWN, $ilParam)
					Switch BitAND(DllStructGetData($tInfo, "VKey"), 0xFFFF)
						Case $VK_UP
							$iDX = _GUICtrlListView_GetNextItem($hListView) - 1
							If $iDX < 0 Then $iDX = 0
						Case $VK_DOWN
							$iDX = _GUICtrlListView_GetNextItem($hListView) + 1
							If $iDX >= _GUICtrlListView_GetItemCount($hListView) Then $iDX -= 1
						EndSwitch
					ConsoleWrite($iDX & @TAB & _GUICtrlListView_GetItemText($hListView, $iDX) & @LF)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
И еще вариант.
Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>

Global $iListView

_Main()

Func _Main()

	Local $GUI, $hImage
	$GUI = GUICreate('Создание ListView', 400, 300)
	$iListView = GUICtrlCreateListView('', 2, 2, 394, 268)
	_GUICtrlListView_SetExtendedListViewStyle($iListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
	GUISetState()

	GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

	; Загружает изображения
	$hImage = _GUIImageList_Create()
	_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($iListView, 0xFF0000, 16, 16))
	_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($iListView, 0x00FF00, 16, 16))
	_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($iListView, 0x0000FF, 16, 16))
	_GUICtrlListView_SetImageList($iListView, $hImage, 1)

	; Добавляет колонки
	_GUICtrlListView_InsertColumn($iListView, 0, 'Колонка 1', 100)
	_GUICtrlListView_InsertColumn($iListView, 1, 'Колонка 2', 100)
	_GUICtrlListView_InsertColumn($iListView, 2, 'Колонка 3', 100)

	_GUICtrlListView_AddItem($iListView, 'Стр 1: Кол 1', 0)
	_GUICtrlListView_AddSubItem($iListView, 0, 'Стр 1: Кол 2', 1)
	_GUICtrlListView_AddSubItem($iListView, 0, 'Стр 1: Кол 3', 2)
	_GUICtrlListView_AddItem($iListView, 'Стр 2: Кол 1', 1)
	_GUICtrlListView_AddSubItem($iListView, 1, 'Стр 2: Кол 2', 1)
	_GUICtrlListView_AddItem($iListView, 'Стр 3: Кол 1', 2)

	; Цикл выполняется, пока окно не будет закрыто
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUIDelete()
EndFunc   ;==>_Main

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $iIDFrom, $iCode, $tNMITEMACTIVATE, $iDX

	$tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
	$iIDFrom = DllStructGetData($tNMITEMACTIVATE, 'IDFrom')
	$iCode = DllStructGetData($tNMITEMACTIVATE, 'Code')
	Switch $iIDFrom
		Case $iListView
			Switch $iCode
				Case $LVN_ITEMCHANGED
;~ 					If DllStructGetData($tNMITEMACTIVATE, 'NewState') Then ;or
					If Not DllStructGetData($tNMITEMACTIVATE, 'OldState') Then
						$iDX = DllStructGetData($tNMITEMACTIVATE, 'Index')
						ConsoleWrite($iDX & @TAB & _GUICtrlListView_GetItemText($iListView, $iDX) & @LF)
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Верх