Seite 1 von 7

Text auf ProgressBarGadget

Verfasst: 02.03.2007 02:52
von Toshy
Hallo.
Ist es möglich auf einem ProgressBarGadget Text zu schreiben, natürlich mit transparentem Hintergrund? Wenn ja, wie macht man das?
Ein Textgadget setzt ja als Hintergrund immer eine Farbe die alles darunter übermalt.
Toshy

Verfasst: 02.03.2007 03:48
von PMV
Windows Only?

Ich hab dir mal was zusammengeschustert, die Prozedur hab ich
vor langer Zeit mal gebraucht und umgebaut (für meine CWL ^_^).
Entsprechende Infos dazu stehen ja drüber :D ... Bei Windows ist
die transparente Farbe $ffffff.

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
Edit: nach dysti korigiert
Edit2: SetGadgetState() in die If-Abfrage vor InvalidateRect_()
geschoben, jetzt läufts auf XP und Vista ohne flimmern.

MFG PMV

Verfasst: 02.03.2007 09:28
von Shardik
Toshy hat geschrieben: Hallo.
Ist es möglich auf einem ProgressBarGadget Text zu schreiben, natürlich mit transparentem Hintergrund?
Hast Du eigentlich vorher einmal die Suche benutzt? :freak:

@PMV:
Dein Beispiel-Code funktioniert nur korrekt unter Windows XP. Unter Windows NT und Windows 2000 Server wird der Prozent-Text durch den Fortschrittsbalken überschrieben...

Zwei Beispiele, die auch unter WinNT und Win2K korrekt funktionieren:
http://www.purebasic.fr/english/viewtopic.php?t=14263 von Hroudtwolf
http://www.purebasic.fr/german/viewtopi ... 8&start=16 von Dare, erweitert von Falko

Verfasst: 02.03.2007 10:21
von dysti
Man muß nur die Befehle in dieser Reihenfolge setzen:

Code: Alles auswählen

      SetGadgetState(0, Progress)
      StartDrawing(ImageOutput(0))
dann wird er nicht überschrieben.

Verfasst: 02.03.2007 11:34
von Shardik
Hallo dysti,

Danke für Deinen Hinweis, es klappt dann auch tatsächlich unter WinNT. Hast Du auch eine Erklärung dafür, daß es unter WinXP auch ohne Deine Umstellung funktioniert?

Verfasst: 02.03.2007 16:43
von PMV
Ich schrieb doch, mal schnell zusammengeschustert :mrgreen:
... Windows XP malt nicht immer das ganze Gadget neu, sondern nur den
Teil, bei welchem ein neuer Balken hinzukommt. NT wird vermutlich das
ganze Fenster übermalen. Wobei, bei XP flakerte die Anzeige auch, wenn
ein neuer Balken hinzu kommt ... jetzt nicht mehr :D
Win98 hingegen malt den kompleten Bereich, der mit Balken versehen ist,
immer wieder neu ... wodurch der Text dann ab 45% nicht mehr
dargestellt werden kann.

Dank dystis Hinweis sollte das ganze nun auf allen anderen Win-Versionen
laufen? (XP und 98 hab ich getestet)

Ach ja, ein eigenes ProgressBar schreiben kann ja jeder :mrgreen:
Wobei dann sähe das Teil natürlich wenigstens überall gleich aus^^
Aber war net die Frage 8)

MFG PMV

Verfasst: 05.03.2007 00:23
von Toshy
Hmm,
ich hatte die Hoffnung, das es da ein Gadget gibt, was man dazu nutzen kann bzw. die Progressbar das selbst kann.
Da ist es vielleicht einfacher, direkt die Api DrawText zu nehmen.
Mal schauen was dich da dann versuche. Erstmal baue ich einfach ein extra Textgadget neben die Leiste ein.

Verfasst: 05.03.2007 11:04
von dysti
die Antwort hat @PMV ja schon gegeben und dir Procedure von @PMV ist doch gut, was gibt es denn da noch auszusetzen?
Ändere sie nach deinen Bedürfnissen und gut ist.

Verfasst: 09.03.2007 16:03
von Konne
Du weißt das in den USA Fortschrittsbalken mit Prozentanzeige Patentiert sind ....

Verfasst: 09.03.2007 16:06
von edel
Hast du 'nen Virus auf deiner Platte oder was soll der Link ?