在C# WinForms应用程序中,屏幕坐标和画布坐标之间的转换是非常常见的需求,尤其是在处理鼠标事件、绘图或布局调整时。屏幕坐标是以屏幕左上角为原点的坐标系,而画布坐标(或控件坐标)是以某个控件(如Form或Panel)的左上角为原点的坐标系。
常用方法
1. 将屏幕坐标转换为控件坐标
使用 Control.PointToClient
方法可以将屏幕坐标转换为相对于指定控件的坐标。
Csharp
深色版本
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
// 获取鼠标在屏幕上的坐标
Point screenPoint = Control.MousePosition;
// 将屏幕坐标转换为相对于Form的坐标
Point clientPoint = this.PointToClient(screenPoint);
// 输出转换后的坐标
Console.WriteLine($"Screen: {screenPoint}, Client: {clientPoint}");
}
2. 将控件坐标转换为屏幕坐标
使用 Control.PointToScreen
方法可以将相对于控件的坐标转换为屏幕坐标。
Csharp
深色版本
private void Form1_Paint(object sender, PaintEventArgs e)
{
// 绘制一个点在Form的(100, 100)位置
Point clientPoint = new Point(100, 100);
e.Graphics.DrawEllipse(Pens.Red, clientPoint.X - 2, clientPoint.Y - 2, 4, 4);
// 将Form的(100, 100)位置转换为屏幕坐标
Point screenPoint = this.PointToScreen(clientPoint);
// 输出转换后的坐标
Console.WriteLine($"Client: {clientPoint}, Screen: {screenPoint}");
}
示例:在Panel中绘制并转换坐标
假设你有一个Panel控件,你希望在Panel中绘制一个点,并在鼠标移动时显示该点在屏幕和Panel中的坐标。
Csharp
深色版本
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
panel1.Paint += Panel1_Paint;
panel1.MouseMove += Panel1_MouseMove;
}
private void Panel1_Paint(object sender, PaintEventArgs e)
{
// 在Panel的(50, 50)位置绘制一个点
Point clientPoint = new Point(50, 50);
e.Graphics.DrawEllipse(Pens.Blue, clientPoint.X - 2, clientPoint.Y - 2, 4, 4);
// 将Panel的(50, 50)位置转换为屏幕坐标
Point screenPoint = panel1.PointToScreen(clientPoint);
// 输出转换后的坐标
Console.WriteLine($"Panel Client: {clientPoint}, Screen: {screenPoint}");
}
private void Panel1_MouseMove(object sender, MouseEventArgs e)
{
// 获取鼠标在Panel中的坐标
Point clientPoint = e.Location;
// 将Panel中的坐标转换为屏幕坐标
Point screenPoint = panel1.PointToScreen(clientPoint);
// 输出转换后的坐标
Console.WriteLine($"Panel Client: {clientPoint}, Screen: {screenPoint}");
}
}
总结
Control.PointToClient
方法用于将屏幕坐标转换为相对于控件的坐标。Control.PointToScreen
方法用于将相对于控件的坐标转换为屏幕坐标。