• c#: PointToClient与PointToScreen


    起因:

    很早就见过这两个方法,却未曾深入研究,偶尔一用,却纠结于其转换方法,遂写Demo以求验证,记录认知以做备忘。

    其为Control类的内置方法,原型为:

            //
            // 摘要:
            //     将指定屏幕点的位置计算成工作区坐标。
            //
            // 参数:
            //   p:
            //     要转换的屏幕坐标 System.Drawing.Point。
            //
            // 返回结果:
            //     一个 System.Drawing.Point,它表示转换后的 System.Drawing.Point、p(以工作区坐标表示)。
            public Point PointToClient(Point p);
            //
            // 摘要:
            //     将指定工作区点的位置计算成屏幕坐标。
            //
            // 参数:
            //   p:
            //     要转换的工作区坐标 System.Drawing.Point。
            //
            // 返回结果:
            //     一个 System.Drawing.Point,它表示转换后的 System.Drawing.Point、p(以屏幕坐标表示)。
            public Point PointToScreen(Point p);

    由其可知:

    PointToClient是将Screen坐标(pt)与Control在Screen上的坐标做位置比较,返回差值,坐标中心为Control的Location在Screen中绝对位置

    PointToScreen是将坐标点(pt)与Control在Screen上的坐标做比较返回迭加值,坐标中心为屏幕左上角,即(0, 0)点

    引用其他的解说如下:

     

    PointToClient 将指定屏幕点的位置计算成工作区坐标。坐标原点为黄色区域左上角,X轴方向从左到右,Y轴方向从上到下,坐标单位为像素;

    PointToScreen 将指定工作区点的位置计算成屏幕坐标。坐标原点在屏幕左上角,X轴方向从左到右,Y轴方向从上到下,坐标单位为像素。

    写Demo如下图,分而述之。

    1、PointToClient(Point p)

    这里的p,坐标原点为Screen左上角,即(0, 0)。

    它计算以当前Control的位置在Screen位置为坐标原点,返回p相对于坐标原点的值。

    如上图例,btn在screen中位置为(328, 188),那么,screen上点(10, 10)相对于(320, 188)即为结果(-318, -178),同理screen上点(0, 0)相对于pnl来说,是(-183, -185)。

    Control在Screen上点计算方式为:窗体Location加上其各级Parent的Location。

    2、PointToScreen(Point p)

    这里的p,坐标原点相对于Control的Location。

    这是求p于Control的Locaton在Screen上点迭加结果。

    如上例,pnl相对于窗体位置为(80, 60),其加上窗体Location(200, 100),再加上边框宽度3、标题栏高度25,即得185。

    btn.PointToScreen(new Point(30, 20)): {X=358,Y=208}

    此值即为:btn在Screen上位置(328, 188)加上(30, 20)所得。

    3、获取控件在窗体中的位置

    Delphi中有,c#没有没,需要自己写,封装一静态函数实现吧:

        public static class ControlHelper
        {
            public static Point LocationOnClient(this Control c)
            {
                var retval = new Point(0, 0);
                for (; c.Parent != null; c = c.Parent)
                    retval.Offset(c.Location);
                return retval;
            }
        }

    求btn在窗体中的位置:

    lbl.Text = btn.LocationOnClient().ToString();    //{X=125, Y=63}

    参考资料:

    Control.PointToClient 方法 (Point)

    Control.PointToScreen 方法 (Point)

  • 相关阅读:
    [文档].Altera 可选择的Nios II的Boot方法
    [原创].关于使用QII 10.0编译器无法编辑和查看中文的问题一个变通解决方案
    判断某程序是64位还是32位
    在调用RestoreSPSite时指定ContentDatabase
    CAML join
    ADODB.Connection Invalid connection error
    Sharepoint 如何修改Web.Config文件
    ActivateOnDefault & AutoActivateInCentralAdmin feature 属性
    Sharepoint 2010 解决DFWP Unable to display this Web Part 的问题
    Powershell点滴
  • 原文地址:https://www.cnblogs.com/crwy/p/9285463.html
Copyright © 2020-2023  润新知