Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

how to refresh a user control in C#

Posted on 2013-01-11
4
536 Views
Last Modified: 2013-01-12
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
Comment
Question by:jdcoburn
  • 2
  • 2
4 Comments
 
LVL 75

Accepted Solution

by:
käµfm³d   👽 earned 500 total points
ID: 38769505
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
 

Author Closing Comment

by:jdcoburn
ID: 38769906
very nicely done! i removed the delegate from the designer, so how does the system know about calling the base class (OnMouseMove)?
0
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 38770202
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
 

Author Comment

by:jdcoburn
ID: 38771099
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

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Today I had a very interesting conundrum that had to get solved quickly. Needless to say, it wasn't resolved quickly because when we needed it we were very rushed, but as soon as the conference call was over and I took a step back I saw the correct …
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question