鼠标光标位置更改

时间:2010-11-10 08:39:32

标签: c# winforms cursor-position

您好我有一个Windows窗体应用程序,我想移动我的鼠标然后拖动将运行但我已经尝试使用mousemove鼠标事件来做它,但似乎拖拉是非常敏感的。所以我问的是是否是可以检测鼠标光标是否移动距离当前光标至少一定距离,然后它执行拖动代码。

2 个答案:

答案 0 :(得分:2)

我知道你有一个阻力&只有在鼠标移动了一定距离时才删除要执行的代码。如果是这样的话:

一旦用户执行了初始操作(鼠标按下要拖动的项目?),您可以挂钩鼠标移动事件。然后比较鼠标移动事件中的鼠标坐标,并在坐标差异高于您设置的任意值后触发“拖动代码”。

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;
    }
}

当光标移出虚拟的10x10平方时,这将执行拖放。

答案 1 :(得分:0)

我真的没有得到你的问题以及你想要实现的效果。 顺便说一句,如果我的解释是正确的,那么只有当“拖曳距离”比某个数量更多时,你才会尝试做某事。

下面的代码不使用拖放事件,而是使用mouseup,mousedown和mousemove事件。

它会跟踪按下左键时鼠标移动的距离。 当距离大于固定量时,它会更改mouseCursor(在拖动过程中)

当释放mouseButton时,如果行进的dstance大于最小偏移量,我们会执行假拖放操作。

创建一个新的Windows窗体项目,并将Form1自动生成的类替换为

下面的类

希望这有帮助。

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;

    }
}