起因:

很早就见过这两个方法,却未曾深入研究,偶尔一用,却纠结于其转换方法,遂写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(, );
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)

c#: PointToClient与PointToScreen的更多相关文章

  1. ToolStrip控件在窗体没有焦点的情况下,需要单击二次才能够激发事件的解决办法

    protected override void WndProc(ref Message m) { if (m.Msg == 0x210) { Control control = Control.Fro ...

  2. C# 坐标系

    C#坐标系 一.概述 从数学角度讲,Point是一个二维矢量,包含两个公共整型属性,属性用大写X和Y(c#中公共属性一般约定以大写字母开头).当坐标不是整数值是float时,用PointF代替Poin ...

  3. c# winform 中的坐标系

    从数学角度讲,Point是一个二维矢量,包含两个公共整型属性,属性用大写X和Y(c#中公共属性一般约定以大写字母开头).当坐标不是整数值是float时,用PointF代替Point使用. 常用的Siz ...

  4. C# PointToScreen

    子窗体定位时,如果主窗口不在左上角,需要根据主窗口的坐标,相减才行. Point p1 = Label.PointToScreen(new Point(0, 0)); p1.X -= this.X; ...

  5. 关于窗体跟随与 PointToScreen

    今日写一段测试代码,实现的功能是,当一个输入框获得焦点时,某个帮助窗体跟随在其下方显示.代码很简单,本来没有什么值得一提的.但实验的时候发现,有些控件能较好地跟随,但有些不能,而且距离十分远. 主要代 ...

  6. WinForm中MouseEnter和MouseLeave混乱的问题

    MouseEnter+MouseLeave不行,我用了MouseMove+MouseLeave,效果一样 最近做个聊天的系统,仿照qq的界面设计,像qq聊天界面中字体.表情.截图等图片,鼠标放上去显示 ...

  7. Microsoft Win32 to Microsoft .NET Framework API Map

    Microsoft Win32 to Microsoft .NET Framework API Map .NET Development (General) Technical Articles   ...

  8. combobox 属性、事件、方法

    一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...

  9. Fiddler源代码分享

    frmViewer.cs: namespace Fiddler{    using Microsoft.Win32;    using System;    using System.Collecti ...

随机推荐

  1. day07-多表查询

    本节重点: 多表连接查询 符合条件连接查询 子查询 准备工作:准备两张表,部门表(department).员工表(employee) create table department( id int, ...

  2. 使用PHP的反射Reflection获取对象信息

    PHP5添加了一项新的功能:Reflection.这个功能使得程序员可以reverse-engineer class, interface,function,method and extension. ...

  3. vc/vs开发的应用程序添加dump崩溃日志<转>

    原贴地址:https://blog.csdn.net/wangkui1331/article/details/78029940 vc/vs开发的应用程序出现崩溃的时候,由于没有任何记录,导致开发人员很 ...

  4. js 选项卡制作

    知识回顾,制作JS选项卡,仅供参考 html代码: <!DOCTYPE html> <html lang="en"> <head> <me ...

  5. 尚硅谷redis学习3-redis启动以后的杂项

    redis速度很快,运行benchmark可以看出,各项运行速度可达100000次每秒 redis默认有16个数据库,分别是0, 1 ... 15,默认在0号库,可以通过select num转到其它库 ...

  6. 处于ESTABLISHED 状态的socket 却没有进程信息

    接<一次docker中的nginx进程响应慢问题定位记录> 在排查这个问题的时候,我先使用netstat 去查看,看到底是内核协议栈的连接请求没给到进程,还是进程accept链路慢了,或者 ...

  7. The iOS 7 Design Cheat Sheet

    http://ivomynttinen.com/blog/the-ios-7-design-cheat-sheet/

  8. MVC 中Controller返回值类型ActionResult

    下面列举Asp.net MVC中Controller中的ActionResult返回类型 1.返回ViewResult视图结果,将视图呈现给网页 public ActionResult About() ...

  9. python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)

    一.类 先看一段代码: class Person: animal = '高级动物' walk_way = '直立行走' # 静态属性,静态变量,静态字段 language = '语言' def __i ...

  10. JAVA语言 第四周

    oh my god! 说实话,上周的目标没有完成. 这一周过的太随便了,比刚放假时候的热情减少的太多了. 具体干了啥,就不说了吧.好像什么完整的事都没有干~~~~~ 不过一直在完善代码,已经能实现部分 ...