Jak zakreslit rámeček okolo obrázku v PictureBox

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:

  1. Malovat zásadně v události Paint prvku PictureBox, protože pouze tam máte grafický kontext, který funguje
  2. 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).
  3. 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;
    }
}

A výsledek pak vypadá takto:

Vykresleny ramecek okolo obrazku

Leave a Reply

Your email address will not be published. Required fields are marked *