Что нового

[Элементы GUI] Правый клик на заголовке ListView

n-deer

Новичок
Сообщения
16
Репутация
0
Всем привет!

Необходимо отследить правые клики на заголовке ListView при этом зная какую колонку кликнули. С левым кликом проблем нет (пример ниже), а вот с правым никак не получается.

Нашел вот такие рекомендации по решению данной задачи: http://support.microsoft.com/kb/125694/en-us?fr=1
но, к сожалению, не смог разобраться, как это реализовать на AutoIt.

Подскажите, пожалуйста, как нужно поправить приведенный скрипт, чтобы отслеживался именно правый клик?

Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

Opt('MustDeclareVars', 1)

Local $hWnd, $hListView, $hLV

$hWnd = GUICreate('Test ListView RClick', 300, 300)

$hListView = GUICtrlCreateListView('Col_1|Col_2|Col_3', 0, 28, 300, 300)
GUICtrlCreateListViewItem('0, 0|0, 1|0, 2', $hListView)
GUICtrlCreateListViewItem('1, 0|1, 1|1, 2', $hListView)
GUICtrlCreateListViewItem('2, 0|2, 1|2, 2', $hListView)
$hLV = GUICtrlGetHandle($hListView)

GUISetState(@SW_SHOW, $hWnd)

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
	#forceref $hWnd, $Msg, $wParam
	Local $tNMHDR, $hwndFrom, $code, $dwFlags
	Local $tNMLISTVIEW, $Item, $SubItem

	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$hwndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
	$code = DllStructGetData($tNMHDR, 'Code')

	Switch $hwndFrom
		Case $hLV
			Switch $code
				Case $NM_RCLICK
					$tNMLISTVIEW = DllStructCreate('hwnd hWndFrom;uint_ptr IDFrom;uint_ptr Code;int Item;int SubItem;uint NewState;uint OldState;uint Changed;int X;int Y;lparam Param', $lParam)
					$Item = DllStructGetData($tNMLISTVIEW, 'Item')
					$SubItem = DllStructGetData($tNMLISTVIEW, 'SubItem')
					If $Item <> -1 Then ConsoleWrite('Listview RClick: Item = ' & $Item & ', Subitem = ' & $SubItem & @CRLF)
                    Return 0

				Case $LVN_COLUMNCLICK
					$tNMLISTVIEW = DllStructCreate('hwnd hWndFrom;uint_ptr IDFrom;uint_ptr Code;int Item;int SubItem;uint NewState;uint OldState;uint Changed;int X;int Y;lparam Param', $lParam)
					$SubItem = DllStructGetData($tNMLISTVIEW, 'SubItem')
					ConsoleWrite('Listview Header Click: Subitem = ' & $SubItem & @CRLF)
			EndSwitch
	EndSwitch

	Return $GUI_RUNDEFMSG
EndFunc		;==>_WM_NOTIFY
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Все немного проще.

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIListView.au3>
#Include <WindowsConstants.au3>

$hWnd = GUICreate('Test ListView RClick', 300, 300)
$LV = GUICtrlCreateListView('Col_1|Col_2|Col_3', 0, 28, 300, 300)
$hHeader = _GUICtrlListView_GetHeader(-1)
GUICtrlCreateListViewItem('0, 0|0, 1|0, 2', $LV)
GUICtrlCreateListViewItem('1, 0|1, 1|1, 2', $LV)
GUICtrlCreateListViewItem('2, 0|2, 1|2, 2', $LV)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    Local $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
    Local $Code = DllStructGetData($tNMHDR, 'Code')
    Switch $hwndFrom
		Case $hHeader
			Switch $Code
				Case $NM_RCLICK
					Local $tPOINT =_WinAPI_GetMousePos(1, $hHeader)
					Local $Hit = _GUICtrlHeader_HitTest($hHeader, DllStructGetData($tPOINT, 1), DllStructGetData($tPOINT, 2))
					If IsArray($Hit) Then
						ConsoleWrite($Hit[0] & @CR)
					EndIf
			EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc     ;==>_WM_NOTIFY
 
Верх