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