Seite 1 von 2

ProgressBarGadget einfärben

Verfasst: 15.09.2011 12:40
von RSBasic
Hi,


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:
Bild

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
EndIf
Ich weiß, es ist noch verbesserungswürdig und deshalb stelle ich den Code ja auch erstmal hier im Allgemein-Forum. Ihr könnt gerne den Code verbessern und optimieren. Das wäre sehr hilfreich, so dass der Code fehlerfrei im "Code, Tipps und Tricks"-Forum gepostet werden kann.

Danke im Voraus für eure Mithilfe. ;)

Re: ProgressBarGadget einfärben

Verfasst: 15.09.2011 14:35
von STARGÅTE
Das das "mein" Umfärben sein soll glaub ich nicht :lol: .

Unter Win-XP mit dem alten Skin funktioniert das nämlich überhaupt nicht.
Denn wie ich erkenne, setzt du voraus, dass Grün die "vorherschende" Farbe ist, was unter XP-Alt aber nicht der fall ist, dort ist die Zeile blau.

Bei mir sind die Farben alle sehr komisch ^^

Re: ProgressBarGadget einfärben

Verfasst: 15.09.2011 14:56
von RSBasic
@STARGÅTE
Du hast jedenfalls irgendwo im Forum einen Beispielcode gepostet und ich gehe einfach davon aus, dass es von dir stammt. Ich bin ja auch kein Hellseher.^^

Standardmäßig ist auch unter Windows XP Blue-Skin aktiviert und da ist die Fortschrittsleiste grün. Wenn du einen anderen Skin verwendest, ist die Ausgabe der Farbe natürlich anders. Aber um dieses Problem beheben zu können, muss ich das Umfärben doch anders machen. Weißt du, wie man das am besten umsetzen kann bzw. hast du ein Code für mich?

Re: ProgressBarGadget einfärben

Verfasst: 15.09.2011 15:11
von Sirius-2337
Hast du einen bestimmten Grund, aus dem du das Gadget einfärben musst?
Denn wenn du sowieso alles selber zeichnest könntest du es ja auch mit dem Canvas Gadget probieren.

Re: ProgressBarGadget einfärben

Verfasst: 15.09.2011 15:13
von Bisonte
Mal so ganz blöd gefragt :
Wenn Du sowieso schon mit einem Image arbeitest... wieso dann nicht ein komplett neues/eigenes ProgressBarGadget ?

Edit : Aarg ein paar sekunden zu spät ;)

Re: ProgressBarGadget einfärben

Verfasst: 15.09.2011 15:14
von STARGÅTE
Das problem ist aber, dass nicht alle einen neutralen ProgressBar-Hintergrund haben.
In deinem fall ist es weiß, bei mir ist es dieses zarte Braun: $C8D0D4

Wenn man also darauf, eine Einfärbung anwendet, wird auch das Braun zu einer andere Farbe
und dann sieht auch wieder komisch aus.

Bild
Hier siehst du das bei mir aus dem Hintergrund "rosa" wird.

Mit der Methode "Foto" wird das also nicht funktionieren.
Obwohl es natürlich bei deinen Screens schön aussieht.

@Vorposter:
Es ging ja darum, die Skin des System zu verwenden.
Wenn man eine eigene ProgressBar macht, dann ist sie ja anders als im normalen Skin.

Re: ProgressBarGadget einfärben

Verfasst: 15.09.2011 15:14
von RSBasic
@Sirius-2337 & @Bisonte
Natürlich kann man komplett selber zeichnen, aber ich möchte das Design des Controls beibehalten. Deshalb möchte ich, dass es genauso aussieht, nur in einer anderen Farbe.

\\Edit:
@STARGÅTE
Danke für das Posten deines Screenshots.
Hm, dann geht es damit wohl nicht, schade.

Re: ProgressBarGadget einfärben

Verfasst: 15.09.2011 15:19
von Bisonte
Event. hilft dir http://purebasic.fr/german/viewtopic.ph ... sBarGadget

(habs mir nicht genauer angesehen...)

Re: ProgressBarGadget einfärben

Verfasst: 15.09.2011 15:25
von RSBasic
@Bisonte
Danke für den Link. Irgendwie habe ich diesen Code übersehen, scheint dort besser zu funktionieren. Danke. Also hat sich mit meinem Code auf jeden Fall erledigt, naja ein Versuch wars wert. <)

Re: ProgressBarGadget einfärben

Verfasst: 15.09.2011 15:52
von Bisonte
Also hier http://purebasic.fr/german/viewtopic.ph ... 69#p148369 wurde das ganze mal ausgewertet,
allerdings funktioniert diese Methode nur wenn man den Windowsskin ausschaltet (per UxTheme.dll oder per Compileroption) was allerdings wohl nicht ganz deinen Vorstellungen entspricht.