Что нового

Повесить DblClick на Listview

W

w3d1

Гость
Можно ли обрабатывать на Listview двойной клик левой кнопки?
Или как вариант - правый клик и вывод контекстного меню? Ну, или хотя бы просто правый клик.
После этих операций должно меняться значение в выбранной строке.
Создается гуи так:
Код:
; Create GUI
	$hGUI = GUICreate("List fields", 200, 450, 100, 100, $WS_OVERLAPPEDWINDOW, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST))
	$nListView = GUICtrlCreateListView("", 2, 2, 197, 448)
	$hListView = GUICtrlGetHandle(-1)
	GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
	_GUICtrlListView_SetUnicodeFormat($hListView, False)
	; Add columns
	_GUICtrlListView_AddColumn($hListView, "Field", 100)
	_GUICtrlListView_AddColumn($hListView, "Status", 90)
	_GUICtrlListView_SetItemCount($hListView, 30)
	_GUICtrlListView_AddArray($hListView, $aFields)
	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
	GUIRegisterMsg($WM_LBUTTONUP, "WM_LBUTTONUP")
	GUIRegisterMsg($WM_MOUSEMOVE, "WM_MOUSEMOVE")
	GUISetOnEvent($GUI_EVENT_CLOSE, "_GUIEvents")



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

Пробовал добавлять

Код:
GUIRegisterMsg($WM_LBUTTONDBLCLK, "WM_LBUTTONDBLCLK")


но почему-то не ловит :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
;

Global $iDouble_Click_Event = False
Global $iOne_Click_Event = False

$GUI = GUICreate("ListView - One Click & Double Click", 300, 200)

$hListView = GUICtrlCreateListView("Column", 10, 10, 280, 170)

For $i = 1 To 10
	GUICtrlCreateListViewItem("Item " & $i, $hListView)
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW, $GUI)

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	
	If $iOne_Click_Event Then
		$iOne_Click_Event = 0
		ToolTip("Click")
	EndIf
	
	If $iDouble_Click_Event Then
		$iDouble_Click_Event = 0
		ToolTip("Double Click")
	EndIf
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView = $hListView
	If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

	$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
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Отличное решение для ListView, а можно ли доработать этот пример, чтоб событие ещё срабатывало на перемещение между итемами стрелками клавиатуры?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <GUIConstantsEx.au3>
#Include <GUIListView.au3>
#Include <ListViewConstants.au3>
#Include <WindowsConstants.au3>
#Include <WinAPI.au3>

Global $hForm, $hListView, $Dummy1, $Dummy2
Global $Accel[1][2] = [['{ENTER}', 0]]

$Form = GUICreate('MyGUI', 400, 400)

GUICtrlCreateListView('Column', 10, 10, 380, 380, BitOR($LVS_NOSORTHEADER, $LVS_SINGLESEL), $WS_EX_CLIENTEDGE)
$hListView = GUICtrlGetHandle(-1)

For $i = 0 To 9
	_GUICtrlListView_AddItem($hListView, 'Item ' & $i)
Next

$Dummy1 = GUICtrlCreateDummy()
$Dummy2 = GUICtrlCreateDummy()

$Accel[0][1] = GUICtrlCreateDummy()
GUISetAccelerators($Accel)

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

GUISetState(@SW_SHOW)

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $Dummy1
			ConsoleWrite('Item' & GUICtrlRead($Dummy1) & ' - selected!' & @CR)
		Case $Dummy2
			ConsoleWrite('Item' & GUICtrlRead($Dummy2) & ' - activated by double click!' & @CR)
		Case $Accel[0][1]
			If _WinAPI_GetFocus() = $hListView Then
				$Index = _GUICtrlListView_GetSelectedIndices($hListView)
				If $Index Then
					ConsoleWrite('Item' & $Index & ' - activated by ENTER!' & @CR)
;					GUICtrlSendToDummy($Dummy2, Number($Index))
				EndIf
			EndIf
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

    Local $tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $hFrom = DllStructGetData($tNMITEMACTIVATE, 'hWndFrom')
    Local $Index = DllStructGetData($tNMITEMACTIVATE, 'Index')
    Local $ID = DllStructGetData($tNMITEMACTIVATE, 'Code')

    Switch $hFrom
        Case $hListView
            Switch $ID
				Case $LVN_ITEMACTIVATE
					GUICtrlSendToDummy($Dummy2, $Index)
                Case $LVN_ITEMCHANGED
                    If (BitAND(DllStructGetData($tNMITEMACTIVATE, 'Changed'), $LVIF_STATE)) And (BitAND(DllStructGetData($tNMITEMACTIVATE, 'NewState'), $LVIS_SELECTED)) And (Not BitAND(DllStructGetData($tNMITEMACTIVATE, 'OldState'), $LVIS_FOCUSED)) Then
						GUICtrlSendToDummy($Dummy1, $Index)
                    EndIf
            EndSwitch
	EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Но лучше события обрабатывать непосредственно в WM_NOTIFY.

;)
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Благодарю. Работает как надо, но действительно громоздко получилось. Может быть CreatoR предложит свой вариант?
И вообще мне как бы не важно чем выделили итем. Лижбы при его выделении могла сработать моя функция.
Func _EditString ()
$iItemSel = _GUICtrlListView_GetSelectedIndices($ListView1, True)
If $iItemsel[0] = 0 Then Return
$sItemTextNum = _GUICtrlListView_GetItemText($ListView1, $iItemSel[1], 0); номер строки
$sItemText = _GUICtrlListView_GetItemText($ListView1, $iItemSel[1], 1); текст стоки
GUICtrlSetData ($Label2, $sLabel2 & $sItemTextNum) ; отображаем номер строки
GUICtrlSetData ($Edit1, $sItemText) ; отображаем текст строки в поле редактирования
EndFunc
 
Верх