标题中简要陈述的问题已经听起来很糟糕。无论如何,我一直试图在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);
}
答案 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旁边的空框中单击一次,然后单击:
双击以创建处理程序方法,并从那里调用OnMouseMove方法
或者
将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;
}
}