Scrollbars mit Verlauf im Hintergrund
Verfasst: 07.03.2007 19:08
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