ResizeGadget flackert mit Klassiktheme unter Win7 mehr als..

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

ResizeGadget flackert mit Klassiktheme unter Win7 mehr als..

Beitrag von Kurzer »

Als Verfechter des klassischen Designs unter Win 7 ist mir erst heute zufällig aufgefallen, dass ResizeGadget() unter Verwendung des klassischen Designs unter Win7 mehr flackert als unter dem Aero Design.

Da stellt sich mir die Frage: Warum ist das so?
Ich dachte bisher, dass alles was nicht "klassisches Design" ist irgendwie auf das "native" Fensterdesign "aufgepropft" ist und entsprechend mehr Ressourcen und Leistung verbraucht.

Offenbar kommt die Windows 7 Grafikengine aber besser mit dem Aero zurecht, denn die Gadgets des folgenden Code-Schnippsels flackern unter dem Win 7 klassischen Design wie Sau... unter Aero dagegen fast gar nicht. Ändert mal die Größe des Fensters recht schnell. Unter dem klassischen Design kommen die Gadgets und die Textfelder kaum hinterher.

Sollte ich mit meiner Vermutung "klassisch = ressourcenschonend" falsch liegen?

Code: Alles auswählen

Enumeration 
	#Gad_Editor	
	#Gad_Filelist
	#Gad_FileSize
	#Gad_TextSize
	#Gad_Button_ClearFilelist
	#Gad_Button_Convert
	#Gad_Button_CopyTo
EndEnumeration

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 350, 180, "Flickertest", #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
	; Fenster
	WindowBounds(0, 260, 180, #PB_Ignore, #PB_Ignore)
	StickyWindow(0, 1)
	SmartWindowRefresh(0, 1)
	
	; Statusbar
	If CreateStatusBar(0, WindowID(0))
		AddStatusBarField(7)
		StatusBarText(0, 0, "", #PB_StatusBar_BorderLess)
		AddStatusBarField(#PB_Ignore)
		StatusBarText(0, 1, "djfslhrhfuirshnuihgsuigsgeg", #PB_StatusBar_BorderLess)
	EndIf
	
	; Gadgets
	EditorGadget(#Gad_Editor, 10, 10, #PB_Ignore, #PB_Ignore, #PB_Editor_ReadOnly)
	SetGadgetColor(#Gad_Editor, #PB_Gadget_BackColor, $B3B3B3)
	EnableGadgetDrop(#Gad_Editor, #PB_Drop_Files, #PB_Drag_Copy)
	
	ButtonGadget(#Gad_Button_ClearFilelist, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, "1", #PB_Button_MultiLine)
	ButtonGadget(#Gad_Button_Convert, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, "2", #PB_Button_MultiLine)
	ButtonGadget(#Gad_Button_CopyTo, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, "3", #PB_Button_MultiLine)
	
	TextGadget(#Gad_FileSize, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, "lalalalalala")
	TextGadget(#Gad_TextSize, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, "lalalalalala")
	
	; Eventloop
	Repeat
		iEvent = WaitWindowEvent()
		iEventGadget = EventGadget()
		iEventType = EventType() 
		
		Select iEvent
			Case #PB_Event_SizeWindow
				ResizeGadget(#Gad_Editor, 10, 10, WindowWidth(0) - 110, WindowHeight(0) - 30)
				ResizeGadget(#Gad_Button_ClearFilelist, WindowWidth(0) - 90, 10, 80, 20)
				ResizeGadget(#Gad_Button_Convert, WindowWidth(0) - 90, 40, 80, 30)
				ResizeGadget(#Gad_Button_CopyTo, WindowWidth(0) - 90, 75, 80, 30)
				ResizeGadget(#Gad_FileSize, WindowWidth(0) - 90, 110, 80, 15)
				ResizeGadget(#Gad_TextSize, WindowWidth(0) - 90, 125, 80, 15)
			Case #PB_Event_CloseWindow
				iQuit = 1
		EndSelect
	Until iQuit = 1
EndIf
End 
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ResizeGadget flackert mit Klassiktheme unter Win7 mehr a

Beitrag von NicTheQuick »

Nur als Hinweis: '#PB_Ignore' ist nicht dafür gedacht bei x, y, width oder height für Gadgets einzusetzen. Der Wert von '#PB_Ignore' ist -65535 und unter Linux bekommt man dann eine schöne "[WARNING] Gtk (CRITICAL): IA_gtk_widget_set_size_request: assertion `width >= -1' failed." und dann funktioniert nichts mehr in dem Fenster.
Es ist also besser einfach alle x- und y-Werte auf 0 zu setzen und width und height auf 1. Sind width und height auch auf 0, schmiert es hier unter Linux bei der Erstellung der Button-Gadgets ab.

Im Übrigen wird hier #PB_Event_SizeWindow wirklich erst aufgerufen, wenn man das Fenster in der Größe ändert. Unter Windows wird es glaube ich mindestens ein mal schon aufgerufen bevor man irgendwas manuell an der Größe ändert. Deswegen wäre es geschickter den Code so zu machen:

Code: Alles auswählen

Enumeration
	#Gad_Editor   
	#Gad_Filelist
	#Gad_FileSize
	#Gad_TextSize
	#Gad_Button_ClearFilelist
	#Gad_Button_Convert
	#Gad_Button_CopyTo
EndEnumeration

Procedure ResizeGadgets()
	ResizeGadget(#Gad_Editor, 10, 10, WindowWidth(0) - 110, WindowHeight(0) - 30)
	ResizeGadget(#Gad_Button_ClearFilelist, WindowWidth(0) - 90, 10, 80, 20)
	ResizeGadget(#Gad_Button_Convert, WindowWidth(0) - 90, 40, 80, 30)
	ResizeGadget(#Gad_Button_CopyTo, WindowWidth(0) - 90, 75, 80, 30)
	ResizeGadget(#Gad_FileSize, WindowWidth(0) - 90, 110, 80, 15)
	ResizeGadget(#Gad_TextSize, WindowWidth(0) - 90, 125, 80, 15)
EndProcedure

If OpenWindow(0, 0, 0, 350, 180, "Flickertest", #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
	; Fenster
	WindowBounds(0, 260, 180, #PB_Ignore, #PB_Ignore)
	StickyWindow(0, 1)
	SmartWindowRefresh(0, 1)
	
	; Statusbar
	If CreateStatusBar(0, WindowID(0))
		AddStatusBarField(7)
		StatusBarText(0, 0, "", #PB_StatusBar_BorderLess)
		AddStatusBarField(#PB_Ignore)
		StatusBarText(0, 1, "djfslhrhfuirshnuihgsuigsgeg", #PB_StatusBar_BorderLess)
	EndIf
	
	; Gadgets
	EditorGadget(#Gad_Editor, 10, 10, 0, 0, #PB_Editor_ReadOnly)
	SetGadgetColor(#Gad_Editor, #PB_Gadget_BackColor, $B3B3B3)
	EnableGadgetDrop(#Gad_Editor, #PB_Drop_Files, #PB_Drag_Copy)
	
	ButtonGadget(#Gad_Button_ClearFilelist, 0, 0, 1, 1, "1", #PB_Button_MultiLine)
	ButtonGadget(#Gad_Button_Convert, 0, 0, 1, 1, "2", #PB_Button_MultiLine)
	ButtonGadget(#Gad_Button_CopyTo, 0, 0, 1, 1, "3", #PB_Button_MultiLine)
	
	TextGadget(#Gad_FileSize, 0, 0, 0, 0, "lalalalalala")
	TextGadget(#Gad_TextSize, 0, 0, 0, 0, "lalalalalala")
	
	ResizeGadgets()
	
	; Eventloop
	Repeat
		iEvent = WaitWindowEvent()
		iEventGadget = EventGadget()
		iEventType = EventType()
		
		Select iEvent
			Case #PB_Event_SizeWindow
				ResizeGadgets()
			Case #PB_Event_CloseWindow
				iQuit = 1
		EndSelect
	Until iQuit = 1
EndIf
End 
Und der Vollständigkeit halber: Hier bei mir flackert nichts. :wink:
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: ResizeGadget flackert mit Klassiktheme unter Win7 mehr a

Beitrag von Kurzer »

Hallo NicTheQuick,

besten Dank für die wertvollen Hinweise und das Testen. :allright:
Ich habe meinen Code entsprechend angepaßt.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Antworten