Seite 1 von 2
Flackerndes Text-Gadget
Verfasst: 05.08.2014 08:52
von Andi
Hi, mit folgendem Code produziere ich ein flackerndes Text-Gadget. Kann man das Flackern irgendwie wegkriegen??
Code: Alles auswählen
Declare TimerCallBack(hWnd.l,Msg.l,wParam.l,lParam.l)
Font12b.l = LoadFont(#PB_Any, "Arial", 12, #PB_Font_Bold)
#window = 0
#text = 0
OpenWindow(#window, 0, 0, 200, 100, "es flackert", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(#text, 30, 40, 110, 20, "")
SetGadgetFont(#text, FontID(Font12b))
SetTimer_(WindowID(#window), 77, 500, @TimerCallBack()) ;Wiederholzeit=500 ms; Identifier=77
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Procedure TimerCallBack(hWnd.l,Msg.l,wParam.l,lParam.l)
Static i
i = i + 1
Select Msg
Case #WM_TIMER
If wparam = 77
SetGadgetText(#text, Str(i) + ". Durchlauf")
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Re: Flackerndes Text-Gadget
Verfasst: 05.08.2014 10:00
von Danilo
Es flackert nicht.
Re: Flackerndes Text-Gadget
Verfasst: 05.08.2014 10:29
von STARGÅTE
LoadFont() liefert eine Integer zurück (keine Long)!
Auch die TimerProc() hat falsche Parametertypen!
Warum nuetzt du Win-API, obwohl die gleichen Funktionen für PB verfügbar sind?
Code: Alles auswählen
Declare TimerCallBack()
Font12b.i = LoadFont(#PB_Any, "Arial", 12, #PB_Font_Bold)
#window = 0
#text = 0
OpenWindow(#window, 0, 0, 200, 100, "es flackert", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(#text, 30, 40, 110, 20, "")
SetGadgetFont(#text, FontID(Font12b))
AddWindowTimer(#window, 77, 500)
BindEvent(#PB_Event_Timer, @TimerCallBack(), #window, 77)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Procedure TimerCallBack()
Static i
i = i + 1
SetGadgetText(#text, Str(i) + ". Durchlauf")
EndProcedure
Re: Flackerndes Text-Gadget
Verfasst: 05.08.2014 10:57
von Andi
Danke, Stargate, für Deine Antwort. Auch mit Deiner Nicht-WinApi-Lösung flackert es leider, leider: Jede halbe Sekunde, wenn es also einen neuen Text gibt, ist ein Aufflackern zu sehen.
Du hast auch die TimerProc erwähnt. Ich habe zwar die Parameternamen hWnd.l,Msg.l,wParam.l,lParam.l und nicht die Bezeichnungen aus der Definition (s.u.) benutzt. Aber sind die Namen nicht eigentlich egal, wenn der Datentyp richtig ist?
Code: Alles auswählen
VOID CALLBACK TimerProc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
);
Re: Flackerndes Text-Gadget
Verfasst: 05.08.2014 11:04
von matbal
Das Flackern tritt bei mir auch auf. Es scheint vom Windows-Theme abzuhängen.
Unter Windows 7 mit eingestelltem Classic Theme flackert es. Wenn ich auf ein Aero-Design umschalte, flackert es nicht mehr. Mit Basis-Design flackert es ebenfalls.
Re: Flackerndes Text-Gadget
Verfasst: 05.08.2014 11:06
von STARGÅTE
Der Name ist egal, aber deine Datentyp sind ja eben nicht gleich.
Natürlich kann man C++ nicht 1:1 übernehmen, aber zumindest das Handle muss eine Integer sein, und darf keine Long sein.
PS: bei mir flackern beide versionen nicht.
Win 7
Re: Flackerndes Text-Gadget
Verfasst: 05.08.2014 11:29
von silbersurfer
bei mir flackert auch nichts aber versuche einfach mal
SmartWindowRefresh(0,#True)
das hat bei mir auch immer gut geholfen beim Flackern
hier dein code mit
SmartWindowRefresh(0,#True)
Code: Alles auswählen
Declare TimerCallBack(hWnd.l,Msg.l,wParam.l,lParam.l)
Font12b.l = LoadFont(#PB_Any, "Arial", 12, #PB_Font_Bold)
#window = 0
#text = 0
OpenWindow(#window, 0, 0, 200, 100, "es flackert", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(#text, 30, 40, 110, 20, "")
SetGadgetFont(#text, FontID(Font12b))
SmartWindowRefresh(0,#True)
SetTimer_(WindowID(#window), 77, 500, @TimerCallBack()) ;Wiederholzeit=500 ms; Identifier=77
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Procedure TimerCallBack(hWnd.l,Msg.l,wParam.l,lParam.l)
Static i
i = i + 1
Select Msg
Case #WM_TIMER
If wparam = 77
SetGadgetText(#text, Str(i) + ". Durchlauf")
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Re: Flackerndes Text-Gadget
Verfasst: 05.08.2014 12:01
von matbal
Das Flackern hängt bei mir auch noch von der Rate ab, wie oft ich das Gadget aktuallisiere. Bei einem Timeout von 60 ms oder weniger hört das Flackern bei mir evenfalls auf. Bei den 500 ms flackert es dagegen bei jeder Textänderung.
Vielleicht hängt es ja noch irgendwie mit der Grafikkarte oder dem Grafiktreiber zusammen?
SmartWindowRefresh() hat bei mir keinen Einfluß auf das Flackern
Re: Flackerndes Text-Gadget
Verfasst: 05.08.2014 12:02
von Andi
SmartWindowRefresh() wäre eine elegante Lösung gewesen. Bringt aber keine Verbesserung bei mir - schade.
Re: Flackerndes Text-Gadget
Verfasst: 05.08.2014 13:19
von silbersurfer
ok ich habe es dann mal mit Manuellen neu Zeichnen des Fensters Probiert
SendMessage_(WindowID(0),#WM_NCPAINT,1,0)
Unter Windows 7 mit eingestelltem Classic Theme flackert es
.
Damit ist dann das Flackern bei mir nicht mehr vorhanden
hier der Code:
Code: Alles auswählen
Declare TimerCallBack(hWnd.l,Msg.l,wParam.l,lParam.l)
Font12b.l = LoadFont(#PB_Any, "Arial", 12, #PB_Font_Bold)
#window = 0
#text = 0
OpenWindow(#window, 0, 0, 200, 100, "es flackert", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(#text, 30, 40, 110, 20, "")
SetGadgetFont(#text, FontID(Font12b))
SetTimer_(WindowID(#window), 77, 500, @TimerCallBack()) ;Wiederholzeit=500 ms; Identifier=77
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Procedure TimerCallBack(hWnd.l,Msg.l,wParam.l,lParam.l)
Static i
i = i + 1
;Hier das wird das ganze Fenster Neu Gezeichnent
SendMessage_(WindowID(0),#WM_NCPAINT,1,0)
Select Msg
Case #WM_TIMER
If wparam = 77
SetGadgetText(#text, Str(i) + ". Durchlauf")
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Gruss Silbersurfer