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