Flackerfrei Darstellung

Für allgemeine Fragen zur Programmierung mit PureBasic.
DTM
Beiträge: 5
Registriert: 20.12.2009 23:11

Flackerfrei Darstellung

Beitrag von DTM »

Hallo Leute

ich möchte gerne mit PureBasic eine Bildschrimgroße Digitaluhr programmieren, die im Sekundentakt die Uhrzeit anzeigt
das ganze soll nicht flackern, wenn eine neue Zeit dargestellt wird

derzeit habe ich versucht, es mit einem TextGadget zu lösen. Doch bei jeder neuen Zeit wird der "Text" kurz ausgeblendet
Auf deutsch: es flacker wie s..

wie kann man das besser lösen?

Ach ja

und wie kann ich (ähnlich VB6) einen Timer programmieren, oder dafür sorgen, dass eine Prozedur im 1/10 Sekundetakt aufgerufen wird
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Flackerfrei Darstellung

Beitrag von NicTheQuick »

Da ich nicht annehme, dass du das ganze mit DirectX machen willst, würde ich dir das CanvasGadget empfehlen. Das hat Doublebuffering sozusagen schon integriert, d.h. wenn du mittels StartDrawing()-StopDrawing() etwas darauf malst, wird das Neugemalte mit dem Aufruf von StopDrawing() oder bei der entsprechenden internen Event-Verarbeitung ohne Flackern übernommen und angezeigt.

Bezüglich Timern kannst du z.B. 'AddWindowTimer()' nutzen, oder auf Threads umsteigen, aber ersteres ist wohl eher dafür geeignet und ein besserer Einstieg in das ganze.
DTM
Beiträge: 5
Registriert: 20.12.2009 23:11

Re: Flackerfrei Darstellung

Beitrag von DTM »

Danke für den Tipp

wie gesagt ich komme aus VB6

wenn ich das richtig sehe, wird mit start und Stopdrawing gezeichnet
wenn ich da einen Text immer auf das gleiche Image ausgebe, wird ja der alte nicht gelöscht

kannst Du mir ein kleines Beispiel geben, wie das geht?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Flackerfrei Darstellung

Beitrag von NicTheQuick »

Zeichne einfach mit Box() vorher alles weiß oder welche Farbe auch immer.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Flackerfrei Darstellung

Beitrag von hjbremer »

so was zum Beispiel ?

Code: Alles auswählen

EnableExplicit

Enumeration 1
   #Window
   #timer1
   #button1
EndEnumeration

#fontnr = 1
#windowcolor  = $F0F0F0

;LoadFont(#fontnr, "Courier", 28, #PB_Font_Bold)
LoadFont(#fontnr, "Arial", 28, #PB_Font_Bold)

Procedure.i UhrGadget_Draw(pbnr)
   
   Protected time$, timebr, timehh
  
   Protected x, y, rb = 2
   Protected width = GadgetWidth(pbnr)
   Protected height = GadgetHeight(pbnr)
  
   StartDrawing(CanvasOutput(pbnr))
   
   ;Gadget ausmalen mit Rahmen
   Box(0, 0, width, height, #windowcolor)          ;erst komplett einfärben wegen Roundbox
   RoundBox(0, 0, width, height, rb, rb, #Blue)    ;dann Roundbox als Rahmen
   
   ;Hintergrund            
   DrawingMode(#PB_2DDrawing_Gradient)      
   BackColor(#Yellow)
   FrontColor(#Magenta)      
   LinearGradient(0, 0, 0, height)
   RoundBox(1, 1, width-2, height-2, rb, rb)       ;dann Roundbox innen mit Gradient ausmalen
   
   ;Uhrzeit
   DrawingMode(#PB_2DDrawing_Transparent) 
   DrawingFont(FontID(#fontnr))
   
   time$ = FormatDate("%hh:%ii:%ss", Date())   
   timebr = TextWidth(time$)
   timehh = TextHeight(time$)
   
   x = (width - timebr) / 2
   y = (height - timehh) / 2   
   DrawText(x, y, time$, #Blue)
   
   StopDrawing()
   
EndProcedure

Procedure.i UhrGadget(pbnr, x, y, width, height)
   
   CanvasGadget(pbnr, x, y, width, height, #PB_Canvas_ClipMouse|#PB_Canvas_DrawFocus)
   
   SetGadgetAttribute(pbnr, #PB_Canvas_Cursor, #PB_Cursor_Hand)
   
   UhrGadget_Draw(pbnr)
   
EndProcedure

Define event

OpenWindow(#Window, 300, 300, 300, 360, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

SetWindowColor(#Window, #windowcolor) 
AddWindowTimer(#Window, #timer1, 1000)

UhrGadget(#button1, 20, 10, 200, 50)

Repeat
   event = WaitWindowEvent()
   
   Select event 
      Case #PB_Event_Timer 
         If EventTimer() = #timer1
            UhrGadget_Draw(#button1)
         EndIf
          
   EndSelect
   
Until event = #PB_Event_CloseWindow

RemoveWindowTimer(#Window, #timer1)
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
DTM
Beiträge: 5
Registriert: 20.12.2009 23:11

Re: Flackerfrei Darstellung

Beitrag von DTM »

Danke

das hilft schon mal weiter
Antworten