Seite 2 von 3

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 19:34
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) 

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 19:48
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.

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 21:20
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).

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 21:38
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.

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 21:47
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)

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 22:06
von RSBasic
Oder dieses:

Code: Alles auswählen

SendMessage_(handle, #WM_NCPAINT, 1, 0)

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 22:19
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...

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 22:31
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.

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 22:38
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. :)

Re: Flackern von Gadgets verhindern

Verfasst: 05.02.2012 22:50
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ß.