ProgressBarGadget einfärben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

ProgressBarGadget einfärben

Beitrag 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. ;)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ProgressBarGadget einfärben

Beitrag 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 ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ProgressBarGadget einfärben

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Sirius-2337
Beiträge: 71
Registriert: 29.05.2010 20:55

Re: ProgressBarGadget einfärben

Beitrag 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.
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: ProgressBarGadget einfärben

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ProgressBarGadget einfärben

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ProgressBarGadget einfärben

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: ProgressBarGadget einfärben

Beitrag von Bisonte »

Event. hilft dir http://purebasic.fr/german/viewtopic.ph ... sBarGadget

(habs mir nicht genauer angesehen...)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ProgressBarGadget einfärben

Beitrag 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. <)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: ProgressBarGadget einfärben

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten