Übereinander liegende Pictureboxes einzeln neu zeichnen

Azatoth

Mitglied
Hallo Leute,

ich habe folgendes Problem und zwar: In meinem Programm gibt es 3 Pictureboxes, die unterste hat einen weißen Hintergrund und die 2 oberen sind durchsichtig. Soweit funktioniert es auch nur wenn ich eine der oberen Pictureboxen aktualisiere werden automatisch auch alle anderen Pictureboxen der Hierarchie aktualisiert. Meine Frage lautet jetzt kann ich irgendwie jede Picturebox einzeln aktualisieren ohne das sich die anderen auch aktualisieren?

Hier die Verschachtelung der Pictureboxen:
Code:
pbRasterLayer.Controls.Add(pbObjektLayer);
pbObjektLayer.Controls.Add(pbAuswahlLayer);
 

Nico Graichen

Erfahrenes Mitglied
Aso! Dabei wird der Bildschirmausschnitt neu gezeichnet, nicht nur das Control.

Das einzige, was du probieren könntest.

Den Code zum Zeichnen in eine Methode packen und diese anstatt Invalidate aufrufen. Ist aber auch nur ein Versuch
 

Azatoth

Mitglied
Den Code habe ich schon in einer Methode die ich dann in OnPaint() aufrufe. Das Problem ist nur das ich das PaintEventArgs aus der OnPaint-Methode brauche um korrekt zu Zeichnen oder gibt es da noch andere Lösungen?

Code:
#region PaintEvent des Objekt Layers
private void pbObjektLayer_Paint(object sender, PaintEventArgs e)
{
	pbObjektLayer.SuspendLayout();

	Graphics GrafikHandle = e.Graphics;
	GrafikHandle.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;

	//Ursprung verschieben und Y-Achse umkehren
	GrafikHandle.TranslateTransform(0, pbRasterLayer.Height);
	GrafikHandle.ScaleTransform(1, -1);

	m_Beschriftungsbereich.ObjekteZeichnen(GrafikHandle, m_Signumeric.Document.GetObjekte());

	pbObjektLayer.ResumeLayout();
}
#endregion

#region Methode zum Zeichnen der Objekte
public void ObjekteZeichnen(Graphics f_GrafikHandle, List<Objekte.CBasisObjekt> f_lstObjekte)
{
	Pen Stift = new Pen(Color.Black);
	int iStartX = 0;
	int iStartY = 0;
	int iEndeX = 0;
	int iEndeY = 0;

	for (int i = 0; i < f_lstObjekte.Count; i++)
	{
		for (int x = 0; x < f_lstObjekte[i].Vektoren.Count; x++)
		{
			iStartX = Convert.ToInt32(Math.Round((m_uiRand + f_lstObjekte[i].Vektoren[x].StartX * m_uiAbschnitt / m_dSkala) * m_fZoomfaktor));
			iStartY = Convert.ToInt32(Math.Round((m_uiRand + f_lstObjekte[i].Vektoren[x].StartY * m_uiAbschnitt / m_dSkala) * m_fZoomfaktor));
			iEndeX = Convert.ToInt32(Math.Round((m_uiRand + f_lstObjekte[i].Vektoren[x].EndeX * m_uiAbschnitt / m_dSkala) * m_fZoomfaktor));
			iEndeY = Convert.ToInt32(Math.Round((m_uiRand + f_lstObjekte[i].Vektoren[x].EndeY * m_uiAbschnitt / m_dSkala) * m_fZoomfaktor));

			if (f_lstObjekte[i].ObjektTyp == Objekte.eObjektTyp.Text)
			{
				Stift = new Pen(Color.Black);
			}
			else if (f_lstObjekte[i].ObjektTyp == Objekte.eObjektTyp.Grafik)
			{
				Stift = new Pen(Color.LightSteelBlue);
			}

			f_GrafikHandle.DrawLine(Stift, iStartX, iStartY, iEndeX, iEndeY);					
		}
	}
}
#endregion
 
Zuletzt bearbeitet:

Azatoth

Mitglied
Ich glaube es hat sich erledigt, habe es über Merkervariablen probiert und dabei ist mir aufgefallen wenn ich nicht alle Pictureboxen aktualisiere wird auch nur diejenige dargestellt die ich aktualisiert habe. Das heißt mir würde der Inhalt der anderen Pictureboxen verloren gehen das darf er aber nicht. Ich mache jetzt mal so weiter und hoffe das es bei vielen Objekten und fein aufgelöstem Raster nicht zu Performance Schwierigkeiten kommt.