ProgressBarSlider [gelöst]

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

ProgressBarSlider [gelöst]

Beitrag 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
Zuletzt geändert von Imhotheb am 25.07.2015 17:16, insgesamt 1-mal geändert.
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ProgressBarSlider

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: ProgressBarSlider

Beitrag 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.
weil einfach einfach einfach ist ... mach' ich es anders
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: ProgressBarSlider

Beitrag 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.
Signatur und so
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: ProgressBarSlider

Beitrag 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
weil einfach einfach einfach ist ... mach' ich es anders
Antworten