Graphics znikanie i pojawianie

0

Czesc Wam,

Mam sobie klase Graphics i rysuje nia np. kolo, kwadrat i trojkat w roznych czesciach form'a. Teraz chcialbym aby po nacisnieciu button'a #1 przesunelo mi sie kolo w bok, po nacisnieciu button'a #2 przesuwa sie w bok trojkat. Kombinowalem z

graphicsObj.Clear(SystemColors.Control);

Ale to powoduje, ze znika mi wszystko w formie nawet jezeli uzywam graphicsObj1, graphicsObj2 itp. Jak zrobic zeby znikla tylko jedna figura?

Pozdrawiam,
Adam

0

rysowac po form nalezy w OnPaint
a obsludze przycisku obslugujesz przesuniecie figor, tzn. zmieniasz wartosci jakis zmiennych, ktore mowia gdzie figura znajduje sia na formie i wywolujesz Invalidate(), co spowoduje odrysowanie, czyli wwolanie OnPaint

inaczje musisz zamalowac figure narysowana wczesniej i namalowac ja gdzie indziej

0
Pomidorowy napisał(a)

gdzie figura znajduje sia na formie i wywolujesz Invalidate(), co spowoduje odrysowanie, czyli wwolanie OnPaint

Nie rozumiem. Robie w ten sposob

        
private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Black, 1);
            g.DrawLine(p1, 485, 25, 485, 421);
        }

Akcje ktore chce zaprogramowac:

  • Po nacisnieciu button#1: linia znika i przesuwa sie o kawalek,
  • Po nacisnieciu bytton#2: przesunieta linia znika i znowu przesuwa sie o kawalek,

Wiec robie tak:

Button#1:

  private void button1_Click(object sender, EventArgs e)
        {
            System.Drawing.Graphics graphicsObj;
            graphicsObj = this.CreateGraphics();
            Pen myPen = new Pen(System.Drawing.Color.Black, 2);
            graphicsObj.DrawLine(myPen, 490, 25, 490, 421);
        }

Button#2:

  private void button2_Click(object sender, EventArgs e)
        {
            System.Drawing.Graphics graphicsObj;
            graphicsObj = this.CreateGraphics();
            Pen myPen = new Pen(System.Drawing.Color.Black, 2);
            graphicsObj.DrawLine(myPen, 495, 25, 495, 421);
        }

Gdzie mam wcisnac Invalidate()?

Dziekuje za podpowiedz.
Adam Nieroda


0

w Form_Paint nie powinienies miec na sztywno ustalone gdzie ma rysowac sie linia, tylko poczatek i koniec linii trzymac w zmiennych, a w kliknieciu button1 i button2 zmienic wartosci tych zmiennych i wywolywac invalidate
poza tym obiekty gdi (jak pen) powinny byc zniszczone kiedy konczysz ich uzywac
poza tym jesli uzywasz nazwanego koloru mozesz uzyc pen z System.Drawing.Pens

0
massther napisał(a)

w Form_Paint nie powinienies miec na sztywno ustalone gdzie ma rysowac sie linia, tylko poczatek i koniec linii trzymac w zmiennych, a w kliknieciu button1 i button2 zmienic wartosci tych zmiennych i wywolywac invalidate

Chyba jestem jakis glupi, albo , bo to nie chce dzialac. Zrobilem tak jak mowiles

        int y1 = 485;

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Black, 1);
            g.DrawLine(p2, y1, 25, y1, 421); # poczatek - zawsze staly
        }

pozniej zamiast buttonow zdecydowalem sie na trakbar'a, wiec:

 private void trackBar1_Scroll(object sender, EventArgs e)
{
            System.Drawing.Graphics graphicsObj;
            graphicsObj = this.CreateGraphics();
            Pen myPen = new Pen(System.Drawing.Color.Black, 2);

        

 switch (trackbar1.Value)
           {
               case 1:
                   graphicsObj.DrawLine(myPen, y1, 25, y1, 421); # poczatkowe wartosci
                   Invalidate();
                   break;

               case 2:
                   graphicsObj.DrawLine(myPen, y1+5, 25, y1+5, 421);
                   Invalidate();
                   break;

               case 3:
                   graphicsObj.DrawLine(myPen, y1+10, 25, y1+10, 421);
                   Invalidate();
                   break;
        }
myPen.Dispose();
}

Co robie zle? Bo stosujac ten kod linia sie nie wyswietla przy przesunieciu trakbara...

0

najn, najn, najn! szajse :D

w trackBar1_Scroll masz zmienic wartosc y1 i wywolac invalidate, wszystko narysuje sie w paint

swoja droga wystarczy tylko tak :D
e.Graphics.DrawLine(Pens.Black, y1, 25, y1, 421);

0
massther napisał(a)

w trackBar1_Scroll masz zmienic wartosc y1 i wywolac invalidate, wszystko narysuje sie w paint

Czy duzym naduzyciem bedzie jak poprosze Cie o kawalek kodu? Bo jak robie tak:

        int y1 = 485;

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
        e.Graphics.DrawLine(Pens.Black, y1, 25, y1, 421);
        }

Pozniej tak:

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
         switch (trackbar1.Value)
           {
               case 1:
                   int y1 = 485;
                   break;

               case 2:
                   int y1 = 490;
                   break;

               case 3:
                   int y1 = 495;
                   break;
        }
}
        }

No i pojawia sie error:
A local variable named 'y1' is already defined in this scope

Czy zmienna y1 powinenem trzymac w jakies tablicy, czy jak? Bo ja juz naprawde zglupialem....
Bardzo dziekuje za pomoc.

Adam

0

y1 masz zadeklarowane jako pole w Form1
po co w trackBar1_Scroll deklarujesz ponownie y1 lokalnie, ktore przeslania to z Form1
a po drugie w kolejnych case nie mozna deklarowac zmiennych o tych samych nazwach, chyba ze kod pod case zamkniesz w klamerkach, bedzie on w tedy traktowany jak blok, np. po if
czyli tak jest poprawnie

switch(cos)
{
    case 1:
    {
        int x = 1;
    }
    break;
    case 2:
    {
        int x = 2;
    }
    break;
}

ale juz nie bede sie znecal

private void trackBar1_Scroll(object sender, EventArgs e)
{
	switch (trackbar1.Value)
	{
		case 1:
			y1 = 485;
			break;
		case 2:
			y1 = 490;
			break;
		case 3:
			y1 = 495;
			break;
	}
	this.Invalidate();
}
0
massther napisał(a)

ale juz nie bede sie znecal

Serdecznie dziekuje! Wszystko dziala jak ta lala :)
Jak bedziesz kiedys w Gdansku to przypomnij mi, ze mam Ci postawic duze piwo :)

Pozdrawiam,
Adam

1 użytkowników online, w tym zalogowanych: 0, gości: 1