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


WM_NOTIFY

Сообщение выполняется при взаимодействии с элементами окна.

Параметры

Указанные параметры передаются системой.
wParam Идентификатор элемента
lParam Указатель на структуру NMHDR, содержащую дескриптор элемента, идентификатор, код уведомления.

Примечания

Смотрите функцию GUIRegisterMsg. Сообщение выполняется при наведении, нажатии, перетаскивание, отпуске мыши на элементе правым, левым, двойным кликом, удерживание клавиши или комбинации клавиш при действиях с элементом. При этом функция получает структуру, содержащую информацию текущего события. Исходя из полученной информации функция предопределяет дальнейшее развитие событий исходя из условий функции. Коды уведомлений смотрите в на официальном сайте msdn

Пример

EnableExplicit
Declare MyWindowCallback(hWin, Msg, wParam, lParam)
#BCN_HOTITEMCHANGE = -1249

Structure NMBHOTITEM Extends NMHDR
dwFlags.l
EndStructure

Structure NMLVSCROLL Extends NMHDR
    DX.i
    DY.i
EndStructure

Structure NMLVKEYDOWN Extends NMHDR Align 1
    VKey.w
    Flags.l
EndStructure

Global hListView, help.s, k = 0, hEdit, btn1, btn2
help.s = "Пример показывает возможность назначить управление/действия" + #CRLF$ + "пунктам используя клавиши модификаторы и способ клика мыши" + #CRLF$ + #CRLF$ + "Для каждого ListView можно назначить своё поведение," + #CRLF$ + "которое определяется в выборе -Case hWndListView-"


OpenWindow(0, 0, 0, 550, 320,"Кликайте по элементам в ListView, нажмите F2", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)

hListView = ListIconGadget(0, 2, 2, 199, 88, "кол1 ", 60, #LVS_EDITLABELS | #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "кол2", 60)
AddGadgetColumn(0, 2, "кол3 ", 60)

AddGadgetItem(0, -1, "пункт 1" + #LF$ + "1111" + #LF$ + "1 в кол 3")
AddGadgetItem(0, -1, "пункт 2" + #LF$ + "2222" + #LF$ + "2 в кол 3")
AddGadgetItem(0, -1, "пункт 3" + #LF$ + "3333" + #LF$ + "3 в кол 3")
AddGadgetItem(0, -1, "пункт 4" + #LF$ + "4444" + #LF$ + "4 в кол 3")

hEdit = EditorGadget(1, 2, 95, 545, 222, #ES_AUTOVSCROLL | #WS_VSCROLL | #ES_NOHIDESEL | #ES_WANTRETURN)
SetGadgetText(1, help)
GetGadgetColor(1 , $fffbd7)

btn1 = ButtonGadget(2, 225, 66, 70, 25, "Первая")
btn2 = ButtonGadget(3, 315, 66, 70, 25, "Вторая")

SetWindowCallback(@MyWindowCallback())

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Procedure MyWindowCallback(hWin, Msg, wParam, lParam)
    Protected item, Text$, tmp$
    Static tmpOld$
    Protected Result = #PB_ProcessPureBasicEvents
    Protected *pnmhdr.NMHDR =lParam
    Protected *pitema.NMITEMACTIVATE =lParam
    Protected *pnmlv.NMLISTVIEW =lParam
    Protected *vlkey.NMLVKEYDOWN
    Protected *Info.NMLVDISPINFO
    Protected *pnmlv2.NMBHOTITEM
    Protected *scroll.NMLVSCROLL

    Select Msg
        Case #WM_NOTIFY
            k + 1
            SetWindowTitle(0 , "Вызов " + k + " ID =" + wParam)
            Select *pnmhdr\hWndFrom
                Case hListView
                    Select *pnmhdr\code
                        Case #LVN_COLUMNCLICK
                            SetGadgetText(1, "LVN_COLUMNCLICK" + #TAB$ + "клик на заголовке колонки" + #CRLF$ + "дескриптор:" + #TAB$ + *pnmhdr\hWndFrom + #CRLF$ + "идентификатор:" + #TAB$ + *pnmhdr\IDFrom + #TAB$ + "(порядковый номер элемента в окне)" + #CRLF$ + "№ колонки:" + #TAB$ + *pnmlv\iSubItem + #TAB$ + "(отсчёт от 0)")

                        Case #NM_DBLCLK ; левый двойной клик мышкой по пункту

                            SetGadgetText(1, "NM_DBLCLK" + #TAB$ + "ДВОЙНОЙ клик левой кнопкой мыши" + #CRLF$ + "дескриптор:" + #TAB$ + *pnmhdr\hWndFrom + #CRLF$ + "идентификатор:" + #TAB$ + *pnmhdr\IDFrom + #TAB$ + "(порядковый номер элемента в GUI)" + #CRLF$ + "код клика:" + #TAB$ + *pnmhdr\code + #TAB$ + "(определяет правой или левой, двойной или одинарный клик мыши)" + #CRLF$ + "№ пункта:" + #TAB$ + *pnmlv\iItem + #TAB$ + "(номер строки, отсчёт от 0, -1 пустое пространство)" + #CRLF$ + "№ колонки:" + #TAB$ + *pnmlv\iSubItem + #TAB$ + "(отсчёт от 0)" + #CRLF$ + "удерж. клавиша:" + #TAB$ + *pitema\uKeyFlags + #TAB$ + "(0=ничего; 1=Alt, 2=Ctrl, 4=Shift, 3,5,6,7 - комбинации)")

                        Case #NM_CLICK ; левый клик мышкой по пункту
                            SetGadgetText(1, "NM_CLICK" + #TAB$ + "одинарный клик левой кнопкой мыши" + #CRLF$ + "дескриптор:" + #TAB$ + *pnmhdr\hWndFrom + #CRLF$ + "идентификатор:" + #TAB$ + *pnmhdr\IDFrom + #TAB$ + "(порядковый номер элемента в GUI)" + #CRLF$ + "код клика:" + #TAB$ + *pnmhdr\code + #TAB$ + "(определяет правой или левой, двойной или одинарный клик мыши)" + #CRLF$ + "№ пункта:" + #TAB$ + *pnmlv\iItem + #TAB$ + "(номер строки, отсчёт от 0, -1 пустое пространство)" + #CRLF$ + "№ колонки:" + #TAB$ + *pnmlv\iSubItem + #TAB$ + "(отсчёт от 0)" + #CRLF$ + "удерж. клавиша:" + #TAB$ + *pitema\uKeyFlags + #TAB$ + "(0=ничего; 1=Alt, 2=Ctrl, 4=Shift, 3,5,6,7 - комбинации)")
                            ProcedureReturn #True
                        Case #NM_HOVER ; Высылается элементом list-view когда мышь поверх пункта
                            SetGadgetText(1, "NM_HOVER" + #TAB$ + "наведение курсора мыши" + #CRLF$ + "дескриптор:" + #TAB$ + *pnmhdr\hWndFrom + #CRLF$ + "идентификатор:" + #TAB$ + *pnmhdr\IDFrom + #TAB$ + "(порядковый номер элемента в GUI)" + #CRLF$ + "код клика:" + #TAB$ + *pnmhdr\code + #TAB$ + "(определяет правой или левой, двойной или одинарный клик мыши)" + #CRLF$ + "№ пункта:" + #TAB$ + *pnmlv\iItem + #TAB$ + "(номер строки, отсчёт от 0, -1 пустое пространство)" + #CRLF$ + "№ колонки:" + #TAB$ + *pnmlv\iSubItem + #TAB$ + "(отсчёт от 0)")
                        Case #LVN_HOTTRACK ; Высылает в ListView, когда пользователь перемещает курсор мыши над пунктом
                            tmp$ = "LVN_HOTTRACK" + #TAB$ + "наведение курсора мыши" + #CRLF$ + "дескриптор:" + #TAB$ + *pnmhdr\hWndFrom + #CRLF$ + "идентификатор:" + #TAB$ + *pnmhdr\IDFrom + #TAB$ + "(порядковый номер элемента в GUI)" + #CRLF$ + "код клика:" + #TAB$ + *pnmhdr\code + #TAB$ + "(определяет правой или левой, двойной или одинарный клик мыши)" + #CRLF$ + "№ пункта:" + #TAB$ + *pnmlv\iItem + #TAB$ + "(номер строки, отсчёт от 0, -1 пустое пространство)" + #CRLF$ + "№ колонки:" + #TAB$ + *pnmlv\iSubItem + #TAB$ + "(отсчёт от 0)"
                            If tmp$<>tmpOld$
                                SetGadgetText(1, tmp$)
                                tmpOld$ = tmp$
                            EndIf
                        Case #LVN_BEGINSCROLL ; Начинается операция прокрутки, минимальная ОС WinXP
                            *scroll.NMLVSCROLL=lParam
                            SetGadgetText(1, "LVN_BEGINSCROLL" + #TAB$ + "прокрутка" + #CRLF$ + "DX:" + #TAB$ + *scroll\DX + #CRLF$ + "DY:" + #TAB$ + *scroll\DY)

                        Case #LVN_KEYDOWN ; нажатие любой клавиши
                            *vlkey.NMLVKEYDOWN=lParam
                            If Int(Val(Right(GetGadgetText(1), 2))) <> *vlkey\VKey
;                                 SetGadgetText(1, #CRLF$ + "Нажата клавиша №: " + Str(*vlkey\VKey))
                                AddGadgetItem(1 , -1 , #CRLF$ + "Нажата клавиша №: " + Str(*vlkey\VKey))
                            EndIf
                            Select *vlkey\VKey
                                Case 113; F2
                                    item = GetGadgetState(0)
                                    If item >= 0
                                        ; edititem = GetItemLV()
                                        SendMessage_(hListView,#LVM_EDITLABEL,item,0) ; editcontrol =
                                        SetGadgetText(1, "Нажата клавиша F2" + #CRLF$ +"Редактирование пункта " + Str(item))
                                        ProcedureReturn #False
                                    Else
                                        SetGadgetText(1, "Нужно выделить пункт")
                                    EndIf
                            EndSelect

                        Case #LVN_ENDLABELEDITA, #LVN_ENDLABELEDITW ; конец редактирования пункта
                            *Info.NMLVDISPINFO=lParam
                            If *Info\item\mask & #LVIF_TEXT
                                If Len(PeekS(*Info\item\pszText))
                                    ProcedureReturn #True
                                EndIf
                            EndIf

                        Case #NM_RCLICK ; правый клик мышкой по пункту
                            SetGadgetText(1, "NM_RCLICK" + #TAB$ + "одинарный клик ПРАВОЙ кнопкой мыши" + #CRLF$ + "дескриптор:" + #TAB$ + *pnmhdr\hWndFrom + #CRLF$ + "идентификатор:" + #TAB$ + *pnmhdr\IDFrom + #TAB$ + "(порядковый номер элемента в GUI)" + #CRLF$ + "код клика:" + #TAB$ + *pnmhdr\code + #TAB$ + "(определяет правой или левой, двойной или одинарный клик мыши)" + #CRLF$ + "№ пункта:" + #TAB$ + *pnmlv\iItem + #TAB$ + "(номер строки, отсчёт от 0, -1 пустое пространство)" + #CRLF$ + "№ колонки:" + #TAB$ + *pnmlv\iSubItem + #TAB$ + "(отсчёт от 0)" + #CRLF$ + "удерж. клавиша:" + #TAB$ + *pitema\uKeyFlags + #TAB$ + "(0=ничего; 1=Alt, 2=Ctrl, 4=Shift, 3,5,6,7 - комбинации)")

                        Case #NM_RDBLCLK ; правый двойной клик мышкой по пункту
                            SetGadgetText(1, "NM_RDBLCLK" + #TAB$ + "ДВОЙНОЙ клик ПРАВОЙ кнопкой мыши" + #CRLF$ + "дескриптор:" + #TAB$ + *pnmhdr\hWndFrom + #CRLF$ + "идентификатор:" + #TAB$ + *pnmhdr\IDFrom + #TAB$ + "(порядковый номер элемента в GUI)" + #CRLF$ + "код клика:" + #TAB$ + *pnmhdr\code + #TAB$ + "(определяет правой или левой, двойной или одинарный клик мыши)" + #CRLF$ + "№ пункта:" + #TAB$ + *pnmlv\iItem + #TAB$ + "(номер строки, отсчёт от 0, -1 пустое пространство)" + #CRLF$ + "№ колонки:" + #TAB$ + *pnmlv\iSubItem + #TAB$ + "(отсчёт от 0)" + #CRLF$ + "удерж. клавиша:" + #TAB$ + *pitema\uKeyFlags + #TAB$ + "(0=ничего; 1=Alt, 2=Ctrl, 4=Shift, 3,5,6,7 - комбинации)")
                    EndSelect
                Default
                    ; Обработка события кнопок
                    *pnmlv2.NMBHOTITEM=lParam
                    Text$ = ""

                    Select *pnmlv2\Code
                        Case #BCN_HOTITEMCHANGE ; Win XP и выше
                            If *pnmlv2\dwFlags & $10
                                Text$ = "наведена"
                            ElseIf *pnmlv2\dwFlags & $20
                                Text$ = "оставлена"
                            EndIf
                            SetGadgetText(1, "Кнопка " + GetGadgetText(*pnmhdr\IDFrom) + " " + Text$ + #CRLF$ + "идентификатор" + #TAB$ + Str(*pnmlv2\IDFrom) + #CRLF$ + "дескриптор:" + #TAB$ + Str(*pnmhdr\hWndFrom))
                    EndSelect
            EndSelect
    EndSelect

    ProcedureReturn Result
EndProcedure