Unterschied zwischen DrawingArea und ScrollArea, Cached-Wert

Spezielle Fragen zu 2D- und 3D-Grafik, Sound und Video
Antworten
Minihawk
Foriker
Beiträge: 32
Registriert: Do 16. Jan 2014, 20:03
Kontaktdaten:

Unterschied zwischen DrawingArea und ScrollArea, Cached-Wert

Beitrag von Minihawk » Mo 10. Mär 2014, 12:45

Überall kann man ja lesen, dass die Scrollarea einfach eine scrollende Drawing-Area ist, aber leider ist das nicht der Fall. Ich nutze die Drawing-Area zur Darstellung von grafischen Ausgaben, die ich per Draw() dorthin zeichnen lasse. Dies klappt nur dann, wenn ich "Cached" den Wert "True" gebe, aber diesen Parameter "Cached" gibt es bei der ScrollArea nicht, also kann ich auch nicht per Draw da hinein zeichnen.

Mein Programm funktioniert natürlich auch mit der DrawingArea, aber da ist die Größe der Bilder, die dargestellt werden können, begrenzt, ich würde auch gerne HD-Bilder als Vorschau anzeigen können, dafür müsste die Area scrollen können.

Jemand einen Tipp, wie man so etwas erreichen kann?

tux_
Moderator
Beiträge: 946
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Unterschied zwischen DrawingArea und ScrollArea, Cached-

Beitrag von tux_ » Mo 10. Mär 2014, 13:59

aber diesen Parameter "Cached" gibt es bei der ScrollArea nicht


Guter Punkt! Das ist den meisten bisher nur nicht aufgefallen, weil sie die neue Methode des Zeichnens verwenden: das Draw-Event. Das ergibt insbesondere bei der ScrollArea Sinn, da hinter einer ScrollArea mit Cached = True (hypothetisch) ein *sehr* groszes Bild stehen koennte, von dem stets nur ein sehr geringer Teil dargestellt wird. Offensichtlicher kann man Speicher nicht verschwenden.

Das Draw-Event zwingt den Programmierer dazu, zu bestimmten Zeitpunkten[*] den sichtbaren (!) Inhalt der Drawing-/ScrollArea neu zu zeichnen, sodass immer nur der gerade sichtbare Teil des Bildes im Speicher liegen muss. Das angehaengte Projekt zeigt dir, wie man die Cached-Eigenschaft bei einer ScrollArea ueber ein internes Picture emulieren kann.

[*] Diese sind unvorhersehbar. Die ScrollArea muss z.B. neu gezeichnet werden, wenn der Benutzer gescrollt hat (weil der gezeigte Ausschnitt dann sicher nicht mehr aktuell ist).
Dateianhänge
scrollareapicture-0.0.1.tar.gz
(5.33 KiB) 109-mal heruntergeladen
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Minihawk
Foriker
Beiträge: 32
Registriert: Do 16. Jan 2014, 20:03
Kontaktdaten:

Re: Unterschied zwischen DrawingArea und ScrollArea, Cached-

Beitrag von Minihawk » Mo 10. Mär 2014, 18:35

Super-Tipp, das Teil hab ich grad mal aufgerufen, gut zu verstehen, werd ich wohl hinkriegen.

Ich will ein TGA-Bild einlesen und das Ergebnis in der Scroll-Area darstellen lassen.

Bislang hab ich die Dateien direkt von der Festplatte auf die Drawing-Area malen lassen, jetzt muss ich die halt in den Speicher packen (je eines im Speicher), dann sollte das Scrollen klappen.

Wenn es interessiert: Ich schreib gerade an einem Choma-Keying-Programm, welches bestimmte Farbhintergründe in Transparenz umwandelt (erzeugt TGA-Dateien mit Alpha-Kanal, so was wie ein Bluebox oder Greenbox-Programm). Mit der Scrollbox wären auch Dateien für HD-Formate in der Vorschau anschaubar.

Danke!

Minihawk
Foriker
Beiträge: 32
Registriert: Do 16. Jan 2014, 20:03
Kontaktdaten:

Re: Unterschied zwischen DrawingArea und ScrollArea, Cached-

Beitrag von Minihawk » Mi 12. Mär 2014, 18:29

Ich steh jetzt doch etwas auf dem Schlauch. Ich habe eine Scrolling-Area, der verpasse ich ein Picture-Objekt. Nun möchte ich auf dieses Picture-Objekt malen, am besten Punktweise, denn ich möchte TGA-Bilddateien einlesen und in der Area anzeigen lassen...

Nur finde ich keine Pain.Plot-Routine, mit der ich Einzelpunkte setzen könnte. Auch später will ich die Egerbnisse anzeigen lassen, auch Punktweise.

Irgendwelche Tipps?

tux_
Moderator
Beiträge: 946
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Unterschied zwischen DrawingArea und ScrollArea, Cached-

Beitrag von tux_ » Mi 12. Mär 2014, 19:10

Am besten, du benutzt nicht die Picture- sondern die Image-Klasse. Diese laesst Zugriff auf den Pixel an gegebenen X/Y-Koordiaten zu. Also

Code: Alles auswählen

' Image fuer Verarbeitung holen
Dim hImage As Image = hMyPicture.Image

hImage[iPixelX, iPixelY] = iPixelColor
' usw.

' Wieder zurueck zum Picture
hMyPicture = hImage.Picture
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Minihawk
Foriker
Beiträge: 32
Registriert: Do 16. Jan 2014, 20:03
Kontaktdaten:

Re: Unterschied zwischen DrawingArea und ScrollArea, Cached-

Beitrag von Minihawk » Mi 12. Mär 2014, 19:15

Das wird wohl so funzen, ich hab irgendwie ne andere rect-Funktion ausprobiert (nicht die gefüllte), da ist nix gemalt worden. Ich hab jetzt bis gerade erst einmal den alten Zustand wiederhergestellt, aber mit dem neuen Code auswählbar über eine Konstantendefinition. Wenns funzt (oder nicht) sag ich bescheid ... :)

tux_
Moderator
Beiträge: 946
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Unterschied zwischen DrawingArea und ScrollArea, Cached-

Beitrag von tux_ » Mi 12. Mär 2014, 19:20

Entschuldige, ich hatte die Frage falsch verstanden. Oben steht jetzt eine ganz andere Antwort (nichts mehr mit FillRect()), hoffentlich die Richtige fuer dich.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Minihawk
Foriker
Beiträge: 32
Registriert: Do 16. Jan 2014, 20:03
Kontaktdaten:

Re: Unterschied zwischen DrawingArea und ScrollArea, Cached-

Beitrag von Minihawk » Mi 12. Mär 2014, 21:59

Hi,

ich habe es anhand der ersten Antwort (die ist wohl gelöscht) gemacht, und das läuft ... Ist wahrscheinlich nicht optimal, aber funzt ...

Jetzt hab ich och ein problem, das möchte ich aber in einem neuen Thread aufführen,w enn ich dazu nichts finde...

Danke für die Hilfe!

tux_
Moderator
Beiträge: 946
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Unterschied zwischen DrawingArea und ScrollArea, Cached-

Beitrag von tux_ » Mi 12. Mär 2014, 22:37

ich habe es anhand der ersten Antwort (die ist wohl gelöscht) gemacht


Zur Referenz: mein Vorschlag im zitierten (geloeschten) Beitrag war die Methode Paint.FillRect(iPixelX, iPixelY, 1, 1, iPixelColor), was dem Quelltext von Draw.Point() in der veralteten Draw-Klasse entspricht.

Wenn man auf ein Picture zeichnen moechte, ist diese Methode aber denkbar ineffizient und man sollte die Image[X, Y]-Methode vorziehen.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Minihawk
Foriker
Beiträge: 32
Registriert: Do 16. Jan 2014, 20:03
Kontaktdaten:

Re: Unterschied zwischen DrawingArea und ScrollArea, Cached-

Beitrag von Minihawk » Di 18. Mär 2014, 17:23

Ich habe das ganze jetzt auf die Image-Objekt-Version umgestellt, es ist ca. doppels so schnell beim Bildaufbau, obwohl das Bild von Festplatte gelesen wird, braucht der Neuaufbau nur noch die Hälfte der Zeit ...

Das macht echt Spaß so ... Danke!

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste