pumphandle
pumphandle

Reputation: 33

Mouse Cursor position changes

Hi I have a windows form application which i want to move my mouse then dragdrop will function but i have tried using mousemove mouse event to do it , but seems like dragdrop is very sensitive.So what i'm asking is whether is it possible to detect if the mouse cursor moves at least a certain distance away from the current cursor then it does the dragdrop code.

Upvotes: 3

Views: 10787

Answers (2)

vaitrafra
vaitrafra

Reputation: 662

I do not really get your question and the effect you are trying to acheive. BTW, if my interpretation is correct, you oare trying to do something only if the "drag distance" is grather than a certain amount.

this code below do not use the drag&drop event, but the mouseup, mousedown and mousemove events.

It keeps track of the distance the mouse travels while the left button is pressed. When the distance is grater than a fixed amount, it changes the mouseCursor(during the dragaction)

When the mouseButton is released, if the dstance traveled is greater than the minimum offset, we perform our fake drop action.

Create a new windows form project and substitute the Form1 autogenerated Class with the one below

Hope this helps.

public partial class Form1 : Form
{
    private bool isDragging;            //We use this to keep track that we are FakeDragging
    private Point startPosition;        //The start position of our "Fake" dragging action
    private double dragDistance = 0;    //The distance(absolute) from the drag action starting point    
    private const int MINIMUM_DRAG_DISTANCE = 100;  //minimum FakeDrag distance.

    private Label label1 = new Label();


    public Form1()
    {
        #region Support form generation code
            InitializeComponent();
            this.label1 = new System.Windows.Forms.Label();
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(54, 242);
            this.label1.Name = "Distance:";
            this.label1.Size = new System.Drawing.Size(35, 13);

            this.Controls.Add(label1);

            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
        #endregion
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        //if the mouse button is pressed then 
        //there's the chanche a dragAction
        //is being performed and we take note
        //of the position of the click
        //(we will use this later on the mouseMove event
        //to calculate the distance mouse has traveled
        if (e.Button.Equals(MouseButtons.Left))
            startPosition = e.Location;
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        ///at the mouse up event we can execute code that does something
        if (isDragging && dragDistance > MINIMUM_DRAG_DISTANCE)
        {
            MessageBox.Show("we have fakedragged!\nDo something useful here");
            //Do your Drag & Drop code here.
        }

        ///but WE MUST signal our system that the Fake Drag has ended
        ///and reset our support variables.
        this.Cursor = Cursors.Default;
        isDragging = false;
        dragDistance = 0;
    }


    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        ///when the mouse moves we control if the mouse button is still pressed.
        ///if it is so, we surely are FakeDragging and we set our boolean to true
        ///(it will be useful in the mouseUP event).
        ///Then we calculate the absolute distance the mouse has traveld since the
        ///user has pressed the left mouseButton.


        Point currentPosition = e.Location;
        if (e.Button.Equals(MouseButtons.Left))
        {
            isDragging = true;
            dragDistance =
                Math.Abs(
                    Math.Sqrt(
                        (
                            Math.Pow(
                                (currentPosition.X - startPosition.X), 2)
                        +
                            Math.Pow(
                                (currentPosition.Y - startPosition.Y), 2)
                        )));
        }

        //we set the label text displaying the distance we just calculated
        label1.Text = 
            String.Format(
                "Distance: {0}", 
                dragDistance.ToString());

        Application.DoEvents();


        ///At last, if the distance il greater than our offset, we change the 
        ///mouse cursor(this is not required in a real case scenario)
        if (dragDistance > MINIMUM_DRAG_DISTANCE)
            this.Cursor = Cursors.Hand;
        else
            this.Cursor = Cursors.Default;

    }
}

Upvotes: 0

Jla
Jla

Reputation: 11384

I understand you have a drag & drop code you want to execute only if the mouse has moved a certain distance. If so:

You can hook to the mouse move event once the user has performed the initial action (mouse down on the item to drag ?). Then compare the mouse coordinates on the mouse move event and trigger the "dragdrop code" once the coordinates difference is higher then the arbitrary value you set.

private int difference = 10;
private int xPosition;
private int yPosition;

private void item_MouseDown(object sender, MouseEventArgs e) 
{
    this.MouseMove += new MouseEventHandler(Form_MouseMove);
    xPosition = e.X;
    yPosition = e.Y;
}

private void Form_MouseMove(object sender, MouseEventArgs e) 
{
    if (e.X < xPosition - difference
        || e.X > xPosition + difference
        || e.Y < yPosition - difference
        || e.Y > yPosition + difference) 
    {
        //Execute "dragdrop" code
        this.MouseMove -= Form_MouseMove;
    }
}

This would execute dragdrop when the cursor moves out of a virtual 10x10 square.

Upvotes: 3

Related Questions