Seite 1 von 1

Flackerfrei Darstellung

Verfasst: 02.08.2013 20:15
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

Re: Flackerfrei Darstellung

Verfasst: 02.08.2013 20:22
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.

Re: Flackerfrei Darstellung

Verfasst: 02.08.2013 21:25
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?

Re: Flackerfrei Darstellung

Verfasst: 02.08.2013 21:55
von NicTheQuick
Zeichne einfach mit Box() vorher alles weiß oder welche Farbe auch immer.

Re: Flackerfrei Darstellung

Verfasst: 02.08.2013 23:45
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)

Re: Flackerfrei Darstellung

Verfasst: 03.08.2013 09:51
von DTM
Danke

das hilft schon mal weiter