Seite 1 von 1

ProgressBarSlider [gelöst]

Verfasst: 24.07.2015 11:23
von Imhotheb
Grüße Zusammen,

da mir die Trackbar vom Design her überhaupt nicht gefällt, habe ich versucht ein ProgressBarGadget dafür zu missbrauchen.
Funktioniert für mich eigentlich zufriedenstellend. Nur ein Problem bleibt natürlich ...

Ich brauche ein paar mehr dieser "Slider" und würde den Callback gerne universell benutzen können.
Das Problem besteht nun darin, das ich keine GadgetNr habe, nur die GadgetID(GadgetNr).
Get-/Setgadget fällt somit weg ... oder gibt es eine Möglichkeit (ohne Zwischenspeichern) die GadgetNr aus der GadgetID zu bekommen?

Vielleicht sitze ich auch einfach auf der leitung und es gibt eine ganz andere Möglichkeik ... sitze seit 2 Std. daran und drehe mich im Kreis.
Tante Google oder Onakel Yahoo waren auch nicht sehr hilfreich.

Code mit PB 5.31 / Win7 x86 getestet

Code: Alles auswählen

EnableExplicit

#PBM_GETPOS = #WM_USER + 8

Macro MAKELPARAM_(loWord, hiWord)
  ( hiWord << 16 | loWord )
EndMacro

Global ETCallBack
Define Null.w = 0

Procedure EventTypeCallbackH(PBar, Message, wParam, lParam)
  Protected m.POINT
  Protected oldX, X, Level, Gadget
  
  ;Gadget = EventGadget()    ; Funktioniert NICHT
  ;wParam ist GadgetID(0) ... manchmal auch 0, 1 oder 18 ?
  
  If Message = #WM_LBUTTONDOWN
    ;Level = SendMessage_(wParam, #PBM_GETPOS, 0, 0)  ; liefert manchmal 0 oder weniger
    Level = GetGadgetState(0)
    GetCursorPos_(m)
    oldX = m\x
    While GetAsyncKeyState_(#VK_LBUTTON)
      GetCursorPos_(m)
      X = m\x
      Level + (X - oldX)
      If Level > 250
        Level = 250
      ElseIf level < 0
        Level = 0
      EndIf   
      SetGadgetState(0, Level)
      ;SendMessage_(wParam, #PBM_SETPOS, 0, MAKELPARAM_(0, Level))    ; funktioniert NICHT
      oldX = X
      SetWindowTitle(0, "ProgressSlider: " + Str(Int(GetGadgetState(0) / 2.5))) ; Nur zum testen
      WaitWindowEvent(5)
    Wend
  EndIf
  
  ProcedureReturn CallWindowProc_(ETCallBack, PBar, Message, wParam, lParam)
EndProcedure

     

If OpenWindow(0, 0, 0, 270, 40, "ProgressSlider: 60", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)  
  
  ProgressBarGadget(0, 10, 10, 250, 20, 0, 250, #PB_ProgressBar_Smooth)
  SetWindowTheme_(GadgetID(0), 0, @Null)
  SendMessage_(GadgetID(0),#CCM_SETBKCOLOR,0,#Black)
  SendMessage_(GadgetID(0), #WM_USER + 9, 0, #Red)
  SetGadgetState(0, 150)
  ETCallback = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @EventTypeCallbackH())

  Repeat    
  Until WaitWindowEvent() = #PB_Event_CloseWindow
        
EndIf

Re: ProgressBarSlider

Verfasst: 24.07.2015 11:45
von RSBasic
Imhotheb hat geschrieben:da mir die Trackbar vom Design her überhaupt nicht gefällt
Du kannst beispielsweise so machen, sieht etwas anders aus. Vielleicht gefällt es dir: http://www.rsbasic.de/aktualisierung/wi ... tiefung.pb
Imhotheb hat geschrieben:Get-/Setgadget fällt somit weg ... oder gibt es eine Möglichkeit (ohne Zwischenspeichern) die GadgetNr aus der GadgetID zu bekommen?
http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
Imhotheb hat geschrieben:Tante Google oder Onakel Yahoo waren auch nicht sehr hilfreich.
Schade, dass mein Bruder WinAPI Library nicht dabei ist. :D

Re: ProgressBarSlider

Verfasst: 24.07.2015 13:02
von Imhotheb
Danke für die schnelle Antwort.
Übrigens finde ich deine WinAPI-Library klasse ... hatte ("Bruder-")WinAPI zwar bemüht, jedoch an der falschen Stelle :|

Werde das morgen mal testen.

Re: ProgressBarSlider

Verfasst: 24.07.2015 17:49
von Derren
Vielleicht interessiert dich ja dieser Thread: http://purebasic.fr/german/viewtopic.php?f=8&t=24588
Das ganze ist nicht wirklich ein TrackbarGadget, eher ein Fortschrittsbalken, dessen Position man mit der Maus bestimmen kann.
GrabMouse durch ClipMouse ersetzen, dann klappt's auch mit den Nachbarn.

Re: ProgressBarSlider

Verfasst: 25.07.2015 17:16
von Imhotheb
RSBasic hat geschrieben:Du kannst beispielsweise so machen, sieht etwas anders aus. Vielleicht gefällt es dir: http://www.rsbasic.de/aktualisierung/wi ... tiefung.pb
Sieht "etwas" anders aus ... das schon, aber nicht so anders wie ich mir das vorgestellt hatte ^^

Meine ProgressSlider habe ich allerdings auch aufgegeben, da mir das erstellen und "feuern" der ganzen Events zu aufwendig erschien.

Habe mich jetzt entschlossen diesen Code zu verwenden:

Code: Alles auswählen

EnableExplicit

#CDDS_ITEM = $10000
#CDDS_PREPAINT = 1
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDDS_SUBITEM = $20000
#CDRF_DODEFAULT = 0
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_SKIPDEFAULT = 4
#TBCD_CHANNEL = 3
#TBCD_THUMB = 2
#TBCD_TICS = 1

Global TBarBg_Brush, TBarLine_Brush, TBarThumb_Brush, TBarThumb_Pen

TBarLine_Brush = CreateSolidBrush_(RGB(50,0,0))
TBarBg_Brush = CreateSolidBrush_(#Black)
TBarThumb_Brush = CreateSolidBrush_(#Red)
TBarThumb_Pen = CreatePen_(#PS_SOLID, 1, RGB(50,0,0))

Procedure WindowCallback(hWnd, msg, wParam, lParam)
  Protected result
  Protected tGadget
  Protected *pnmhdr.NMHDR
  Protected *tbcd.NMCUSTOMDRAW
  Protected channelRc.RECT
  
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_CTLCOLORSTATIC
      If GadgetType(GetProp_(lParam, "PB_ID")) = #PB_GadgetType_TrackBar
        ProcedureReturn TBarBg_Brush
      EndIf
    Case #WM_NOTIFY
      tGadget = #False
      *pnmhdr = lParam
      If *pnmhdr\code = #NM_CUSTOMDRAW
        *tbcd = lParam
        result = #CDRF_DODEFAULT
        Select *tbcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            If *tbcd\dwItemSpec = #TBCD_CHANNEL
              channelRc\Left = *tbcd\rc\Left 
              channelRc\top = *tbcd\rc\top + 5
              channelRc\Right = *tbcd\rc\Right
              channelRc\bottom = *tbcd\rc\bottom - 3
              FillRect_(*tbcd\hDC, channelRc, TBarLine_Brush)
              result = #CDRF_SKIPDEFAULT
            EndIf
            If *tbcd\dwItemSpec = #TBCD_THUMB
              SelectObject_(*tbcd\hDC, TBarThumb_Brush)
              SelectObject_(*tbcd\hDC, TBarThumb_Pen)
              Rectangle_(*tbcd\hdc, *tbcd\rc\left, *tbcd\rc\top, *tbcd\rc\right, *tbcd\rc\bottom)
              result = #CDRF_SKIPDEFAULT
            EndIf
            If *tbcd\dwItemSpec = #TBCD_TICS
              result = #CDRF_DODEFAULT
            EndIf
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 0, 0, 270, 40, "TrackBar-Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)  
  
  SetWindowColor(0, 0)
  SetWindowCallback(@WindowCallback())
  TrackBarGadget(1, 10, 10, 250, 25, 0, 100)
  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
        
EndIf
Hatte das irgendwo (weiß nicht mehr wo genau) gefunden ... habe es etwas angepasst und verändert ... und ist weiterhin eine "normale" TrackBar

Man kann hier die Hintergrundfarbe, Linienfarbe, Marker/-rahmen Farbe ändern, alles was ich brauchte ;-)

Vielen Dank Allen