通过PictureBox在C#中获取鼠标位置

时间:2014-07-04 22:58:48

标签: c# forms

标题中简要陈述的问题已经听起来很糟糕。无论如何,我一直试图在C#表单应用程序上抓取鼠标坐标,使用OnMouseMove内置函数非常简单。问题是当表单应用程序中有一个图片框时,函数无法获取坐标,因为没有选择图片框窗口!我的意思是光标不是指向被图片框窗口阻挡的部分!

我也尝试使用

private void drawbox_MouseUp(object sender, MouseEventArgs e)
{
    x2 = e.X;
    y2 = e.Y;
    label6.Location = new Point(x2, y2);
    base.OnMouseMove(e);
}

但没有运气。

我查找了这个问题,但我找不到修复方法。请帮忙。

为了您的信息,我使用以下函数来获取鼠标坐标:

protected override void OnMouseMove( MouseEventArgs e)
{
    x2 =e.X;
    y2 = e.Y;
    label6.Location = new Point(x2, y2);
    base.OnMouseMove(e);
    //base.OnMouseMove(e);
}

3 个答案:

答案 0 :(得分:0)

我建议您使用API​​调用 - 我在一段时间内在可重用的类中实现了以下代码,并且它运行良好。

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetCursorPos(ref System.Drawing.Point lpPoint);

    public static System.Drawing.Point GetCursorPosition()
    {
        System.Drawing.Point p = new System.Drawing.Point(0, 0);
        GetCursorPos(ref p);
        return p;
    }

这样称呼:

    Point p = GetCursorPos();

这应该给出相对于表单的位置。如果您想要图片框位置,请将框的顶部和左侧坐标添加到p(分别)的X和Y坐标。

编辑:调用错误。

编辑2:对于无法在PictureBox上捕获鼠标位置的问题,只需将PictureBox的MouseMove事件转发到表单。

在设计器中选择PictureBox,然后打开Events(闪电)。在MouseMove旁边的空框中单击一次,然后单击:

  1. 双击以创建处理程序方法,并从那里调用OnMouseMove方法

    或者

  2. 将OnMouseMove方法更改为具有此签名:

    private void OnMouseMove(object sender, MouseEventArgs e)
    

答案 1 :(得分:0)

我认为这会对你有所帮助。我将信息放在this.Text上仅供演示:

        private void drawbox_MouseMove(object sender, MouseEventArgs e)
        {

            Point p = e.Location;
            Point formpoint = PointToClient(MousePosition);

            this.Text = formpoint.ToString() + " - " + p.ToString();
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            this.Text = e.Location.ToString();
        }

答案 2 :(得分:0)

@christophos 这是我的整个代码,没那么久。我写了它用于测试,遗憾的是仍然“label6”没有移动到我的图片框“drawbox”。这是我最初做过的,如果没有图片框,它可以很好地工作。

public partial class Form1 : Form
{
    Graphics drawingarea;
    int x1, y1,x2,y2 = 0;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool GetCursorPos(ref Point lpPoint);


    public Form1()
    {
        InitializeComponent();
        drawingarea = drawbox.CreateGraphics();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Pen blackpen = new Pen(Color.Black);
        x1 = Convert.ToInt32(textBox1.Text);
        y1 = Convert.ToInt32(textBox2.Text);
        //x2 = Convert.ToInt32(textBox3.Text);
        //y2 = Convert.ToInt32(textBox4.Text);
        drawingarea.DrawLine(blackpen, x1, y1, x2, y2);
    }

    protected override void OnMouseMove( MouseEventArgs e)
    {
        Point p = GetCursorPosition();
        x2 = p.X;
        y2 = p.Y;
        label6.Location = new Point(x2, y2);
        base.OnMouseMove(e);
    }
    public static Point GetCursorPosition()
    {
        Point p = new System.Drawing.Point(0, 0);
        GetCursorPos(ref p);
        return p;
        }
}