Flackerndes Text-Gadget

Anfängerfragen zum Programmieren mit PureBasic.
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Flackerndes Text-Gadget

Beitrag 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  
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Flackerndes Text-Gadget

Beitrag von Danilo »

Es flackert nicht.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Flackerndes Text-Gadget

Beitrag 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  
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Re: Flackerndes Text-Gadget

Beitrag 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
   );
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Flackerndes Text-Gadget

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Flackerndes Text-Gadget

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: Flackerndes Text-Gadget

Beitrag 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  
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Flackerndes Text-Gadget

Beitrag 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
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Re: Flackerndes Text-Gadget

Beitrag von Andi »

SmartWindowRefresh() wäre eine elegante Lösung gewesen. Bringt aber keine Verbesserung bei mir - schade.
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: Flackerndes Text-Gadget

Beitrag 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
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Antworten