PureBasic

;
; ------------------------------------------------------------
;
;  PureBasic - BindEvent and  BindGadgetEvent example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

; Давайте создадим быструю Кнопку, которая генерирует событие, пока она нажата.

Global Gadget, Pressed.b, n
Global Min=-50, Max=50

; Изменяйте скорость здесь!
Global Delay=50 ; 50 ms


Procedure paint(canvas, state, text$)
    ; Рисунок Канвас как фальш-кнопка  "+" и как фальш-кнопка "-"
    Protected w, h
    ; Состояние: 0    = Нажата
    ; Состояние: Не 0 = Отпущена
    If StartDrawing(CanvasOutput(canvas))
        Box(0,0,31,31,$CFFFFC) ; Жёлтый фон
        If state=0              ; Вверх
            LineXY(0,31,31,31,$000000)
            LineXY(31,0,31,31,$000000)
            LineXY(0,0,31,0,$FFFFFF)
            LineXY(0,0,0,31,$FFFFFF)
        Else      ;Вниз
            LineXY(0,31,31,31,$FFFFFF)
            LineXY(31,0,31,31,$FFFFFF)
            LineXY(0,0,31,0,$000000)
            LineXY(0,0,0,31,$000000)
        EndIf
        w=TextWidth(text$)
        h=TextHeight(text$)
        DrawText(16-w/2, 16-h/2, Text$, $000000, $CFFFFC)

        StopDrawing()
    EndIf

EndProcedure

Procedure OnSpeedButtonEvent()
    ; Привязать все кнопки "-" к событиям и все кнопки "+" к событиям.
    Gadget = EventGadget()

    Select EventType() ; Какое событие?
        Case #PB_EventType_MouseEnter
            If Gadget=0
                Debug "Наведено на кнопку -"
            ElseIf Gadget=1
                Debug "Наведено на кнопку +"
            EndIf

        Case #PB_EventType_MouseLeave
            If Gadget=0
                Debug "Убрано с кнопки -"
            ElseIf Gadget=1
                Debug "Убрано с кнопки +"
            EndIf

            ; Каждый раз при нажатии левой кнопки мыши.
        Case #PB_EventType_LeftButtonDown
            Pressed = #True

            Select Gadget
                Case 0 ; Кнопка "-"
                    paint(0,1,"-") ; Нарисованная Кнопка"-" Нажата
                Case 1              ; Кнопка "+"
                    paint(1,1,"+") ; Нарисованная Кнопка "+" Нажата
            EndSelect

        Case #PB_EventType_LeftButtonUp
            Pressed = #False
            paint(0,0,"-")    ; Нарисованная Кнопка "-" Отпущена
            paint(1,0,"+")      ; Нарисованная Кнопка "+" Отпущена

    EndSelect
EndProcedure

Procedure OnTimer()
    If Pressed ; Каждый раз, когда на кнопку нажимают левой кнопкой мыши и пока она нажата.
        Select Gadget
            Case 0 ; Кнопка "-"
                If n>Min
                    n-1
                    SetGadgetState(2, GetGadgetState(2)-1) ; Прогресс вниз
                EndIf

            Case 1 ; Кнопка "+"
                If n<Max
                    n+1
                    SetGadgetState(2, GetGadgetState(2)+1) ; Прогресс вверх
                EndIf
        EndSelect

        Debug n
    EndIf
EndProcedure

; Откроем окно с некоторыми Гаджетами.
OpenWindow(0, 0, 0, 400, 100, "Кликайте долго, пожалуйста, на +/- ;)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 10, 30, 32, 32)        ; Фальш-Кнопка -
CanvasGadget(1, 400-32-10, 30, 32, 32) ; Фальш-Кнопка +
paint(0,0,"-")
paint(1,0,"+")
ProgressBarGadget(2,52,30,296,32,Min,Max,#PB_ProgressBar_Smooth)

AddWindowTimer(0, 100, Delay) ; Таймер 100 ms

BindGadgetEvent(0, @OnSpeedButtonEvent()) ; Привязать все кнопки  "-" к событиям
BindGadgetEvent(1, @OnSpeedButtonEvent()) ; Привязать все кнопки "+" к событиям
BindEvent(#PB_Event_Timer, @OnTimer())      ; Привязать таймер к событиям

Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow