Improve company productivity with a Business Account.Sign Up

x
?
Solved

how to refresh a user control in C#

Posted on 2013-01-11
4
Medium Priority
?
567 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 2000 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.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
When you have multiple client accounts to manage, it often feels like there aren’t enough hours in the day. With too many applications to juggle, you can’t focus on your clients, much less your growing to-do list. But that doesn’t have to be the cas…
Watch the working video to know how to import Outlook PST/OST files to Amazon WorkMail. Kernel released this tool which is very easy to use and migrate single or multiple PST and OST files to Amazon WorkMail. To know more about Kernel Import PST to …

606 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