Laden...

Graphics Seltsame probleme beim Scrollen

Erstellt von Andreas@Tricept vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.129 Views
A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren
Graphics Seltsame probleme beim Scrollen

Hallo,

ich suche mit diesem Beitrag einen Lösungsansatz. Ich habe ein nicht nachvollziehbares Problem:
Ein eigenes Control ist implementiert, im OnPaint erstelle ich mir eine Matrix, benutze die Methode Translate() und im Anschluss die RotateAt bevor ich diese Matrix der e.Graphics.Transform Property setze und weiterzeichne.

So nun zu dem Fehler. Wenn ich scrolle schleichen sich visuelle Fehler ein als hätte ich keinen Doublebuffer gesetzt (habe ich aber). Bis zu dem Zeitpunkt in dem ich die Matrix setze werden auch alle vorhergagangenen Zeichenoperationen korrekt ausgeführt.

Wenn die Zeile wo ich in der erstellten Matrix die Translate Methode verwende auskommentiere, so habe ich keine Probleme mehr (Nur die Verschiebung stimmt nicht).

Ich hab natürlich ein Testprojekt erstellt und diesen Fall nachgebildet, bekomme aber natürlich keine Probleme. Den Code des Elements will ich euch nicht zumuten und hoffe ihr habt einen Lösungsansatz für mich, wo ich suchen soll oder was ich ausprobieren könnte.

139 Beiträge seit 2006
vor 16 Jahren

Screenie und Code wären aber hilfreich 😉

Gruss Ari
Wer lesen kann ist klar im vorteil!
MSDN
Dein Feund in allen fragen

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Andreas@Tricept,

auf gut Glück: Panel-Autoscroll ohne Controls

herbivore

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren

Das ist der Effekt.
Wenn ich die Zeile m.Translate(x,y) auskomentiere, so kann ich soviel scrollen wie ich will, ich bekomme keinen Fehler.
Es scheint so als würde dieser Translate Befehl den DoubleBuffer deaktivieren Oo

2.760 Beiträge seit 2006
vor 16 Jahren

Schaut so aus als ob du beim scrollen (oder besser nach dem scrollen) nicht alles (u.U. das was neu gezeichnet werden soll) neu zeichnest.
Dein scrollen ist auch noch nicht fertig implementiert wie es aussieht?

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren

Das Scolling habe ich in dem Fall nicht programmiert. Dieses Tachodiagramm was du siehst ist ein Element abgeleitet von Control und befindet sich auf einem Panel mit AutoScroll.

2.760 Beiträge seit 2006
vor 16 Jahren

Wenn es in einem Panel verschachtelt ist dann musst du dich doch kaum noch selber ums scrolling kümmern. Deswegen ist mir dann nicht ganz klar was du mit dem Translate() erreichen möchtest.

Wenn du immer nur das aktuelle ClipRectangle neu zeichnest welches du aus den PaintEventArgs bekommst, dann solltest du diese Stelle im Control nochmal prüfen weil das recht tricky sein kann.

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren

Fehlerhafter Code=


Matrix m = new Matrix();
m.Translate(x,y);
m.RotateAt(rotation,Center);
e.Graphics.Transform = m;
e.Graphics.DrawLine()...

Wenn ich für x und y jeweils 0 einsetzte kommt selbst der Fehler.
Lasse ich nun diese "m.Translate(x,y);" Zeile weg, funktioniert alles wunderbar.

Woran könnte das liegen? Wenn ihr spekulieren müsstet was ich falsch mache, was wäre das?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Andreas@Tricept,

hast du dir den Link oben schon angeguckt?

herbivore

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren

Hm ich weiss nicht wie mir der Link weiterhelfen soll. Der Scroll verläuft ja auch richtig bei mir, lediglich die Elemente welche nach dem m.Translate gezeichnet werden, haben Darstellungsfehler. Ich bekomme diese Darstellungsfehler nur beim Scollen, aber wenn ich deinen Link richtig deute geht es da um gezeichnete Objecte die vom Scrolling nicht automatisch erfasst werden, was bei mir ja nicht der Fall ist, da ich ein abgeschlossenes nicht scollbares Tachoelement habe (Bild) und dieses ist in ein Panel eingebettet, welches mit Autoscroll auch alles was mit dem Scroll zu tun hat richtig berechnet und sich auch richtig verhält.

Mein Problem ist das sich mein eigenes Control, trotz DoubleBuffer nicht immer neu zeichnet wann es soll, ja doch wenn ich die Zeite mit dem Translate auskommentiere dann schon. Das Ganze macht für mich keinen Sinn. Sehe ich vor lauter Bäumen den Wald nicht mehr?

2.760 Beiträge seit 2006
vor 16 Jahren

trotz DoubleBuffer nicht immer neu zeichnet wann es soll

Double buffering hat ja nichts mit dem eigentlichen neu zeichnen zu tun sondern bedeutet eher das das Control erst auf dein Device gezeichnet wird wenn es komplett gerendert wurde um z.B. flackern zu vermeiden.

Was packst du denn da als für Werte rein bzw. woher nimmst du die bzw. was bezweckt die Transformation?


m.Translate(x,y);

1.378 Beiträge seit 2006
vor 16 Jahren

abonnier mal bei deinem Panel das Scroll Event und rufe in diesem die Invalidate Methode deines CustomControls auf.

Lg XXX

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren

Was packst du denn da als für Werte rein bzw. woher nimmst du die bzw. was bezweckt die Transformation?

Im Normalfall ist x und y eine 0. Es soll nur zusätzlich die Möglichkeit geben dieses Diagramm als Image in ein Worddokument zu speichern. Da ich viele dieser Controls habe und auch viele beim speichern als Image nicht sichtbar sind, habe ich mir eine eigene Methode implementiert die mir mit der OnPaint Methode ein Abbild davon erzeugt. Diese Methode malt aber zusätzlich noch einen Rahmen, daher wollte ich die ganze Grafik etwas verschieben und das tue ich indem ich das Graphics Element bevor es in die OnPaint läuft versetze. Beim setzen der Matrix verliere ich jedoch die Verschiebung und will diese daher neu setzen, da stöße ich auf Probleme.

Als Schnelllösung habe ich einfach eine Abfrage reingepackt die mir nur den Offset spricht wenn die Verschiebung nicht 0,0 beträgt. Daher ist sogesehen das Problem gelöst. Mich wundert es nur warum es überhaupt zu diesem Fehler kommt....

139 Beiträge seit 2006
vor 16 Jahren

Weiss ja nicht wie dein Update verhalten ist. Wenn du einfach immer auf das poanel wieder rauf malst, ohne den hintergrund zu löschen, ist es klar das fehler auftreten. Scrollen resizen usw sind etwas tricky wenns um GDI geht. Immer das alte rect löschen bzw neu malen, dann das neue zeichnen.

Gruss Ari
Wer lesen kann ist klar im vorteil!
MSDN
Dein Feund in allen fragen

2.760 Beiträge seit 2006
vor 16 Jahren

Oder einfach in deiner ToBitmap() funktion das generierte Bitmap in den Rahmen einpassen, oder den Rahmen an das Bitmap anpassen.