Text auf ProgressBarGadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Hey, mir is grad mal eingefallen dass ich ja jetzt Vista hab ... wenn man
SetGadgetState() in die If-Anweisung anstelle der Select-Case packt,
funktioniert es auch unter Vista ... kann das mal wer unter XP testen?
Hab grad keine lust neu zu booten. <)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Ägypten...?

> Hab grad keine lust neu zu booten.

hab grad keine lust zu raten was du meinst...
poste den kot so wie du meinst, dann schmeiß ich ihn mal in meine IDE...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Da existiert doch nur ein SetGadgetState() und eine If-Anweisung, naja egal ... da:

Code: Alles auswählen

; 05 Okt 2005  20:09  © by Fred; bugfixes by Mischa; changed by PMV - english PB-Forum 
;http://forums.purebasic.com/english/viewtopic.php?t=12829&start=0 
Procedure CWLDrawTransparentImage(DC, Bitmap, x, y, Width, Height) ;transparent spritecolor is rgb(255,255,255) 
  ;How to use: 
  ;DC = StartDrawing(WindowOutput(0)) 
  ;  DrawTransparentimage(DC,UseImage(Image),X,Y,32,32) 
  ;  ReleaseDC_(WindowID(0),DC) 
  ;StopDrawing() 


    ; First, create some DC's. These are our gateways To associated 
    ; bitmaps in RAM 
    maskDC = CreateCompatibleDC_(DC) 
    tempDC = CreateCompatibleDC_(DC) 

    SourceDC = CreateCompatibleDC_(DC) 
    DeleteObject_(SelectObject_(SourceDC, Bitmap)) 
    
    ; Then, we need the bitmap. Note that we create a monochrome 
    ; bitmap here! 
    ; This is a trick we use For creating a mask fast enough. 
    
    hMaskBmp = CreateBitmap_(Width, Height, 1, 1, 0) 
    hTempBmp = CreateCompatibleBitmap_(DC, Width, Height) 

    ; Then we can assign the bitmaps to the DCs 
    DeleteObject_(SelectObject_(maskDC, hMaskBmp)) 
    DeleteObject_(SelectObject_(tempDC, hTempBmp)) 

    ; Now  we copy the image into the monochrome bitmap. 
    BitBlt_ (maskDC, 0, 0, Width, Height, SourceDC, 0, 0, #SRCCOPY) 

    ; The first we do with the mask is To MergePaint it into the 
    ; destination. 
    ; This will punch a WHITE hole in the background exactly were 
    ; we want the graphics To be painted in. 
    ;BitBlt_ (DC, X, Y, Width, Height, maskDC, 0, 0, #MERGEPAINT) 
    BitBlt_ (tempDC, 0, 0, Width, Height, maskDC, 0, 0, #SRCCOPY) 
    BitBlt_ (DC, X, Y, Width, Height, tempDC, 0, 0, #MERGEPAINT) 

    ; Both target And source are clean. All we have To do is To And 
    ; them together! 
    BitBlt_ (DC, X, Y, Width, Height, SourceDC, 0, 0, #SRCAND) 

    ; Now all we have To do is To clean up after us And free system 
    ; resources.. 
    DeleteObject_(hMaskBmp) 
    DeleteObject_(hTempBmp) 
    DeleteDC_(maskDC) 
    DeleteDC_(SourceDC) 
    DeleteDC_(tempDC) 
EndProcedure 
; ------------------------------------------------------- 

OpenWindow(0, 0,0, 300, 30, "ProgressBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
CreateGadgetList(WindowID(0)) 
hGadget = ProgressBarGadget(0, 0, 0, 300, 30, 0, 1000) 
DC = GetDC_(hGadget) 
hImage = CreateImage(0, 50, 20) 

Timer = ElapsedMilliseconds() 
Rect.Rect 
Rect\left = 125 
Rect\top = 7
Rect\right = 175 
Rect\bottom = 25 
Repeat 
  If Timer + 100 <= ElapsedMilliseconds() 
    Progress + 1 
    SetGadgetState(0, Progress) 
    InvalidateRect_(hGadget, @Rect, #True) 
    Timer = ElapsedMilliseconds() 
  EndIf 
  Select WaitWindowEvent(10) 
    Case #WM_PAINT 
      DC = GetDC_(hGadget) 
      StartDrawing(ImageOutput(0)) 
        Box(0, 0, ImageWidth(0), ImageHeight(0), $ffffff) 
        DrawText(0, 0, StrF(Progress / 10, 1) + "%", 0, $ffffff) 
      StopDrawing() 
      CWLDrawTransparentImage(DC, hImage, 125, 5, ImageWidth(0), ImageHeight(0)) 
      ReleaseDC_(hGadget,DC) 
    Case #PB_Event_CloseWindow 
      Break 
  EndSelect 
ForEver
MFG PMV
Zuletzt geändert von PMV am 26.02.2009 20:36, insgesamt 1-mal geändert.
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

öhm.. was funktioniert?

also, hier funktioniert es grundsätzlich, aber das neuzeichnen des progressbars läßt die zahl flackern.
wenn ich auf smooth stelle, wird ständig neugezeichnet, und die zahl flackert ständig.

... grundsätzlich würde ich, wenn eh schon image, den ganzen krempel per image lösen,
also balken UND text selber drawen aufs selbe image.
sieht sowieso kagge aus, wenn schwarzer text auf hellem hintergrund UND blauem balken ist.
besser gabs das mit negativ-text, also blau auf hell und hell auf blau schon bei Win3.11...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Mach doch. Ich hab jetzt XP doch gebootet und dementsprechend
SetGadgetState() über InvalidateRect_() geschoben. Nun Flimmert es
weder in XP, noch in Vista und sollte auch unter Win98 funktionieren.

Was willst du aber mit dem blauen Balken? Willst du mir erzählen, du
hättest den XP-Skin defaultmäßig deaktiviert? :? ... naja egal. Unter XP
wie Vista sieht der schwarze Text auf weiß/ grün eigentlich garnicht so
schlecht aus. Lediglich der Font müsste noch angepasst werden. Aber für
Grafikspielchen war das nicht gedacht sondern lediglich zum Zeigen der
Funktionalität in der Praxis. Und es funktioniert jetzt 100%. Wenn du da
noch extra Rumspielen möchtest darfst den Code gern dafür
verwenden. :wink: Das negativ erstellen dürfte eigentlich auch nicht so
schwer sein, da BitBlt_() den entsprechenden Modus haben dürfte.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Was willst du aber mit dem blauen Balken?

na, der Balken ist blau.

> Willst du mir erzählen, du hättest den XP-Skin defaultmäßig deaktiviert?

die compileroption? latürnich nich.

... aber ich hab den Classic Skin an, nicht diesen unsäglichen XP-Pop-Look.

und genau hier sieht man auch das Kernproblem dieser Methode:
was soll denn nun einer machen, der nen Skin benutzt wo der Gadget-Background defaultmäßig schwarz ist?
der sieht gar keine Zahl, bis der Balken weit genug ist.

und was das flackern angeht, stell doch mal den scrollbar auf smooth,
dann wird er bei jedem pixel breiter refresht, und dann flackert auch die schrift.
sollte das zufällig beim XP-Pop-Skin nicht auftreten, ist es aber eben Zufall, nicht die Regel.
insofern unbrauchbar.
das sieht man beim Zeigen der Funktionalität in der Praxis.

... wenn schon so Scherze, dann gleich richtig selbstgemacht. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Jetzt müsst ich ja mit dir eigentlich sauer werden. Ich hab jetzt XP noch
mal gebootet und diesen unsagbar hässlichen klassikstil eingeschaltet. Man
tun mir die Augen weh :mrgreen: ... und hab getan was du wolltest. Da
flackert nichts. Überhaupt rein garnichts. Wie wärs mal, wenn du den
aktuellsten Code nutzen würdest? :wink:

Und wenn es dennoch bei dir flackert ... hm, ich könnt dich jetzt auch zum
PC-Händler deiner Wahl schicken zum beschweren :lol: *am boden lieg*
... naja, dann kann ich da auch nichts für. Zum Thema Skin kann ich nur
wiederholen, was ich oben schon schrieb ... das war lediglich für die
Funktionalität und nicht für Grafikspielerreien. Wenn ich das 100%
Wasserdicht machen wollen würd hät ich vermutlich mittels API mir ein
komplet eigenes Gadget registriert und würde mit Callbacks arbeiten.

Ach ja, finger weg vom komplet selber malen. Es mag zwar dann bei jedem
lesbar sein ... ich verteufel aber jedes Programm, das mir meinen Vista-
Progressbar ersetzt. ... irgend wie hab ich mich darinn verliebt :? *lol* ...
Naja, aber welches Progressbar ist sonnst so smooth animiert und zeigt
dir sogar noch an, dass das Programm tatsächlich noch aktiv ist?
Das Thema hatten wir doch auch schon mal, wenn auch in abgewandelter
Form für komplete Fenster. Ein selber gemaltes Gadget wird irgend wo
immer total unpassend sein. Die Lösung für das ganze ist wohl tatsächlich
die Grafikspielerrei, Dunkel auf Hell, Hell auf Dunkel. Obs jetzt das Negativ
ist oder zwei Kontrastfarben spielt wohl keine Rolle.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Wie wärs mal, wenn du den aktuellsten Code nutzen würdest?

du meinst doch wohl diesen?
http://www.purebasic.fr/german/viewtopi ... 952#233952

den hab ich auch genommen.

... witziger Weise flackert grad nix mehr, hab aber NIX geändert! dz dz /:->

nuja wieauchimmer...

am besten wäre vielleicht, direkt auf den progressbar selber zu drawen,
da kann man die Farben korrekt einstellen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Kaeru Gaman hat geschrieben:> Wie wärs mal, wenn du den aktuellsten Code nutzen würdest?

du meinst doch wohl diesen?
http://www.purebasic.fr/german/viewtopi ... 952#233952

den hab ich auch genommen.
Anscheinend nicht, wobei ich auch kurz darauf den Post auf der ersten
Seite aktualisiert hab. :wink:
... witziger Weise flackert grad nix mehr, hab aber NIX geändert! dz dz /:->
Ich aber ... wie man am Postedit sehen kann. Und das hat ich auch in
meinem anschließenden neuen Post auch geschrieben :D
am besten wäre vielleicht, direkt auf den progressbar selber zu drawen,
da kann man die Farben korrekt einstellen.
Genau das macht mein Code. Nur das die Farbe nicht ermittelt wird. :wink:
Und genau das sollst du doch die ganze Zeit machen 8)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

>> hab aber NIX geändert!
> Ich aber ...
auf meiner Platte? wie hast du das denn angestellt? ;)

ich hatte den code gespeichert, die version die geflackert hatte, und zu dem zeitpunkt, wo ich das letzte post schrieb, nochmal gestartet. nix flackern.

>> direkt auf den progressbar selber zu drawen
> Genau das macht mein Code.
nope

Code: Alles auswählen

StartDrawing(ImageOutput(0)) 
du drawst auf ein Image, und blittest dieses über den bar... ;)

aber egal jetzt... hab jetzt keinen bock mehr.

dass ein code flackert und ohne änderung dann nicht mehr wenn du drauf ansprichst ist genau das, was an so einem beschissenen tag wie heute ins programm passt.
ich werd jetzt in der Bude hocken, TV glotzen, Eine nach der Anderen rauchen und sonderbare Dampfblasen absondern...

Olé...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten