Search code examples
.netwinformsgraphicsgdi+graphics2d

Highlighting a panel area


I have a VB.NET WinForms application. I am drawing a bunch of shapes on a panel programmatically with GDI+. Now I want to hightlight a small rectangular portion of that panel in some way. The highlighted area will move around a lot. I don't want to redraw the whole panel, because there is too much processing involved and it causes flicker. What it the best way to do this?

Thanks.


Solution

  • Can you add a transparent panel as a child of your existing panel (and dock it), and then do your highlights on the transparent panel?

    Here's a very rudimentary example:

    public partial class Form1 : Form
    {
        private Panel pan = new Panel();
        private Panel trans = new Panel();
    
        private bool clicked { get; set; }
        private Point mouse { get; set; }
    
        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
        }
    
        public void Form1_Load(object sender, EventArgs e)
        {
            pan.Dock = DockStyle.Fill;
            pan.BackColor = Color.White;
    
            trans.Dock = DockStyle.Fill;
            trans.BackColor = Color.FromArgb(0, 0, 0, 0);
    
            pan.Paint += new PaintEventHandler(DrawSomeShapes);
            trans.MouseClick += new MouseEventHandler(trans_MouseClick);
            trans.Paint += new PaintEventHandler(DrawHighlight);
    
            pan.Controls.Add(trans);
            this.Controls.Add(pan);
    
            trans.BringToFront();
        }
    
        public void DrawSomeShapes(object sender, PaintEventArgs e)
        {
            var g = e.Graphics;
    
            var p = new Pen(Color.Black, 1F);
            g.DrawRectangle(p, new Rectangle(0, 0, 100, 100));
            g.DrawRectangle(p, new Rectangle(20, 20, 50, 50));
            g.DrawRectangle(p, new Rectangle(10, 50, 100, 25));
            g.DrawRectangle(new Pen(Color.Red, 1F), new Rectangle(new Point(50, 50), new Size(50, 50)));
        }
    
        public void DrawHighlight(object sender, PaintEventArgs e)
        {
            if (clicked)
            {
                var g = e.Graphics;
                var b = new SolidBrush(Color.FromArgb(50, 50, 50, 50));
                g.FillRectangle(b, mouse.X, mouse.Y, 50, 50);
    
                clicked = false;
            }
        }
    
        public void trans_MouseClick(object sender, MouseEventArgs e)
        {
            mouse = e.Location;
            trans.Invalidate();
            clicked = true;
        }
    }