3.4k Aufrufe
Gefragt in Anwendungen(Java,C++...) von
Hallo!
Also ich möchte in C# eine Animation programmieren, wo ein Rechteck oder Kreis von innen nach außen immer größer wird. Anders herum habe ich es schon hinbekommen, also dass es von außen nach innen immer kleiner wird. Ich habe da einfach eine for-Schleife genommen, die Anzahl der Durchgänge festgelegt und dabei jedes mal einen bestimmten Wert von der Breite / Höhe abgezogen. Aber wenn es von innen nach außen laufen soll passiert alles mögliche, nur nicht der gewünschte Effekt. Kann mir bitte jemand hilfreich zur Seite stehen? Danke schön! Claudia.

5 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Wie wär's mit deinem Beispielcode? Bitte [code]-Tags benutzen.
0 Punkte
Beantwortet von
Ja, der Beispielcode ist dann hier:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void buttonClose_Click(object sender, EventArgs e)
{
this.Close();
}

private void buttonStartMinus_Click(object sender, EventArgs e)
{
Graphics zeichenflaeche;
zeichenflaeche = this.CreateGraphics();
Pen stift = new Pen(Color.Green);
Rectangle bereich;
bereich = ClientRectangle;
for (int durchlauf = 0; durchlauf < 22; durchlauf++)
{
bereich.Width = bereich.Width - 10;
bereich.Height = bereich.Height - 10;
bereich.Location = new Point(bereich.Location.X + 5, bereich.Location.Y + 5);
zeichenflaeche.DrawRectangle(stift, bereich);
System.Threading.Thread.Sleep(100);
zeichenflaeche.Clear(BackColor);
}
}

private void buttonStartPlus_Click(object sender, EventArgs e)
{
Graphics zeichenflaeche;
zeichenflaeche = this.CreateGraphics();
Pen stift = new Pen(Color.Red);
Rectangle bereich;
bereich = ClientRectangle;

}
}

Wie gesagt, einmal soll das Rechteck nach innen gehen und einmal nach außen -> aber da fehlt mir noch die Erfahrung. Ich hoffe der Code ist Dir hilfreich.
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Für beide Ereignismethoden kannst du folgenden Code verwenden. Du musst lediglich für iRichtung einmal 1 und einmal -1 verwenden. Idealerweise kapselst du das in einer Prozedur, die du dann nur noch aufrufen müsstest - aber erstmal der Reihe nach:
{
Graphics gZeichenflaeche= this.CreateGraphics();
Pen pStift= new Pen( Color.Green );
Rectangle rBereich= ClientRectangle;

int iSchrittZiel= 22 // Anzahl zu durchlaufender Figuren
, iRichtung= 1 // 1 = wachsen, -1 = schrumpfen
, iAbstand= 5 // Zu addierende oder subtrahierende Entfernung Pixel
, iDurchlauf; // Schleife

// Von innen nach außen? Dann das Rechteck in kleinster Figur anzeigen
if( iRichtung== 1 ) {
rBereich.Width-= iSchrittZiel* ( iAbstand+ 2 );
rBereich.Height-= iSchrittZiel* ( iAbstand+ 2 );
rBereich.Location.X+= iSchrittZiel* iAbstand;
rBereich.Location.Y+= iSchrittZiel* iAbstand;
}

for( iDurchlauf= 0; iDurchlauf< iSchrittZiel; iDurchlauf++ ) {
rBereich.Width+= iRichtung* iAbstand* 2;
rBereich.Height+= iRichtung* iAbstand* 2;
rBereich.Location.X-= iRichtung* iAbstand; // Position umgekehrt zur Richtung
rBereich.Location.Y-= iRichtung* iAbstand;
gZeichenflaeche.DrawRectangle( pStift, rBereich );
System.Threading.Thread.Sleep( 100 );
gZeichenflaeche.Clear( BackColor );
}

Ungetestet.
0 Punkte
Beantwortet von
Hallo! Erst einmal besten Dank für die Mühe, aber leider funktioniert der Code so nicht. Es gibt eine Fehlermeldung:

"bereich.Location.X ... kann nicht geändert werden, da er keine Variable ist"

Dasselbe trifft für bereich.Location.Y zu.
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Dann mach halt aus...
rBereich.Location.X+= iSchrittZiel* iAbstand;
rBereich.Location.Y+= iSchrittZiel* iAbstand;
...
rBereich.Location.X-= iRichtung* iAbstand; // Position umgekehrt zur Richtung
rBereich.Location.Y-= iRichtung* iAbstand;

...das hier...
rBereich.Location= new Point( rBereich.Location.X+ iSchrittZiel* iAbstand, rBereich.Location.Y+ iSchrittZiel* iAbstand );
...
rBereich.Location= new Point( rBereich.Location.X- iRichtung* iAbstand, rBereich.Location.Y-= iRichtung* iAbstand );
...