我对这段代码有问题,试图将光标移动到只有分辨率为我的面板上的坐标内(面板尺寸为640x480)。但是当按下按钮移动光标时,光标离开并停留在屏幕的左上角,我该如何更改呢?
我了解了这一点,并且可以使用poinToScreen
或poinToClient
来完成我想要的操作,但无论如何光标都不能离开
代码从文本文件获取坐标,所以我给坐标进行测试。
357
336
338
343
357
263
257
246
276
124
133
131
127
107
76
-88
-90
-105
public void cursor_track_Click(object sender, EventArgs e)
{
List<string> linesX = File.ReadLines(@"C:\EyeMatris\Coord\CoordinatesX.txt").ToList();
List<string> linesY = File.ReadLines(@"C:\EyeMatris\Coord\CoordinatesY.txt").ToList();
List<Point> points = new List<Point>();
for(int i = 0; i< linesX.Count; i++)
{
Point p = new Point(int.Parse(linesX[i]), int.Parse(linesY[i]));
points.Add(p);
}
foreach (var point in points) {
resolution.PointToScreen(Cursor.Position = new Point(point.X, point.Y));
}
}
更新
添加了一个观看动画的计时器
添加了LarsTech的线路代码答案
Timer tt = null;
int index = 0;
public void cursor_track_Click(object sender, EventArgs e)
{
List<string> linesX = File.ReadLines(@"C:\EyeMatris\Coord\CoordinateX.txt").ToList();
List<string> linesY = File.ReadLines(@"C:\EyeMatris\Coord\CoordinateY.txt").ToList();
List<Point> points = new List<Point>();
index = 0;
tt = new Timer()
{ Interval = 500, Enabled = true };
tt.Tick += (ss, ee) =>
{
for (int i = 0; i < linesX.Count; i++)
{
Point p = new Point(int.Parse(linesX[i]), int.Parse(linesY[i]));
points.Add(p);
}
foreach (var point in points)
{
//Cursor.Position = new Point(point.X, point.Y);
Cursor.Position = resolution.PointToScreen(point);
tt.Stop();
}
};
}
答案 0 :(得分:2)
PointToXXX函数返回一个转换的点。它不会设置光标位置。像这样尝试:
Cursor.Position = resolution.PointToScreen(point);
您可能必须使用计时器来制作动画。
根据您的代码进行更新,您的Tick代码应如下所示:
tt.Tick += (ss, ee) => {
if (index > linesX.Count - 1) {
tt.Stop();
} else {
Point p = new Point(int.Parse(linesX[index]), int.Parse(linesY[index]));
Cursor.Position = resolution.PointToScreen(p);
}
index++;
}
在进行任何其他工作之前,最好将文件坐标加载并转换为点列表。您的某些坐标为负数,因此它们可能会出现在屏幕外。计时器运行时应禁用按钮,以免用户在进行动画处理时再次单击它。