man kann ja beim ProgressBarGadget leider keine eigene Farbe mit SetGadgetColor() bestimmen. Ohne Skin-Unterstützung geht das zwar schon, aber nicht mit. Und da ist das Problem.
Ich habe mir überlegt, wie man trotzdem mit Skin das ProgressBarGadget umfärben kann. Man könnte doch das Gadget "fotografieren" (z.B. mit PrintWindow_()) und als Image abspeichern. Das abgespeicherte Bild kann man doch dann einfach umfärben und in einem ImageGadget reinsetzen. Das erste Problem ist ja, dass das ProgressBarGadget immer sichtbar sein muss, sonst erhält man kein Screenshot von PrintWindow_(). Also muss man versuchen, das ImageGadget auf dem ProgressBarGadget drüberzulegen. Das zweite Problem ist aber, dass es dann flackert, weil jedes Gadget ja automatisch neu gezeichnet wird. Das Flackern habe ich zwar ein wenig mit InvalidateRect_() reduziert, aber das finde ich noch nicht optimal.
Ich habe versucht, sowas umzusetzen. Das Ergebnis sieht zwar schon ganz gut aus, aber ich möchte gerne das Flackern komplett reduzieren und/oder dafür sorgen, dass man auch ein verstecktes Gadget fotografieren kann.
Fürs Umfärben habe ich einen Code von STARGÅTE (danke dafür) verwendet.
Hier erstmal einen Screenshot:

Und hier mein Code, den ich versucht habe, zu schreiben:
Code: Alles auswählen
EnableExplicit
Define EventID
Global PrintWindow_
OpenLibrary(0, "user32.dll")
Prototype PrintWindow(hwnd, hdc, flags)
PrintWindow_.PrintWindow = GetFunction(0, "PrintWindow")
Procedure ColorRotation(x, y, Color, Color2)
;ProcedureReturn RGBA(Green(Color), Blue(Color), Red(Color), Alpha(Color));Rot
ProcedureReturn RGBA(Red(Color), Blue(Color), Green(Color), Alpha(Color));Blau
;ProcedureReturn RGBA(Blue(Color), Green(Color), Green(Color), Alpha(Color));Türkis
;ProcedureReturn RGBA(Blue(Color), Blue(Color), Blue(Color), Alpha(Color));Schwarz
;ProcedureReturn RGBA(Green(Color), Green(Color), Red(Color), Alpha(Color));Gelb
EndProcedure
Procedure CaptureGadget(Gadgetnummer)
Protected listrect.RECT
Protected width
Protected height
Protected hdc
GetWindowRect_(GadgetID(Gadgetnummer), @listrect.RECT)
width = listrect\right-listrect\left
height = listrect\bottom-listrect\top
CreateImage(0, width, height, 24)
hdc = StartDrawing(ImageOutput(0))
PrintWindow_(GadgetID(Gadgetnummer), hdc, #Null)
StopDrawing()
CreateImage(1, width, height, 24)
StartDrawing(ImageOutput(1))
DrawingMode(#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@ColorRotation())
DrawImage(ImageID(0), 0, 0)
StopDrawing()
EndProcedure
Procedure Thread(z);Beispiel
Protected a
For a=1 To 100
SetGadgetState(1,a)
InvalidateRect_(GadgetID(2),0,#True)
CaptureGadget(1)
SetGadgetState(2,ImageID(1))
Delay(100)
Next
EndProcedure
If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ProgressBarGadget(1,10,10,WindowWidth(0)-20,20,0,100,0)
ImageGadget(2,10,10,0,0,0,0)
CreateThread(@Thread(),0)
Repeat
EventID=WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
End
EndIf
ForEver
EndIfDanke im Voraus für eure Mithilfe.


