Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 556
  • Last Modified:

how to refresh a user control in C#

hi - I'm using VS2010 and C#.
I have a user control on a windows form that i want to change its location. I can manage the logic to do that with the logic below. But as i drag it across the screen, it repaints at very noticable intervals, creating a "shadow" effect as it moves. i assume that it's repainting without "erasing" and every incremental move causes the new image to overlay before the old one is cancelled. how would i avoid the effect?

 private void DisplayScriptVarConstCtl_MouseDown(object sender, MouseEventArgs e)
        {
            deltaX = this.Location.X - e.X;
            deltaY = this.Location.Y - e.Y;
            mouseIn = true;
        }

        private void DisplayScriptVarConstCtl_MouseMove(object sender, MouseEventArgs e)
        {
            if (mouseIn)
            {
               
                this.Location = new Point(deltaX + e.X, deltaY + e.Y);
                this.Refresh();

            }
        }

        private void DisplayScriptVarConstCtl_MouseUp(object sender, MouseEventArgs e)
        {
           
            mouseIn = false;
        }
thanks,
Jim
0
jdcoburn
Asked:
jdcoburn
  • 2
  • 2
1 Solution
 
käµfm³d 👽Commented:
I think you can simplify the code to:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace _27993068
{
    public partial class DisplayScriptVarConstCtl : UserControl
    {
        private int deltaX;
        private int deltaY;

        public DisplayScriptVarConstCtl()
        {
            InitializeComponent();
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            deltaX = (int)Math.Max(0, e.X - this.Location.X);
            deltaY = (int)Math.Max(0, e.Y - this.Location.Y);

            base.OnMouseDown(e);
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                this.Location = new Point(this.Location.X + (e.X - deltaX), this.Location.Y + (e.Y - deltaY));
                this.Invalidate();
            }

            base.OnMouseMove(e);
        }
    }
}

Open in new window

0
 
jdcoburnAuthor Commented:
very nicely done! i removed the delegate from the designer, so how does the system know about calling the base class (OnMouseMove)?
0
 
käµfm³d 👽Commented:
You're overriding the default behavior of the control in the above example. Whatever you don't override happens automatically. This is why each override calls the base version of the method--to ensure the "automatic" behavior still occurs.

One thing to note:  I got the impression that you had your original code within the control's code. The "problem" with that is that event handlers are really more for things outside of the control rather than inside of it. Think about it:  When you add a button to your form, where does the Click handler get generated? This is why I added the overridden methods.
0
 
jdcoburnAuthor Commented:
ok - thanks. I had originally had the handler outside the control's code, but that introduced other problems. and of course you're right about the override. i don't do mouse based stuff very often and it's useful to be reminded of some of the behavior..
Jim
0

Featured Post

NFR key for Veeam Backup for Microsoft Office 365

Veeam is happy to provide a free NFR license (for 1 year, up to 10 users). This license allows for the non‑production use of Veeam Backup for Microsoft Office 365 in your home lab without any feature limitations.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now