Samozrejme i zde se mi prokazalo ze mene je nekdy vice a ze na to co potrebuji staci jen nekolik malo prikazu. Konkretne je treba dodrzet tyto zasady:
- Malovat zasadne v udalosti Paint prvku PictureBox, protoze pouze tam mate graficky kontext, ktery funguje
- Neukladat vytvoreny obrazek do PB, staci vytvorit Graficky kontext (objekt typu Graphics) z obrazku v PB a o zbytek se postaraji reference uvnitr objektu. Navic ja zde pouzivam 2 PB a z nejakeho duvodu kdyz jsem toto udelal tak se mi odmital nacist jiny obrazek do PB1(PB2 byl ten, ktery jsem obkresloval).
- Zmensit obrazek do PB na velikost PB – jinak vam obkresli cely obrazek kdyz napriklad pouzivate v PB SizeMode Zoom a obrazek se prispusobuje velikosti PB a uvidite jen levy a horni okraj. Stejne tak kdyby byl obrazek mensi nez PB, nemeli byste obkresleny cely PB.
No a ted na samotny kod. Cele to spociva v techto par radcich:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
void 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; } } |