Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

1

27.01.2013, 17:21

C# GDI+ Picturebox nach Größenänderung ohne Inhalt

Hallo Community,

hab den Titel wohl etwas schlecht gewählt...

Ich zeichne mehrere Objekte in eine Picturebox. Da die benötigte Fläche größer als der Bildschirm ist, habe ich sie in einen Container mit Scrolleisten gepackt. Alle Objekte die nicht in Sichtweite liegen verschwinden allerdings. Wie könnte man das verhindern?

So zeichne ich Objekte:

C#-Quelltext

1
pictureBox1.CreateGraphics().DrawLine(p1, 10, 10, 30, 30);



Danke schon mal.

Gruß,
MitgliedXYZ

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

27.01.2013, 17:28

Alle Objekte die nicht in Sichtweite liegen verschwinden allerdings. Wie könnte man das verhindern?


Warum willst du das überhaupt verhindern? Man sieht sie doch eh nicht und wenn sie dann trotzdem gerendert werden würden, wäre das doch nur performanceverschwendung.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

3

27.01.2013, 17:32

Hab es falsch formuliert:
Wenn man zurückscrollt, sind sie nicht mehr da...

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

4

27.01.2013, 17:33

Vielleicht wird der Inhalt dann nicht neugezeichnet?
Probier mal nach dem Scrollen ein Invalidate() auf der Picturebox aufzurufen

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

5

27.01.2013, 17:40

private void panel1_Scroll(object sender, ScrollEventArgs e)
{
pictureBox1.Invalidate();
}


Wenn ich es so schreibe, verschwindet schon bei der kleinsten Scrollbewegung alles. Auch das sichtbare.




Und

C#-Quelltext

1
pictureBox1.Update();


hat die selbe Wirkung, wie wenn keine Aktion ausgeführt wird :S

Edit:
Oder gibt es keine Möglichkeit, dass automatisch machen zu lassen?
Muss ich mir evtl. ein Array erstellen, dass alle Objekte speichert und dann lasse ich beim panel1-ScrollEreigniss einfach immer alles "von Hand" neu zeichnen? Das wäre aber wahrscheinlich sehr (Rechen-)Aufwendig.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MitgliedXYZ« (27.01.2013, 17:46)


Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

6

27.01.2013, 17:53

Ähm moment... dein DrawLine aus dem Ausgangspost machst du gar nicht im OnPaint?
Das erklärt dann natürlich alles.

Wenn du das einmal irgendwo machst, dann ist das gezeichnete genau so lange da bis das Control neu gezeichnet wird (was zb beim Scrollen passiert) da du auf das Paint event nicht reagierst wird da auch nichts zusätzlich gezeichnet und du hast ein leeres Control.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

7

27.01.2013, 17:57

Schade, das macht alles komplizierter...

Und ja, eine externe Methode zeichnet die Objekte...

Wiso wurde dass nur so umständlich gelöst, wäre viel einfacher gewesen, wenn man die Objekte einmal zeichnet und sich dann um das (wieder-)Anzeigen die PictureBox selbst kümmert...

Danke trotzdem.

Gruß,
MitgliedXYZ

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

27.01.2013, 17:59

Diese externe Methode kannst du ja aber auch im OnPaint aufrufen ;)
Und wenn ich das richtig im Kopf hab, wird dir da auch mitgeteilt welche Region neu gezeichnet werden soll, falls das komplette Zeichnen zu aufwändig ist.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

9

27.01.2013, 18:01

Naja, ich hab ca. 200 Objekte (Je 100 Kreise und 100 Beschriftungen).
Aber dann lasse ich halb beim scrollen alles neu zeichnen, ich werde ja sehen ob es ertragbar ist, oder nicht...

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

10

27.01.2013, 18:03

Das ist keine gute Idee. Scrollen ist nur eine von vielen Möglichkeiten, die ein Control dazu bringen kann sich neu zu zeichnen.

Entweder du erstellst eine Klasse, die von Picturebox erbt und überschreibst die OnPaint Methode oder du fängst das Paint-Event deiner Picturebox ab und zeichnest da.

Werbeanzeige