目前我在表格上的mousedown会给我一个标签上的x,y线。这个标签虽然当我点击它时,我没有收到mousedown。但是当我将代码放入标签的mousedown时,它会根据标签的来源而不是整个表单来提供线索。
我的目标是能够在表单中的任何位置检测x,y。即使它在标签上,按钮。
提前致谢。
答案 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...
}
}
}