Seite 3 von 3

Re: Wie baut man einen Thread richtig auf?

Verfasst: 23.09.2022 13:40
von Mijikai
Beispiel ScrollBarGadget für die Lautstärke:

Code: Alles auswählen

EnableExplicit

Procedure.i Main()
  Protected *chip
  If InitSound()
    *chip = ReceiveHTTPMemory("https://api.modarchive.org/downloads.php?moduleid=44167#greenery.mod")
    If *chip
      If OpenWindow(0,0,0,400,400,#Null$,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
        If ScrollBarGadget(1,260,50,20,300,0,100,10,#PB_ScrollBar_Vertical) And CatchMusic(0,*chip,MemorySize(*chip))
          SetGadgetState(1,50)
          MusicVolume(0,50)
          PlayMusic(0)
          Repeat
            Select WaitWindowEvent()
              Case #PB_Event_Gadget
                Select EventGadget()
                  Case 1
                    MusicVolume(0,GetGadgetState(1))
                EndSelect
              Case #PB_Event_CloseWindow
                Break
            EndSelect
          ForEver
        EndIf
        CloseWindow(0)  
      EndIf
      FreeMemory(*chip)
    EndIf
  EndIf
  ProcedureReturn #Null
EndProcedure

Main()

End

Re: Wie baut man einen Thread richtig auf?

Verfasst: 23.09.2022 13:46
von jacdelad
Statt der ganzen ExamineKeyboards würde ich es mit Shortcuts versuchen, die können direkt in der Ereignisschleife abgearbeitet werden. Siehe AddKeyboardShortcut.

Außerdem solltest du kein WaitWindowEvent in irgendwelche Subroutinen haben.

Des Weiteren könntest du das ScrollBarGadget mittels BindGadgetEvent() an eine Funktion binden, das kann eventuell die Blockierung aufheben, ich kann es aber momentan nicht testen.

Threads solltest du aber eigentlich nicht brauchen.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 24.09.2022 00:39
von Re42
Den Ansatz mit Thread verfolge ich nicht weiter. Stattdessen weiß ich mittlerweile, wie man bei einem vertikalen TrackBarGadget die Ausrichtung des Pfeils nach links macht. Das wäre auf jeden Fall eine Lösung, aber optisch gefallen tut die mir eher weniger in dem Fall. Danke für die sonstigen Anregungen, die heute noch gekommen waren.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 24.09.2022 11:50
von mk-soft
Für die es wissen möchten wie man die Pfeilrichtung ändert und den Fokus-Rahmen entfernt. (OS-Windows)

Update: Kleine CanvasGadget Spielerei hinzugefügt ... (TrackBar in Prozent mit zwei Komma-Stellen)

Code: Alles auswählen

;-TOP

#ProgramTitle = "TrackBar Example"
#ProgramVersion = "v1.01.3"

Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBar
  #MainMenu
EndEnumeration

Enumeration MenuItems
  #MainMenuAbout
  #MainMenuExit
EndEnumeration

Enumeration Gadgets
  #MainCanvas
  #MainTrackBarV
  #MainTrackBarH
EndEnumeration

Enumeration StatusBar
  #MainStatusBar
EndEnumeration

Macro LOWORD(dwValue) : dwValue & $FFFF : EndMacro;
Macro HIWORD(dwValue) : dwValue >> 16 : EndMacro;

Macro MAKELPARAM( loWord, hiWord) : (hiWord << 16 | loWord) : EndMacro;
Macro MAKEWPARAM( loWord, hiWord) : (hiWord << 16 | loWord) : EndMacro;

Structure udtCanvasGadget
  Gadget.i
  BackColor.i
  BoxColor.i
  BoxSize.i
  LineColor.i
  TrackOffset.i
  TrackPosX.i
  TrackPosY.i
EndStructure

Global CanvasData.udtCanvasGadget

; ----

Procedure InitCanvas(Gadget, *Data.udtCanvasGadget)
  With *Data
    \Gadget = Gadget
    \BackColor = #White
    \BoxColor = #Red
    \BoxSize = 17
    \LineColor = #Gray
    CompilerSelect #PB_Compiler_OS
      CompilerCase #PB_OS_Windows
        \TrackOffset = 13
      CompilerCase #PB_OS_Linux
        \TrackOffset = 3
      CompilerCase #PB_OS_MacOS
        \TrackOffset = 12
    CompilerEndSelect
  EndWith
  
EndProcedure

Procedure DrawCanvas(*Data.udtCanvasGadget)
  Protected dx, dy, deltaX, deltaY, PosX, PosY, Size2
  With *Data
    If StartDrawing(CanvasOutput(\Gadget))
      dx = GadgetWidth(\Gadget)
      dy = GadgetHeight(\Gadget)
      deltaX = dx - 2 * \TrackOffset - 1
      deltaY = dy - 2 * \TrackOffset - 1
      PosX = \TrackPosX * deltaX / 10000 + \TrackOffset
      PosY = \TrackPosY * deltaY / 10000 + \TrackOffset
      Size2 = \BoxSize / 2
      Box(0, 0, dx, dy, \BackColor)
      LineXY(0, PosY, dx, PosY, \LineColor)
      LineXY(PosX, 0, PosX, dy, \LineColor)
      Box(PosX - Size2, PosY - Size2, \BoxSize, \BoxSize, \BoxColor)
      ;Circle(PosX, PosY, Size2, \BoxColor)
      StopDrawing()
    EndIf  
  EndWith
  
EndProcedure

Procedure DoEventTrackBar()
  Protected info.s, x, y
  x = GetGadgetState(#MainTrackBarH)
  y = 10000 - GetGadgetState(#MainTrackBarV)
  With CanvasData
    \TrackPosX = x
    \TrackPosY = y
  EndWith
  DrawCanvas(CanvasData)
  info = " X = " + Str(x) + " / Y = " + Str(y)
  StatusBarText(#MainStatusBar, 0, info)
EndProcedure

Procedure UpdateWindow()
  Protected dx, dy
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
  ; Resize gadgets
  ResizeGadget(#MainCanvas, 10, 10, dx - 50, dy - 50)
  ResizeGadget(#MainTrackBarV, dx - 40, 10, 30, dy - 50)
  ResizeGadget(#MainTrackBarH, 10, dy - 40, dx - 50, 30)
  DrawCanvas(CanvasData)
EndProcedure

Procedure Main()
  Protected dx, dy
  
  #MainStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, 800, 600, #ProgramTitle , #MainStyle)
    ; Menu
    CreateMenu(#MainMenu, WindowID(#Main))
    MenuTitle("&File")
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      MenuItem(#PB_Menu_About, "")
    CompilerElse
      MenuItem(#MainMenuAbout, "About")
      MenuBar()
    CompilerEndIf
    
    MenuItem(#MainMenuExit, "E&xit")
    
    ; StatusBar
    CreateStatusBar(#MainStatusBar, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; Gadgets
    dx = WindowWidth(#Main)
    dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
    
    CanvasGadget(#MainCanvas, 10, 10, dx - 50, dy - 50)
    
    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      TrackBarGadget(#MainTrackBarH, 10, dy - 40, dx - 50, 30, 0, 10000, #TBS_TOP)
      TrackBarGadget(#MainTrackBarV, dx - 40, 10, 30, dy - 50, 0, 10000, #PB_TrackBar_Vertical | #TBS_LEFT)
      SendMessage_(GadgetID(#MainTrackBarH), #WM_UPDATEUISTATE, MAKEWPARAM(#UIS_SET, #UISF_HIDEFOCUS), 0)
      SendMessage_(GadgetID(#MainTrackBarV), #WM_UPDATEUISTATE, MAKEWPARAM(#UIS_SET, #UISF_HIDEFOCUS), 0)
    CompilerElse
      TrackBarGadget(#MainTrackBarH, 10, dy - 40, dx - 50, 30, 0, 10000)
      TrackBarGadget(#MainTrackBarV, dx - 40, 10, 30, dy - 50, 0, 10000, #PB_TrackBar_Vertical)
    CompilerEndIf
    
    SetGadgetState(#MainTrackBarH, 5000)
    SetGadgetState(#MainTrackBarV, 10000 - 5000)
    
    InitCanvas(#MainCanvas, CanvasData)
    DoEventTrackBar()
    
    ; Bind Events
    BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #Main)
    
    BindGadgetEvent(#MainTrackBarV, @DoEventTrackBar())
    BindGadgetEvent(#MainTrackBarH, @DoEventTrackBar())
    
    AddWindowTimer(#Main, 1, 1000)
    
    ; Event Loop
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                PostEvent(#PB_Event_Menu, #Main, #MainMenuAbout)
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                PostEvent(#PB_Event_CloseWindow, #Main, #Null)
                
            CompilerEndIf
            
          Case #MainMenuAbout
            MessageRequester("About", #ProgramTitle + #LF$ + #ProgramVersion, #PB_MessageRequester_Info)
              
          Case #MainMenuExit
            PostEvent(#PB_Event_CloseWindow, #Main, #Null)
            
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
              
          EndSelect
          
        Case #PB_Event_Timer
          Select EventTimer()
            Case 1
              ;Debug "Timer 1"
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
EndProcedure : Main()

Re: Wie baut man einen Thread richtig auf?

Verfasst: 24.09.2022 12:59
von Re42
In meinem Post gestern hatte ich leider #TBS_LEFT gar nicht dazugeschrieben, blöd, aber gut, daß du es nun extra nochmal erklärt hast. Dank deines neuesten Codes weiß ich jetzt auch, daß man beim TrackBarGadget sogar den Fokus-Rahmen entfernen kann, du bist echt ein Profi, Danke :allright:

Re: Wie baut man einen Thread richtig auf?

Verfasst: 24.09.2022 14:05
von mk-soft
Update: Kleine CanvasGadget Spielerei hinzugefügt ... (TrackBar in Prozent mit zwei Komma-Stellen) :wink: