即使单击另一个控件,如何获得鼠标相对于表单的X,Y位置?

时间:2010-10-04 02:10:41

标签: c# winforms

目前我在表格上的mousedown会给我一个标签上的x,y线。这个标签虽然当我点击它时,我没有收到mousedown。但是当我将代码放入标签的mousedown时,它会根据标签的来源而不是整个表单来提供线索。

我的目标是能够在表单中的任何位置检测x,y。即使它在标签上,按钮。

提前致谢。

5 个答案:

答案 0 :(得分:5)

似乎有点黑客但是......

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        foreach (Control c in this.Controls)
        {
            c.MouseDown += ShowMouseDown;    
        }

        this.MouseDown += (s, e) => { this.label1.Text = e.X + " " + e.Y; };

    }

    private void ShowMouseDown(object sender, MouseEventArgs e)
    {
        var x = e.X + ((Control)sender).Left;
        var y = e.Y + ((Control)sender).Top;

        this.label1.Text = x + " " + y;
    }
}

答案 1 :(得分:3)

protected override void OnMouseMove(MouseEventArgs mouseEv) 
{ 
    txtBoxX.Text = mouseEv.X.ToString(); 
    txtBoxY.Text = mouseEv.Y.ToString(); 
} 

答案 2 :(得分:3)

你可以在每个控件的表单上获得这样的位置this.PointToClient(Cursor.Position)。

答案 3 :(得分:2)

您可以按this.Location进行调整 或在表格和每个控件上使用this.PointToClient(Cursor.Position)

答案 4 :(得分:2)

我意识到这是不久之前,但我认为它可能对某人有所帮助。我认为解决这个问题的方法是递归的:

public partial class Form1 : Form
{

public Form1()
{
    InitializeComponent();
    label1.MouseDown += MyMouseDown;
}

void MyMouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)//If it's left button that's the trigger
    {
        Control c = (Control)sender;
        if (c.Parent == null) return;//Has no more children, wrong condition?
        if(c.Parent != this)//We've reached top level
        {
            MyMouseDown(c.Parent, new MouseEventArgs(e.Button, 
                 e.Clicks, 
                 c.Parent.Location.X + e.X, 
                 c.Parent.Location.Y + e.Y, 
                 e.Delta));
            return;
         }
         //Do what shall be done here...
     }
}
}