Описание функции
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