PureBasic

SetWindowCallback()

Синтаксис

SetWindowCallback(@ProcedureName() [, #Window])

Описание


Только для опытных программистов. Эта функция поддерживается только в Microsoft Windows.

Стандартные события должны обрабатываться с помощью обычных команд WaitWindowEvent() и WindowEvent().

Эта команда задаёт процедуру обратного вызова, которая будет вызываться для обработки событий всех открытых Окон. Все события перехватываются этой процедурой и в ней же могут быть обработаны. Для того чтобы в эту процедуру перенаправить события только одного конкретного Окна, можно использовать необязательный параметр '#Window', для передачи в функцию Номера этого Окна. В таком случае, на каждое Окно может приходиться по одной процедуре обратного вызова, эти процедуры будут "связаны", каждая со "своим" Окном. Одновременно с ними может быть создана процедура без дополнительного параметра '#Window', и она будет перехватывать события всех остальных (не связанных ранее с другими процедурами) Окон.

Чтобы отключить перехват событий конкретной процедурой обратного вызова, необходимо вызвать SetWindowCallback(0 ,#Window) с соответствующим параметром '#Window' для связанной с конкретным Окном процедуры, и SetWindowCallback(0) для не связанной с конкретным Окном процедуры.

Предупреждение: Будьте осторожны, это относительно низкоуровневые операции, и неправильная обработка событий в процедуре обратного вызова может вмешаться во внутреннюю обработку событий Purebasic.

Параметры

@ProcedureName() Адрес используемой процедуры обратного вызова. Процедура обратного вызова должна иметь 4 параметра и имеет следующую форму:

Procedure MyWindowCallback(WindowID, Message, WParam, LParam)
    Result = #PB_ProcessPureBasicEvents
    ;
    ; Код обработки событий
    ;
    ProcedureReturn Result
EndProcedure

#Window (дополн.) Номер идентифицирующий Окно, которое требуется "связать" с процедурой обратного вызова. Если этот параметр опущен, процедура будет перехватывать события всех Окон, которые ранее не были "связаны" с другой процедурой обратного вызова.

Возвращаемое значение

Ничего.

Пример:

В этом примере показано, как проверить несколько параметров окна (используя константы Windows API):

Procedure WinCallback(hWnd, uMsg, WParam, LParam)
    ; Windows автоматически заполняет параметр, который мы будем использовать в функции обратного вызова...

    If uMsg = #WM_SIZE
        Select WParam
            Case #SIZE_MINIMIZED
                Debug "Окно было свёрнуто."
            Case #SIZE_RESTORED
                Debug "Окно было восстановлено."
            Case #SIZE_MAXIMIZED
                Debug "Окно было развернуто."
        EndSelect
    EndIf

    ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

    SetWindowCallback(@WinCallback()) ; активировать обратный вызов

    Repeat
        Select WaitWindowEvent()
            Case #PB_Event_CloseWindow
                End
        EndSelect
    ForEver

EndIf

Пример:

В этом примере создаются две процедуры обратного вызова, для каждого окна по одной. Здесь тоже используются константы Windows API:

; Значение параметров hWnd, uMsg, wParam и lParam смотрите в описании WinApi

Procedure WinCallback1(hWnd, uMsg, wParam, lParam) ; Процедура обратного вызова для окна 1.

    If uMsg = #WM_COMMAND
        If lParam=ToolBarID(1)
            Debug wParam & $FFFF
        EndIf
    EndIf

    ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure WinCallback2(hWnd, uMsg, wParam, lParam) ; Процедура обратного вызова для окна 2.

    If uMsg = #WM_COMMAND
        If lParam=ToolBarID(2)
            Debug wParam & $FFFF
        EndIf
    EndIf

    ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

OpenWindow(1, #PB_Ignore, #PB_Ignore, 200, 30, "ToolBar 1", #PB_Window_SystemMenu ); Создание окна 1.
If CreateToolBar(1, WindowID(1)) ; Создание панели управления для окна 1.
    ToolBarStandardButton(0, #PB_ToolBarIcon_New) ; Добавление кнопок к панели управления.
    ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
EndIf

SetWindowCallback(@WinCallback1(), 1) ; Привязка первой процедуры к окну 1, для перехвата событий окна 1.

OpenWindow(2, #PB_Ignore, #PB_Ignore, 200, 30, "ToolBar 2", #PB_Window_SystemMenu )
If CreateToolBar(2, WindowID(2))
    ToolBarStandardButton(3, #PB_ToolBarIcon_New)
    ToolBarStandardButton(4, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(5, #PB_ToolBarIcon_Save)
EndIf

SetWindowCallback(@WinCallback2(), 2) ; Привязка второй процедуры к окну 2, для перехвата событий окна 2.

Repeat
    Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

Поддерживаемые OS

Windows

<- SetActiveWindow() - Оглавление Window - SetWindowColor()->