/ / C # Graphics.FillRectangle nefunguje vôbec - c #, winforms, bitmapa

C # Graphics.FillRectangle nefunguje vôbec - c #, winforms, bitmapy

Nižšie uvedený kód nebude fungovať bez ohľadu na to, koľkokrát stlačím tlačidlo, je to naozaj nepríjemné

private void button2_Click(object sender, EventArgs e)
{
Bitmap screen = new Bitmap(600, 800);
Graphics gfx = Graphics.FromImage(screen);
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 0));
gfx.FillRectangle(brush, 0, 0, 600, 800);
gfx.Dispose();
brush.Dispose();
screen.Dispose();
}

odpovede:

0 pre odpoveď č. 1

Nemali ste nikdy kresliť bitmapu na obrazovku. Môžete to urobiť takto:

private void button2_Click(object sender, EventArgs e)
{
Bitmap screen = new Bitmap(600, 800);
Graphics gfx = Graphics.FromImage(screen);
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 0));
gfx.FillRectangle(brush, 0, 0, 600, 800);
CreateGraphics().DrawImage(screen, 0, 0);
gfx.Dispose();
brush.Dispose();
screen.Dispose();
}

Nemali by ste to však používať, pretože zabraňujú optimálnemu fungovaniu systému DoubleBuffering a zmeny sa vymažú vždy, keď sa aktivuje udalosť farby, a preto nie je správna prax.

Namiesto toho by ste mali spracovať udalosť Paint (Úlohy)choďte k dizajnérovi (stlačte kláves F7 v kóde za ním), vyberte formulár, otvorte okno vlastností (stlačte kláves F4), vyberte kartu udalostí (kliknite na blesk) a dvakrát kliknite do poľa vpravo. maľovať):

private void Form1_Paint(object sender, PaintEventArgs e)
{
Bitmap screen = new Bitmap(600, 800);
Graphics gfx = Graphics.FromImage(screen);
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 0));
gfx.FillRectangle(brush, 0, 0, 600, 800);
e.Graphics.DrawImage(screen, 0, 0);
gfx.Dispose();
brush.Dispose();
screen.Dispose();
}

Neodporúča sa však použiť bitmapu v tomto prípade, pretože sa nezobrazuje veľa. Namiesto toho by ste mali priamo kresliť grafiku formulára:

private void Form1_Paint(object sender, PaintEventArgs e)
{
using (var gfx = e.Graphics)
using (var brush = new SolidBrush(Color.FromArgb(255, 255, 0)))
gfx.FillRectangle(brush, 0, 0, 600, 800);
}

Môžete si všimnúť, že som použil using, čo je dobrá prax, pretože automaticky likviduje objekty.

Teraz všetko, čo musíte urobiť (musíte to urobiť pre obe riešenia vrátane spracovania udalosti paint) je volať Invalidate() vo vašom tlačidle kliknite na udalosť a nastavte vlastnosť, ktorá povie metóde farby, že sa volá, pretože sa stlačilo tlačidlo:

private void Form1_Paint(object sender, PaintEventArgs e)
{
if (!_button2Pressed)
return;
using (var gfx = e.Graphics)
using (var brush = new SolidBrush(Color.FromArgb(255, 255, 0)))
gfx.FillRectangle(brush, 0, 0, 600, 800);
_button2Pressed = false;
}
private void button2_Click(object sender, EventArgs e)
{
_button2Pressed = true;
Invalidate();
}
private bool _button2Pressed;

To by malo robiť.