WM_NOTIFY
Сообщение выполняется при взаимодействии с элементами окна.
Параметры
Указанные параметры передаются системой.$wParam | Идентификатор элемента |
$lParam |
Указатель на структуру $tagNMHDR, содержащую дескриптор элемента, идентификатор, код уведомления. |
Примечания
Смотрите функцию GUIRegisterMsg. Сообщение выполняется при наведении, нажатии, перетаскивание, отпуске мыши на элементе правым, левым, двойным кликом, удерживание клавиши или комбинации клавиш при действиях с элементом. При этом функция получает структуру, содержащую информацию текущего события. Исходя из полученной информации функция предопределяет дальнейшее развитие событий исходя из условий функции. Коды уведомлений смотрите в файлах с суффиксом "...Constants.au3" в папке "AutoIt3\Include\" после комментария "; Notifications"Пример
; смотрите примеры в _GUICtrlListView_Create, _GUICtrlButton_Create и в других ..._Create
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GuiButton.au3>
$Debug_LV = False
$help = 'Пример показывает возможность назначить управление/действия пунктам используя клавиши модификаторы и способ клика мыши' & @CRLF & @CRLF & _
'Для каждого ListView можно назначить своё поведение, которое определяется в выборе "Case $hWndListView". Пример взят из справки UDFs _GUICtrlListView_ClickItem'
Global $k = 0
Global $hListView
$Gui = GUICreate("Кликайте по элементам в ListView, нажмите F2", 550, 320)
$ListView = GUICtrlCreateListView("кол1 |кол2|кол3 ", 2, 2, 199, 88, $LVS_EDITLABELS)
$item1 = GUICtrlCreateListViewItem("пункт 1|1111|1 в кол 3", $ListView)
$item2 = GUICtrlCreateListViewItem("пункт 2|2222|2 в кол 3", $ListView)
$item3 = GUICtrlCreateListViewItem("пункт 3|3333|3 в кол 3", $ListView)
$hListView = GUICtrlGetHandle($ListView)
$hEdit = GUICtrlCreateEdit($help, 2, 95, 545, 222, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN)
GUICtrlSetBkColor(-1, 0xfffbd7)
$btn1 = GUICtrlCreateButton("Первая", 225, 66, 70, 25)
$btn2 = GUICtrlCreateButton("Вторая", 315, 66, 70, 25)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
$k += 1
WinSetTitle($Gui, '', 'Вызов ' & $k &', ID = '& $wParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hListView
Switch $iCode
Case $LVN_COLUMNCLICK
$tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
GUICtrlSetData($hEdit, _
"$LVN_COLUMNCLICK" & @TAB & "клик на заголовке колонки" & @CRLF & _
"дескриптор:" & @TAB & $hWndFrom & @CRLF & _
"идентификатор:" & @TAB & $iIDFrom & @TAB & "(порядковый номер элемента в окне)" & @CRLF & _
"№ колонки:" & @TAB & DllStructGetData($tInfo, "SubItem") & @TAB & "(отсчёт от 0)")
Case $NM_DBLCLK ; левый двойной клик мышкой по пункту
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
GUICtrlSetData($hEdit, _
"$NM_DBLCLK" & @TAB & "ДВОЙНОЙ клик левой кнопкой мыши" & @CRLF & _
"дескриптор:" & @TAB & $hWndFrom & @CRLF & _
"идентификатор:" & @TAB & $iIDFrom & @TAB & "(порядковый номер элемента в GUI)" & @CRLF & _
"код клика:" & @TAB & $iCode & @TAB & "(определяет правой или левой, двойной или одинарный клик мыши)" & @CRLF & _
"№ пункта:" & @TAB & DllStructGetData($tInfo, "Index") & @TAB & "(номер строки, отсчёт от 0, -1 пустое пространство)" & @CRLF & _
"№ колонки:" & @TAB & DllStructGetData($tInfo, "SubItem") & @TAB & "(отсчёт от 0)" & @CRLF & _
"удерж. клавиша:" & @TAB & DllStructGetData($tInfo, "KeyFlags") & @TAB & "(0=ничего; 1=Alt, 2=Ctrl, 4=Shift, 3,5,6,7 - комбинации)")
Case $NM_CLICK ; левый клик мышкой по пункту
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
GUICtrlSetData($hEdit, _
"$NM_CLICK" & @TAB & "одинарный клик левой кнопкой мыши" & @CRLF & _
"дескриптор:" & @TAB & $hWndFrom & @CRLF & _
"идентификатор:" & @TAB & $iIDFrom & @TAB & "(порядковый номер элемента в GUI)" & @CRLF & _
"код клика:" & @TAB & $iCode & @TAB & "(определяет правой или левой, двойной или одинарный клик мыши)" & @CRLF & _
"№ пункта:" & @TAB & DllStructGetData($tInfo, "Index") & @TAB & "(номер строки, отсчёт от 0, -1 пустое пространство)" & @CRLF & _
"№ колонки:" & @TAB & DllStructGetData($tInfo, "SubItem") & @TAB & "(отсчёт от 0)" & @CRLF & _
"удерж. клавиша:" & @TAB & DllStructGetData($tInfo, "KeyFlags") & @TAB & "(0=ничего; 1=Alt, 2=Ctrl, 4=Shift, 3,5,6,7 - комбинации)")
Case $LVN_KEYDOWN ; нажатие любой клавиши
$tInfo = DllStructCreate($tagNMLVKEYDOWN, $lParam)
Local $Key = DllStructGetData($tInfo, "VKey")
If Number(StringRight(GUICtrlRead($hEdit), 2)) <> $Key Then GUICtrlSetData($hEdit, @CRLF & 'Нажата клавиша №: ' & $Key, 1)
Switch $Key
Case 113; F2
$Tmp = _GUICtrlListView_GetSelectedIndices($hListView, True)
If $Tmp[0] > 0 Then
_GUICtrlListView_EditLabel($hListView, $Tmp[1])
GUICtrlSetData($hEdit, 'Нажата клавиша F2' & @CRLF & 'Редактирование пункта ' & $Tmp[1])
Return False
Else
GUICtrlSetData($hEdit, 'Нужно выделить пункт')
EndIf
EndSwitch
Case $LVN_ENDLABELEDITA, $LVN_ENDLABELEDITW ; конец редактирования пункта
$tInfo = DllStructCreate($tagNMLVDISPINFO, $lParam)
Local $tBuffer = DllStructCreate("char Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
If StringLen(DllStructGetData($tBuffer, "Text")) Then Return True
Case $NM_RCLICK ; правый клик мышкой по пункту
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
GUICtrlSetData($hEdit, _
"$NM_RCLICK" & @TAB & "одинарный клик ПРАВОЙ кнопкой мыши" & @CRLF & _
"дескриптор:" & @TAB & $hWndFrom & @CRLF & _
"идентификатор:" & @TAB & $iIDFrom & @TAB & "(порядковый номер элемента в GUI)" & @CRLF & _
"код клика:" & @TAB & $iCode & @TAB & "(определяет правой или левой, двойной или одинарный клик мыши)" & @CRLF & _
"№ пункта:" & @TAB & DllStructGetData($tInfo, "Index") & @TAB & "(номер строки, отсчёт от 0, -1 пустое пространство)" & @CRLF & _
"№ колонки:" & @TAB & DllStructGetData($tInfo, "SubItem") & @TAB & "(отсчёт от 0)" & @CRLF & _
"удерж. клавиша:" & @TAB & DllStructGetData($tInfo, "KeyFlags") & @TAB & "(0=ничего; 1=Alt, 2=Ctrl, 4=Shift, 3,5,6,7 - комбинации)")
Case $NM_RDBLCLK ; правый двойной клик мышкой по пункту
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
GUICtrlSetData($hEdit, _
"$NM_RDBLCLK" & @TAB & "ДВОЙНОЙ клик ПРАВОЙ кнопкой мыши" & @CRLF & _
"дескриптор:" & @TAB & $hWndFrom & @CRLF & _
"идентификатор:" & @TAB & $iIDFrom & @TAB & "(порядковый номер элемента в GUI)" & @CRLF & _
"код клика:" & @TAB & $iCode & @TAB & "(определяет правой или левой, двойной или одинарный клик мыши)" & @CRLF & _
"№ пункта:" & @TAB & DllStructGetData($tInfo, "Index") & @TAB & "(номер строки, отсчёт от 0, -1 пустое пространство)" & @CRLF & _
"№ колонки:" & @TAB & DllStructGetData($tInfo, "SubItem") & @TAB & "(отсчёт от 0)" & @CRLF & _
"удерж. клавиша:" & @TAB & DllStructGetData($tInfo, "KeyFlags") & @TAB & "(0=ничего; 1=Alt, 2=Ctrl, 4=Shift, 3,5,6,7 - комбинации)")
EndSwitch
Case Else
; Обработка события кнопок
Local Const $BCN_HOTITEMCHANGE = -1249
Local $tNMBHOTITEM = DllStructCreate("hwnd hWndFrom;int IDFrom;int Code;dword dwFlags", $lParam)
Local $nNotifyCode = DllStructGetData($tNMBHOTITEM, "Code"), _
$nID = DllStructGetData($tNMBHOTITEM, "IDFrom"), _
$hCtrl = DllStructGetData($tNMBHOTITEM, "hWndFrom"), _
$dwFlags = DllStructGetData($tNMBHOTITEM, "dwFlags"), _
$sText = ""
Switch $nNotifyCode
Case $BCN_HOTITEMCHANGE ; Win XP и выше
If BitAND($dwFlags, 0x10) = 0x10 Then
$sText = "наведена"
ElseIf BitAND($dwFlags, 0x20) = 0x20 Then
$sText = "оставлена"
EndIf
GUICtrlSetData($hEdit, _
'Кнопка "' & _GUICtrlButton_GetText($hCtrl) & '" ' & $sText & @CRLF & _
'идентификатор' & @TAB & $nID & @CRLF & _
"дескриптор:" & @TAB & $hWndFrom)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc