Form von Objekt aus Refreshen?

sra

Erfahrenes Mitglied
Hallo

Kann ich von einen Objekt aus die Form, der das Objekt schliesslich angehört refreshen? Geht das?

Danke
 
etwas erweitert:

Also..

Was ich genau will: Ich habe mir eine Klasse cBall gebastelt. da sind alle informationen über einen "Punkt" drin, also X, Y, Grösse, Farbe.

Nun will ich diesen Ball auch gleich in dieser Klasse auf die Form zeichnen. Wie geht das? Kann ich das Objekt der Klasse irgendwie als Child des Forms deklarieren, wie ich es mit Formularen kann?

bisher sieht mein Code so aus:

In der Klasse Form1
Code:
cBall demBall = new cBall(50, 265);

private void onKeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
	//MessageBox.Show(e.KeyValue.ToString());

	switch(e.KeyValue)
	{
		case 32: demBall.Move();
	}
}

In der Klasse cBall
Code:
public void rePaint()
{
	Graphics g = new Graphics();
	Brush myBrush = new SolidBrush(foreColor);

	g.FillEllipse(myBrush, Convert.ToInt32(actX), Convert.ToInt32(actY), width, width);
}

Erstens habe ich ein Problem mit dem Graphics. Muss man das mit dem e.Graphics initialisieren, das es nur in onPaint gibt?

Zweitens wörde ich gerne einen Refresh im Form1 machen, ausgelöst vom Objekt demBall.
 
Zuletzt bearbeitet:
Hallo.

Übermittle deinem Objekt den Eigentümer, sodass es darauf zugreifen kann.

Code:
public class cBall
{
	private Form parent;
	
	public cBall(Form parent, ..)
	{
		this.parent = parent;	
	}
	
	private void RefreshParent()
	{
		if (parent != null)
			parent.Refresh();
	}
}

Oder

Code:
public class cBall
{
	private Form parent;
	
	public Form Parent
	{
		get { return parent; }
		set { Parent = value; }
	}
	
	private void RefreshParent()
	{
		if (parent != null)
			parent.Refresh();
	}
}

MfG,
Alex
 
Danke Alex - Ich wusste du lässt mich nicht im Stich :D

Aber das andere Problem habe ich noch.
Wenn ich ganz normal

Graphics g = new Graphics();

mache, dann gibt es einen Compilerfehler, dass Graphics 0 überlagerungen braucht (!?).

Kann mir da auch noch schnell einer helfen?
 
Hehe sra.

Dein zweites Problem hab ich übersehen.

Ein Graphics Objekt kannst du nicht so einfach erstellen, es existiert immer nur in einem bestimmten Context.

Du kannst es jedoch von Bildern oder Controls erhalten.

In deinem Fall sehe ich 2 Möglichkeiten.

Entweder du holst dir ein Graphicsobjekt über den Parent in deiner RePaint Methode.

Code:
public void rePaint()
{
	Graphics g = Graphics.FromHwnd(parent.Handle);
	Brush myBrush = new SolidBrush(foreColor);

	g.FillEllipse(myBrush, Convert.ToInt32(actX), Convert.ToInt32(actY), width, width);
}

Oder du übergibst deiner rePaint Methode ein Graphicsobjekt. Das ist praktischer, wenn du nicht direkt im Form, sondern in einem Panel zeichnen willst, oder so.
Code:
public void rePaint(Graphics g)
{
	Brush myBrush = new SolidBrush(foreColor);

	g.FillEllipse(myBrush, Convert.ToInt32(actX), Convert.ToInt32(actY), width, width);
}
 
hm..

Ersteres will irgendwie nicht. Gibt zwar keinen Fehler, aber der Punkt wird nicht gezeichnet.

Dein zweiter Vorschlag ist insofern "nicht schön" für mich, weil ich diese rePaint Methode intern im Objekt von einer anderem Methode namens Move aufrufe.

Move verändert die Position des Kreises, und rePaint zeichnet in auf das Formular.

Move wird wiederum in einem Timer im Formular aufgerufen, wo ich kein Graphics Objekt erzeugen kann.

Muss ich also den unschönen Weg gehen, und im Form1 eine Eigenschaft Graphics g machen, diese im onPaint Event initialisieren, im Timer das Graphics Objekt der Move Methode übergeben, welche es der rePaint Methode weiterletiet, welche das Objekt dann braucht?

Das müsste doch "schöner" zu lösen sein :D
 
Original geschrieben von sra
Muss ich also den unschönen Weg gehen, und im Form1 eine Eigenschaft Graphics g machen, diese im onPaint Event initialisieren, im Timer das Graphics Objekt der Move Methode übergeben, welche es der rePaint Methode weiterletiet, welche das Objekt dann braucht?

Das müsste doch "schöner" zu lösen sein :D

Also im OnPaint die Variable initialisieren musst du nicht, es gibt da noch die CreateGraphics Methode die jedes Control hat. Die kannst noch aufrufen.

Wenn ich mit selbstzeichnenden Objekten arbeite, mache ich es folgenderweise.
Jede Klasse hat eine Zeichenmethode welche als Parameter das Graphics Objekt erwartet. In der Paintmethode des Hauptprogramms wird dann immer die PaintMethode der Objekte aufgerufen.
Sollte sich nun ein Control ändern, wird die Invalidate Methode der Zeichenfläche aufgerufen.

In der einen DirectX Anwendung die ich mal schrieb lief das Ganze übrigens in einer Schleife und wurde immer wieder neu gezeichnet. Da musste man dann gar nicht den Zeichenbereich invalidieren.
 
ich habe per CreateGraphics ein solches erzeugt, und an die Methode geschickt, geht aber nicht :/

Hast du Lust und Zeit dir das schnell anzugucken? Ich habe den Timer noch nicht drin, und auch sonst hält sich der Umfang in Grenzen :D

Wenn nicht, ist das natürlich kein Problem.

Danke

//Edit: Link vergessen :D
ballGame.rar
 
Zuletzt bearbeitet:
Zurück