Scrollbars mit Verlauf im Hintergrund

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Scrollbars mit Verlauf im Hintergrund

Beitrag von Ligatur »

Auf folgende Weise kann man Scrollbars mit einem Verlauf im Hintergrund erzeugen, funktioniert auch mit Bildern als Hintergrund oder es lässt sich auch mit den API - GDI - Funktionen darauf zeichnen.

Code: Alles auswählen

Enumeration 
   #sbg_Rot 
   #sbg_Gruen 
   #sbg_Blau 
   #str_Rot 
   #str_Gruen 
   #str_Blau 
   #txt_Rot 
   #txt_Gruen 
   #txt_Blau 
EndEnumeration 

Enumeration 
   #img_R 
   #img_G 
   #img_B 
EndEnumeration 

Procedure Verlauf(Image, Start, Stop, VonR, VonG, VonB, BisR, BisG, BisB) 
   ; Differenzen der einzelnen Farbkomponenten berechnen 
   dy = Stop - Start 
   dr.f = (BisR - VonR) / dy 
   dg.f = (BisG - VonG) / dy 
   db.f = (BisB - VonB) / dy 
   ar.f = VonR 
   ag.f = VonG 
   ab.f = VonB 
   StartDrawing(ImageOutput(Image)) 
   For i = Start To Stop
   		Plot(0, i, RGB(Int(ar), Int(ag), Int(ab)))
      ar + dr 
      ag + dg 
      ab + db 
   Next 
   StopDrawing() 
EndProcedure 

Procedure wc(hwnd, msg, wParam, lParam) 
   Static Farbe, RBrush, GBrush, BBrush, Pfeil, VBarHoch 
   Ergebnis = #PB_ProcessPureBasicEvents 
    
   Select msg 
      Case #WM_CREATE 
         Pfeil = GetSystemMetrics_(#SM_CYVSCROLL) ; Höhe des Scrollbarpfeils besorgen 
         VBarHoch = GadgetHeight(#sbg_Rot) 
         ;Für jedes Scrollbargadget ein Image 
         CreateImage(#img_R, 1, VBarHoch) 
         CreateImage(#img_G, 1, VBarHoch) 
         CreateImage(#img_B, 1, VBarHoch) 
         ; Verlauf fängt immer nach der Zeile an, die nach dem oberen Pfeil kommt, damit die Position der Farbn stimmen 
         Verlauf(#img_R, Pfeil, VBarHoch - Pfeil, 0, 0, 0, 255, 0, 0) 
         Verlauf(#img_G, Pfeil, VBarHoch - Pfeil, 0, 0, 0, 0, 255, 0) 
         Verlauf(#img_B, Pfeil, VBarHoch - Pfeil, 0, 0, 0, 0, 0, 255) 
          
         ;Für jedes Scrollbargadget ein Brush, der den jeweiligen Verlauf enthält 
         RBrush = CreatePatternBrush_(ImageID(#img_R)) 
         GBrush = CreatePatternBrush_(ImageID(#img_G)) 
         BBrush = CreatePatternBrush_(ImageID(#img_B)) 
          
      Case #WM_VSCROLL 
         rv = GetGadgetState(#sbg_Rot) 
         gv = GetGadgetState(#sbg_Gruen) 
         bv = GetGadgetState(#sbg_Blau) 
         If lParam = GadgetID(#sbg_Rot) 
            SetGadgetText(#str_Rot, Str(rv)) 
         ElseIf lParam = GadgetID(#sbg_Gruen) 
            SetGadgetText(#str_Gruen, Str(gv)) 
         ElseIf lParam = GadgetID(#sbg_Blau) 
            SetGadgetText(#str_Blau, Str(bv)) 
         EndIf 
         ; Farbverläufe neu erzeugen 
         Verlauf(#img_R, Pfeil, VBarHoch - Pfeil, 0, gv, bv, 255, gv, bv) 
         Verlauf(#img_G, Pfeil, VBarHoch - Pfeil, rv, 0, bv, rv, 255, bv) 
         Verlauf(#img_B, Pfeil, VBarHoch - Pfeil, rv, gv, 0, rv, gv, 255) 
         ;Alte Brushes löschen 
         DeleteObject_(RBrush) 
         DeleteObject_(GBrush) 
         DeleteObject_(BBrush) 
         ;Neue Brushes erzeugen 
         RBrush = CreatePatternBrush_(ImageID(#img_R)) 
         GBrush = CreatePatternBrush_(ImageID(#img_G)) 
         BBrush = CreatePatternBrush_(ImageID(#img_B)) 
         ;Fenster für ungültig erklären, damit gewählte Farbe angezeigt wird 
         InvalidateRect_(hwnd, 0, #False) 
         Farbe = RGB(GetGadgetState(#sbg_Rot), GetGadgetState(#sbg_Gruen), GetGadgetState(#sbg_Blau)) 
      Case #WM_PAINT 
         hdc = BeginPaint_(hwnd, @ps.PAINTSTRUCT) 
         ABrush = SelectObject_(hdc, CreateSolidBrush_(Farbe)) 
         Rectangle_(hdc, 180, 10, 790, 590) 
         DeleteObject_(SelectObject_(hdc, ABrush)) 
         EndPaint_(hwnd, @ps) 
         Ergebnis = 0 
      Case #WM_CTLCOLORSCROLLBAR 
         ;Hintergrund der Scrollbars setzen (Mit zurückgegebenen Brush wird der Hintergrund gezeichnet) 
         ;Es ist auch möglich, mit hilfe des in wParam zurückgegebenen Devicekontextes direkt in den Hintergrund zu malen 
         ;dann muss aber GetStockObject_(#NULL_BRUSH) zurückgegeben werden damit kein übermalen stattfindet 
         ;und der Hintergrund muß immer vorher gelöscht werden damit alles richtig funktioniert. 
         ; 
         ;Überprüfen ob als letztes erzeugtes Scrollgadget existiert, da sonst im Debug - Mode Fehlermeldung 
         If IsGadget(#sbg_Blau) 
            Select lParam 
               Case GadgetID(#sbg_Rot) 
                  Ergebnis = RBrush 
               Case GadgetID(#sbg_Gruen) 
                  Ergebnis = GBrush 
               Case GadgetID(#sbg_Blau) 
                  Ergebnis = BBrush 
               Default 
                  Ergebnis = 0 
            EndSelect 
           EndIf 
      Case #WM_DESTROY 
         ;Am Ende die Brushes wieder löschen 
         DeleteObject_(RBrush) 
         DeleteObject_(GBrush) 
         DeleteObject_(BBrush) 
   EndSelect 
    
   ProcedureReturn Ergebnis 
EndProcedure 

hwnd = OpenWindow(0, 0, 0, 800, 600, "Farbschauer", #PB_Window_SystemMenu) 
SetWindowCallback(@wc(), 0) 
CreateGadgetList(hwnd) 
ScrollBarGadget(#sbg_Rot, 25, 10, 25, 560, 0, 264, 10, #PB_ScrollBar_Vertical) 
ScrollBarGadget(#sbg_Gruen, 75, 10, 25, 560, 0, 264, 10, #PB_ScrollBar_Vertical) 
ScrollBarGadget(#sbg_Blau, 125, 10, 25, 560, 0, 264, 10, #PB_ScrollBar_Vertical) 
StringGadget(#str_Rot, 15, 575, 45, 20, "0") 
StringGadget(#str_Gruen, 65, 575, 45, 20, "0") 
StringGadget(#str_Blau, 115, 575, 45, 20, "0") 

;Damit Images und Brushes korrekt initialisiert werden, #WM_CREATE funktioniert unter PB ja leider nicht automatisch 
SendMessage_(hwnd, #WM_CREATE, 0, 0) 

Repeat 
   Nachr = WaitWindowEvent() 
Until Nachr = #PB_Event_CloseWindow