Text auf ProgressBarGadget

Anfängerfragen zum Programmieren mit PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Text auf ProgressBarGadget

Beitrag 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
1. Win10
PB6.1
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
Zuletzt geändert von PMV am 26.02.2009 20:44, insgesamt 2-mal geändert.
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag 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.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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?
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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.
1. Win10
PB6.1
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag 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.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

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.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Hast du 'nen Virus auf deiner Platte oder was soll der Link ?
Antworten