C#winform控件的各种坐标获取

一、窗体

  • 绿色边框框住的区域:屏幕
  • 橙色边框框住的区域:窗体
  • 黄色边框框住的区域:窗体工作区

1.边框 

 窗体的FormBorderStyle可以设置以下的值,每个值导致窗体的边框的宽度不一样,但是可以发现的是左、右、下边框的宽度是一样的:

    //
    // 摘要:
    //     指定窗体的边框样式。
    [ComVisible(true)]
    public enum FormBorderStyle
    {
        //
        // 摘要:
        //     无边框。
        None = 0,
        //
        // 摘要:
        //     固定的单线边框。
        FixedSingle = 1,
        //
        // 摘要:
        //     固定的三维边框。
        Fixed3D = 2,
        //
        // 摘要:
        //     粗、 固定的对话框样式边框。
        FixedDialog = 3,
        //
        // 摘要:
        //     可调整大小的边框。
        Sizable = 4,
        //
        // 摘要:
        //     不是可调整大小工具窗口边框。 在任务栏中或在用户按 ALT + TAB 时出现的窗口中未显示工具窗口。 虽然窗体,用于指定 System.Windows.Forms.FormBorderStyle.FixedToolWindow
        //     通常不显示在任务栏中,您必须确保 System.Windows.Forms.Form.ShowInTaskbar 属性设置为 false, ,因为其默认值是
        //     true。
        FixedToolWindow = 5,
        //
        // 摘要:
        //     可调整大小的工具窗口边界。 在任务栏中或在用户按 ALT + TAB 时出现的窗口中未显示工具窗口。
        SizableToolWindow = 6
    }

     可以通过ClientSize获取工作区的大小,即窗体除边框外的大小

Size clientSize = this.ClientSize;   //获取窗体工作区的大小
int left = (this.Size.Width - clientSize.Width) / 2;   //左右的边框长度
int top = (this.Size.Height - clientSize.Height) - left;  //下边框和左右边框长度一样

    各窗体模式下的边框宽度如下: 

 

2.坐标 

窗体的坐标,即Location属性,是窗体左上角(不是工作区的左上角)相对于屏幕而言的。屏幕左上角是原点,原点往右为X的正方向,往下为Y的正方向。

二、相对坐标

1.PointToClient 

将指定屏幕点的位置计算成工作区坐标

Control.PointToClient(p2);

 p2坐标是相对于屏幕,即屏幕左上角原点(0,0)的坐标;假如Control相对于屏幕原点的坐标为 p1;Control.PointToClient(p2) 的结果为 p2 - p1。即以p1为原点时p2的坐标(坐标系和窗体的一致)

PS:如果Control为Form时,p1为Form工作区相对于原点的坐标,而不是Location。 

2.PointToScreen 

将指定工作区点的位置计算成屏幕坐标

Control.PointToScreen(p2);

p2坐标是相对于屏幕,即屏幕左上角原点(0,0)的坐标;假如Control相对于屏幕原点的坐标为 p1;Control.PointToScreen(p2) 的结果为 p2 + p1。即以屏幕原点为原点p1和p2的叠加

PS: 如果Control为Form时,p1为Form工作区相对于原点的坐标,而不是Location。 

三、获取坐标 

 1.相对于屏幕

Control.PointToScreen(new Point(0,0));    //获取控件相对于屏幕原点的绝对坐标

PS:如果Control为Form时,是指工作区相对于屏幕的坐标。Form相对于屏幕的坐标就是Location

2.相对于控件

//Control1相对于Control2的坐标
Control2.PointToClient(Control1.PointToScreen(new Point(0,0))); 

3.相对于窗体 

Control.FindForm().PointToClient(Control.PointToScreen(new Point(0,0))); 

 

posted @ 2022-04-12 22:46  Bridgebug  阅读(1990)  评论(0编辑  收藏  举报