Bootstrap

C# Winform 屏幕和画布坐标转换

在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 方法用于将相对于控件的坐标转换为屏幕坐标。
;