Samozřejmě i zde se mi prokázalo že méně je někdy více a že na to co potřebuji stačí jen několik málo příkazů. Konkrétně je třeba dodržet tyto zásady:
- Malovat zásadně v události Paint prvku PictureBox, protože pouze tam máte grafický kontext, který funguje
- Neukládat vytvořený obrázek do PB, stačí vytvořit Grafický kontext (objekt typu Graphics) z obrázku v PB a o zbytek se postarají reference uvnitř objektu. Navíc já zde používám 2 PB a z nějakého důvodu když jsem toto udělal tak se mi odmítal načíst jiný obrázek do PB1(PB2 byl ten, který jsem obkresloval).
- Zmenšit obrázek do PB na velikost PB – jinak vám obkreslí celý obrázek když například používáte v PB SizeMode Zoom a obrázek se přizpůsobuje velikosti PB a uvidíte jen levý a horní okraj. Stejně tak kdyby byl obrázek menší než PB, neměli byste obkreslený celý PB.
No a teď na samotný kód. Celé to spočívá v těchto pár řádcích:
CODEvoid pictureBox2_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
VymalujOkraj(g);
}
private void VymalujOkraj(Graphics g)
{
if (pictureBox2.Image != null)
{
Pen p = new Pen(Color.Blue);
p.Width = 5;
//-Tyto hodnoty jsou implicitni, neni potreba nastavovat
//p.PenType = PenType.SolidColor;
//p.Alignment = PenAlignment.Inset;
//p.Brush = Brushes.Blue;
Image img = null;
img = pictureBox2.Image;
g.DrawImage(img, new Point(0, 0));
g.DrawRectangle(p, new Rectangle(0, 0, pictureBox2.Image.Width, pictureBox2.Image.Height));
Bitmap bmpOutput = new Bitmap(pictureBox2.Image.Width, pictureBox2.Image.Height, g);
//-Zlikvidujeme nepotrebne objekty a uvolnime tak prostredky
p.Dispose();
//-Toto se nelikviduje, protoze pak program zahlasi vyjimku "ArgumentException"
//g.Dispose();
//-Toto nikdy nedelej, nebot pak nefunguje zase neco jineho - v mem pripade PB1
//pictureBox2.Image = bmpOutput;
}
}
