Text auf ProgressBarGadget
-
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
Text auf ProgressBarGadget
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
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
1. Win10
PB6.1
PB6.1
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
... Bei Windows ist
die transparente Farbe $ffffff.
Edit: nach dysti korigiert
Edit2: SetGadgetState() in die If-Abfrage vor InvalidateRect_()
geschoben, jetzt läufts auf XP und Vista ohne flimmern.
MFG PMV
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

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
Edit2: SetGadgetState() in die If-Abfrage vor InvalidateRect_()
geschoben, jetzt läufts auf XP und Vista ohne flimmern.
MFG PMV
Zuletzt geändert von PMV am 26.02.2009 20:44, insgesamt 2-mal geändert.
Hast Du eigentlich vorher einmal die Suche benutzt?Toshy hat geschrieben: Hallo.
Ist es möglich auf einem ProgressBarGadget Text zu schreiben, natürlich mit transparentem Hintergrund?

@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
Man muß nur die Befehle in dieser Reihenfolge setzen:
dann wird er nicht überschrieben.
Code: Alles auswählen
SetGadgetState(0, Progress)
StartDrawing(ImageOutput(0))
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Ich schrieb doch, mal schnell zusammengeschustert
... 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
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
Wobei dann sähe das Teil natürlich wenigstens überall gleich aus^^
Aber war net die Frage
MFG PMV

... 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

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

Wobei dann sähe das Teil natürlich wenigstens überall gleich aus^^
Aber war net die Frage

MFG PMV
-
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
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.
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.
1. Win10
PB6.1
PB6.1
Du weißt das in den USA Fortschrittsbalken mit Prozentanzeige Patentiert sind ....
Zuletzt geändert von Konne am 09.03.2007 16:29, insgesamt 1-mal geändert.