Функция WM_NOTIFY

         Описание функции


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