Autor Zpráva
Adrifinel
Profil
Mám kamaráda, který by potřeboval poradit:

Ahoj,

Je tu prosim nějaký programátor v C# ???

Potřeboval bych poradit s triviální věcí, na kterou nemůžu přijít...

Jde o to, že do obrázku vykresluju rámeček, tam kde uživatel klikne... Přes pictureBox.CreateGraphics().DrawRectangle().

A potom, když uživatel klikne na jiné místo, tak se mi vykreslí rámeček na jíném místě,
ale potřeboval bych, aby původní rámeček zmizel... A já nemůžu přijít na to jak to udělat...



Co byste poradili? Chtěl by to udělat pokud možno, co nejefektivnější, aby se počítač moc nenadřel...
Prochy
Profil
Nevim, jestli píše zrovna do správné diskuze. Lepší bude forum.zive.cz, Builder forum.

Jinak k problému, máš instanci toho rámečku, tak ji normálně přesune na jinou pozici ne a překreslí ji ne? Problém je v tom, že kamarád nejspíš vytváří pokaždé novou instanci, což je podle mě špatně. Při prvním kliknutí zjistí, jestli je vytvořena instance rámečku, když ne, tak ji vytvoří, jinak pracuje s již vytvořenou a té následně změní souřadnice vykreslení.
Jan Tvrdík
Profil
Prochy:
Metoda DrawRectangle žádnou instanci nevrací. Bude zřejmě potřeba to překreslit celé.
Adrifinel
Profil
Posílá toto a říká, že si myslí, že má jen jednu instanci:

Graphics g;
g = pictureBox1.CreateGraphics();

Tady si definuji koordináty 30ti obdélníků...
private Rectangle rect_A1 = new Rectangle(75, 40, 60, 82);
private Rectangle rect_A2 = new Rectangle(75, 137, 60, 82);
private Rectangle rect_A3 = new Rectangle(75, 236, 60, 82);
private Rectangle rect_A4 = new Rectangle(75, 332, 60, 82);
private Rectangle rect_A5 = new Rectangle(75, 429, 60, 82);
private Rectangle rect_A6 = new Rectangle(75, 526, 60, 82);
atd ... až 30...

Tady si do pole nacpu těch 30 koordinátů těch 30ti obdélníků..
private Rectangle[] SadaRectangle = new Rectangle[30];
SadaRectangle[0] = rect_A1;
SadaRectangle[1] = rect_A2;
SadaRectangle[2] = rect_A3;
SadaRectangle[3] = rect_A4;
SadaRectangle[4] = rect_A5;
SadaRectangle[5] = rect_A6;
atd ... až 30...


Tady v cyklu projíždím kolekci toho pole a porovnávám koordináty kam bylo kliknuto s koordináty 
do pole vložených Rectanglů. Pokud je shoda a bylo kliknuto na plochu Rectanglu - tak okolo obdélníku 
vykreslím ještě jeden červený... Koordináty kam bylo kliknuto jsou uloženy v proměnné mousePt
foreach (Rectangle rect in SadaRectangle)
{
      VymazStareRectangly(rect, g);  //Volám funkci, která překreslí všechny rectangly na černo..
      Pen outline = new Pen(Color.Red, 1);
      g.DrawRectangle(outline, rect);
      If (rect.Contains(mousePt))
      {
           g.DrawRectangle(outline, rect);
      }
}

private void VymazStareRectangly(Rectangle[] rect, Graphics g)
{
       Pen outline = new Pen(Color.Black, 1);
       g.DrawRectangle(outline, rect[0]);
       g.DrawRectangle(outline, rect[1]);
       g.DrawRectangle(outline, rect[2]);
       g.DrawRectangle(outline, rect[3]);
       g.DrawRectangle(outline, rect[4]);
       g.DrawRectangle(outline, rect[5]);
       atd ... a6 rect[30] ...
}

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: