Search code examples
c#winformsgraphicspath

Redraw Graphics Path when mouseMoved


I' ve drawn roundRectangle using Graphics Path OnPaintEvent and I already added mouseevent to know if cursor was over the g.p .

void Round_MouseMove(object sender, MouseEventArgs e)
        {
          Point mousePt = new Point(e.X, e.Y);
          if (_path != null)
             if (_path.IsVisible(e.Location))
                MessageBox.Show("GraphicsPath has been hovered!");
        }

Question: is there a way to resize or redraw(hide previous then draw new) a graphicsPath runtime?


Solution

  • Invoke Invalidate for redrawn the Form, so the OnPaint(PaintEventArgs e) will be executed.

    Check the following example:

    public sealed partial class GraphicsPathForm : Form
    {
        private bool _graphicsPathIsVisible;
    
        private readonly Pen _pen = new Pen(Color.Red, 2);
        private readonly Brush _brush = new SolidBrush(Color.FromArgb(249, 214, 214));
        private readonly GraphicsPath _graphicsPath = new GraphicsPath();
        private Rectangle _rectangle = new Rectangle(10, 30, 100, 100);
    
        public GraphicsPathForm()
        {
            InitializeComponent();
    
            _graphicsPath.AddRectangle(_rectangle);
        }
    
    
        protected override void OnPaint(PaintEventArgs e)
        {
            var g = e.Graphics;
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.InterpolationMode = InterpolationMode.Bilinear;
            g.SmoothingMode = SmoothingMode.AntiAlias;
    
            g.DrawPath(_pen, _graphicsPath);
    
            if (_graphicsPathIsVisible)
                g.FillPath(_brush, _graphicsPath);
    
    
            base.OnPaint(e);
        }
    
        protected override void OnMouseMove(MouseEventArgs e)
        {
            var isVisible = _graphicsPath.IsVisible(e.Location);
    
            if (isVisible == _graphicsPathIsVisible)
                return;
    
            const int zoom = 5;
    
            if (isVisible)
            {
                if (!_graphicsPathIsVisible)
                {
                    _rectangle.Inflate(zoom, zoom);
                    _graphicsPath.Reset();
                    _graphicsPath.AddRectangle(_rectangle);
                }
            }
            else
            {
                if (_graphicsPathIsVisible)
                {
                    _rectangle.Inflate(-zoom, -zoom);
                    _graphicsPath.Reset();
                    _graphicsPath.AddRectangle(_rectangle);
                }
            }
    
            _graphicsPathIsVisible = isVisible;
            Invalidate();
    
            base.OnMouseMove(e);
        }
    }
    

    I hope it helps.