Trackbar Style ?

Anfängerfragen zum Programmieren mit PureBasic.
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

Trackbar Style ?

Beitrag von Simon74 »

Hallo,

vom Design wäre mir die Progressbar lieber, von den Funktionen benötige ich jedoch das Trackbar Gadget. (Ich muss die Position per Maulklick anpassen können).

Kann der Style des Trackbar-Gadgets (Crossplattform tauglich) angepasst werden ?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Trackbar Style ?

Beitrag von NicTheQuick »

Um es etwas einfacher zu machen, könntest du dir auch was mit dem 'CanvasGadget()' basteln. Also in der Größe der Progressbar und mit dessen Farben, aber dass man es eben per Klick ändern kann.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Trackbar Style ?

Beitrag von Sicro »

Das Fenster hat unter Windows leider kein #PB_EventType_LeftClick.

Vielleicht hilft dir mein Code trotzdem bei der Umsetzung per CanvasGadget:

Code: Alles auswählen

Procedure MouseOverGadget(Window, Gadget)
  Protected.i MouseX, MouseY, GadgetX, GadgetY, GadgetWidth, GadgetHeight
  
  MouseX = WindowMouseX(Window)
  MouseY = WindowMouseY(Window)
  
  GadgetX = GadgetX(Gadget, #PB_Gadget_WindowCoordinate)
  GadgetY = GadgetY(Gadget, #PB_Gadget_WindowCoordinate)
  
  GadgetWidth  = GadgetWidth(Gadget)
  GadgetHeight = GadgetHeight(Gadget)
  
  If MouseX >= GadgetX And MouseX <= (GadgetX + GadgetWidth) And MouseY >= GadgetY And MouseY <= (GadgetY + GadgetHeight)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure.f GetProgressBarStepWidth(ProgressBarGadget)
  Protected.i ProgressBarValueRange
  
  ProgressBarValueRange = GetGadgetAttribute(ProgressBarGadget, #PB_ProgressBar_Maximum)
  ProgressBarValueRange - GetGadgetAttribute(ProgressBarGadget, #PB_ProgressBar_Minimum)
  
  ProcedureReturn GadgetWidth(ProgressBarGadget) / ProgressBarValueRange
EndProcedure

Define Event.i, Value.f

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 500, 100, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ProgressBarGadget(0, 10, 30, 480, 30, 0, 100, #PB_ProgressBar_Smooth)
  ; #PB_ProgressBar_Smooth - Auf Windows XP mit eingeschalteten Skins und auf OS X hat dieses Flag keinen Effekt.
  
  ; PB_ProgressBar_Smooth-Workaround für Windows
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    If IsAppThemed_()
      SetWindowTheme_(GadgetID(0), @" ", @" ") ; Theme beim Gadget deaktivieren
    EndIf
  CompilerEndIf
  
  Repeat
    Event = WaitWindowEvent()
    
    If MouseOverGadget(0, 0) ;And EventType() = #PB_EventType_LeftClick ; Linux
      Value = WindowMouseX(0) - GadgetX(0, #PB_Gadget_WindowCoordinate)
      Value / GetProgressBarStepWidth(0)
      SetGadgetState(0, Value)
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
Zuletzt geändert von Sicro am 25.03.2015 23:16, insgesamt 3-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

Re: Trackbar Style ?

Beitrag von Simon74 »

Vielen Dank für Tip und Beispiel.
mal sehen wie weit ich komme
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Trackbar Style ?

Beitrag von Danilo »

Minimalbeispiel:

Code: Alles auswählen

Procedure RepaintCanvas(x)
    If StartDrawing( CanvasOutput(0) )
        Box(0,0,OutputWidth(),OutputHeight(),RGB($FF,$FF,$FF))
        DrawingMode(#PB_2DDrawing_Gradient)
        BackColor(RGB($40,$40,$40))
        FrontColor(RGB($DD,$DD,$DD))
        LinearGradient(0, 0, OutputWidth(), OutputHeight())
        Box(0,0,OutputWidth(),OutputHeight())
        DrawingMode(#PB_2DDrawing_Default)
        Box(x,0,OutputWidth()-x,OutputHeight(),RGB($FF,$FF,$FF))
        Box(x-3,0,5,OutputHeight(),RGB($00,$00,$00))
        StopDrawing()
    EndIf
    Debug x
EndProcedure

Procedure OnLeftClick()
    RepaintCanvas( GetGadgetAttribute(0,#PB_Canvas_MouseX) )
EndProcedure

Procedure OnMouseMove()
    If GetGadgetAttribute(0,#PB_Canvas_Buttons) & #PB_Canvas_LeftButton
        x = GetGadgetAttribute(0,#PB_Canvas_MouseX)
        If x < 0 : x = 0 : EndIf
        If x > GadgetWidth(0) : x = GadgetWidth(0) : EndIf
        RepaintCanvas( x )
    EndIf
EndProcedure

If OpenWindow(0, 0, 0, 220, 120, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 10, 10, 200, 20)
    
    RepaintCanvas(50)
    
    BindGadgetEvent(0, @OnLeftClick(),#PB_EventType_LeftClick)
    BindGadgetEvent(0, @OnMouseMove(),#PB_EventType_MouseMove)
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

Re: Trackbar Style ?

Beitrag von Simon74 »

Danilo hat geschrieben:Minimalbeispiel:
Na so minimal ist das nicht :)
Vielen Dank
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Trackbar Style ?

Beitrag von Danilo »

Simon74 hat geschrieben:Na so minimal ist das nicht :)
Hey, nur 33 Zeilen (ohne Leerzeilen), und 9 Zeilen davon sind schon das schöne Zeichnen mit Farbverlauf usw. ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

Re: Trackbar Style ?

Beitrag von Simon74 »

So meinte ich das nicht, ich meinte:
--> Minimaler Code, mit maximaler Wirkung :)
Antworten