Flackern von Gadgets verhindern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Flackern von Gadgets verhindern

Beitrag von ts-soft »

Delle hat geschrieben:Beispielcode? Ähm... einfach untereinander paar ImageGadgets in ein ScrollAreaGadget zeichnen lassen (und wenn möglich immer auch gleich ans Ende mitspringen beim Zeichnen).
Okay, sobald ich Zeit habe, werde ich den Code dann für Dich schreiben, damit ich testen kann :freak:
Delle hat geschrieben: Das hier hat auch nicht funktioniert:

Code: Alles auswählen

SendMessage_(GadgetID(#ScrollAreaGadget),#WM_SETREDRAW,0,0)

(drawing/resizing)

SendMessage_(GadgetID(#ScrollAreaGadget),#WM_SETREDRAW,1,0)
Kein Wunder, was soll die API mit der ID des Gadgets anfangen? Die Windows-API kennt PB nicht :mrgreen:

Code: Alles auswählen

SendMessage_(GadgetID(#ScrollAreaGadget), #WM_SETREDRAW, 0, 0)

(drawing/resizing)

SendMessage_(GadgetID(#ScrollAreaGadget), #WM_SETREDRAW, 1, 0) 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Flackern von Gadgets verhindern

Beitrag von Delle »

ts-soft hat geschrieben:Okay, sobald ich Zeit habe, werde ich den Code dann für Dich schreiben, damit ich testen kann :freak:
Sehr schön! :) Nein den jetzigen Code zu zerpflücken würde keinen Sinn machen... daher nochmal das grobe alte Beispiel von Kiffi:

Allerdings eben mit verschiedenen Bildern und natürlich etwas größer...

Code: Alles auswählen

EnableExplicit

Define newX, newY, newW, newH
Define SampleImage, Counter, WWE
Define SelectedRowIndex

Structure sRow
  ImageGadget.i
  TextGadget1.i
  TextGadget2.i
EndStructure

Global NewList Row.sRow()

#Window = 0
#ScrollAreaGadget = 0

OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 200, 600, "")

ScrollAreaGadget(#ScrollAreaGadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window), WindowWidth(#Window) - 32, WindowHeight(#Window))

newH = 20

SampleImage = LoadImage(#PB_Any, "C:\Programme\PureBasic\Examples\Sources\Data\Drive.bmp")

For Counter = 0 To 50
 
  AddElement(Row())
 
  Row()\ImageGadget = ImageGadget(#PB_Any,   0, newY,  30, newH, ImageID(SampleImage), #PB_Image_Border)
  
  newY + newH + 1
  
  SetGadgetAttribute(#ScrollAreaGadget, #PB_ScrollArea_InnerHeight, newY)
  
Next

CloseGadgetList()



Repeat
 
  WWE = WaitWindowEvent()
 
Until WWE = #PB_Event_CloseWindow
SendMessage_(GadgetID(#ScrollAreaGadget), #WM_SETREDRAW, 0, 0)
Kein Wunder, was soll die API mit der ID des Gadgets anfangen? Die Windows-API kennt PB nicht :mrgreen:
Seit wann das denn?!?! Willst Du wohl nur nur #ScrollAreaGadget übergeben? Dasmit GadgetID scheint ja zu funktionieren, nur flackert es eben trotzdem noch.
PB 6.21 | Win 11
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Flackern von Gadgets verhindern

Beitrag von Delle »

Kann es sein das #WM_SETREDRAW einfach gar nicht dazu passt?

Wenn ich jedes Mal VOR dem Zeichnen ausschalte und nach dem Zeichen wieder an, dann tut sich natürlich auf den Screen nichts (Gadget erscheinen erst beim Überfahren mit der Maus).
PB 6.21 | Win 11
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Flackern von Gadgets verhindern

Beitrag von Danilo »

Delle hat geschrieben:Kann es sein das #WM_SETREDRAW einfach gar nicht dazu passt?

Wenn ich jedes Mal VOR dem Zeichnen ausschalte und nach dem Zeichen wieder an, dann tut sich natürlich auf den Screen nichts (Gadget erscheinen erst beim Überfahren mit der Maus).
Deshalb sagte ich ja das Du nach dem anschalten neu zeichnen lassen mußt,
was Du mit InvalidateRect_() machen kannst.
Bei mir flackert aber bei Deinem Beispiel nichts und ich sehe auch nicht wo
etwas resized wird, also kann ich nichts weiter dazu sagen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Flackern von Gadgets verhindern

Beitrag von ts-soft »

Statt dem InvalideRect_() kannst Du auch dieses nutzen:

Code: Alles auswählen

RedrawWindow_(GadgetID(#ScrollAreaGadget), 0, 0, #RDW_ERASE | #RDW_FRAME | #RDW_INVALIDATE | #RDW_ALLCHILDREN)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Flackern von Gadgets verhindern

Beitrag von RSBasic »

Oder dieses:

Code: Alles auswählen

SendMessage_(handle, #WM_NCPAINT, 1, 0)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Flackern von Gadgets verhindern

Beitrag von Delle »

Also ich geb's auf... ich vermute es ist technisch einfach nicht machbar.

Die verschiedenen Bilder werden eben in einer Schleife reingeladen und das erfolgt relativ schnell. Vielleicht zu schnell. Erst bei einem Delay(250) verschwindet das Flackern... aber dann ist es mit der schnelleren Reinladerei natürlich auch vorbei.

Wenn ich erst ausblende, zeichnen lasse und wieder redraw mache, dann kommt ja im Endeffekt das gleiche raus wie vorher...
PB 6.21 | Win 11
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Flackern von Gadgets verhindern

Beitrag von Danilo »

Delle hat geschrieben:Wenn ich erst ausblende, zeichnen lasse und wieder redraw mache, dann kommt ja im Endeffekt das gleiche raus wie vorher...
Der Unterschied sollte sein, dass Du Deine 1000 Bilder alle neu zeichnen sollst, während das
Neuzeichnen der/des Gadgets gesperrt ist. Dann wird der Inhalt nur einmal refreshed, wenn Du es am Ende aufrufst.

Ohne diese Vorgehensweise wird jedes der 1000 Bilder (ImageGadgets) einzeln refreshed, das war unsere Überlegung dazu.

Aber wir raten ja auch nur rum was Du da evtl. machst.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Flackern von Gadgets verhindern

Beitrag von RSBasic »

@Delle
Ich habe dir eigentlich von Anfang an gesagt, dass das keine gute Idee ist, mit den vielen Gadgets für eine einzige Liste zu verwenden, da ich genau wusste, dass das passieren wird. Dafür gibt es doch eigentlich ListIcon/ExplorerList und da brauchst du nur einen Eintrag entfernen und den Rest macht Windows und das ohne Flackern. Und du brauchst nicht irgendwelche zahlreichen Gadgets, die nach diesem "Eintrag" folgen, ebenfalls verschieben oder die Images neu zu setzen. Und außerdem, falls du das vergessen haben solltest, kannst du mit WinAPIs genau so eine Liste erstellen, wie es in den Screenshots, die du im anderen Thread gepostet hast, dargestellt wird. Und nun hast du leider das Problem.
Entweder findet jemand doch noch eine Lösung für dich* oder es geht einfach nicht anders und du musst das nehmen, was vorhanden ist und akzeptieren, dass es halt flackert. Oder du versuchst mit Hilfe der Board-Suche (auch im engl. Forum) ein ListIconGadget mit WinAPIs zu erstellen. Beispielsweise die Vergrößerung der Icons etc.

*Vorausgesetzt, du bist bereit, für uns einen fertigen Beispielcode zu schreiben, so dass wir ohne zusätzlichem Aufwand direkt testen können. Sonst muss jeder, der dein Problem nachvollziehen möchte, erstmal aus dem Beispielcode von Kiffi so erweitern, bis das Problem mit dem Flackern entsteht. Aber auch wir haben leider nicht immer die Zeit, für jedes Problem einen Code zusammenzustellen, so dass man das Problem überhaupt feststellen kann, um dir zu helfen. Wenn du also einen fertigen Beispielcode posten würdest, erst dann kann versucht werden, eine Lösung zu finden, und man kann dir besser helfen, als herumzuraten, wie es grad der Fall ist. :)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Flackern von Gadgets verhindern

Beitrag von Danilo »

Jetzt weiß ich auch wieder um was es geht, Danke RSBasic! :)

Ich habe "in dem anderen Thread" auch schon einen Code gepostet wie man das
selber zeichnen mit einem CanvasGadget selbst machen kann.
Das Problem war nur (bei reinem PB, ohne API), dass die Scrollbar von PB nicht
in Realzeit Nachrichten schickt. Das kann man aber mit einem Callback machen,
wenn WinAPI möglich ist und das nicht platformunabhängig sein muß.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten