当前位置: 首页 > news >正文

C#把图片放到picturebox上的指定位置,PointToClient与PointToScreen解读

1、C#中如何把图片放到picturebox上的指定位置

构造一个跟picturebox1一样大小的Bitmap,
设置给picturebox1,
然后在上面画图

Bitmap image = new Bitmap(picturebox1.Size.Width, picturebox1.Size.Height);
Graphics device = Graphics.FromImage(image);
//如果picturebox1本身有内容,就先画到image上
device.DrawImage(picturebox2.Image, w, h); //用你想要的位置画picturebox2
picturebox1.Image = image;

2、PointToClient与PointToScreen

//
// 摘要:
// 将指定屏幕点的位置计算成工作区坐标。
//
// 参数:
// 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}
http://www.lryc.cn/news/15668.html

相关文章:

  • 【论文笔记】Manhattan-SDF==ZJU==CVPR‘2022 Oral
  • 环翠区中小学生编程挑战赛题解中学组T4:免费超市
  • 关于Oracle树形查询(connect by)的学习笔记
  • 观看课程领奖品!Imagination中国区技术总监全面解读 IMG DXT GPU
  • To_Heart—题解——[SCOI2012]奇怪的游戏
  • Spring Boot Hello World 基于 IDEA 案例详解
  • 基于机器学习的异常检测与分析技术
  • pytest进阶之html测试报告
  • 劳特巴赫仿真测试工具Trace32的基本使用(cmm文件)
  • 盘点四种自动化测试模型实例及优缺点
  • 【论文阅读】SCRFD: Sample and Computation 重分配的高效人脸检测
  • Debezium报错处理系列之四十七:Read only connection requires GTID_MODE to be ON
  • 关于float(b)类型数据类型的精度的学习
  • 哪种类型的网络安全风险需要进行渗透测试?
  • ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境
  • Vue3后台管理系统(四)SVG图标
  • 【收集】2023年顶会accepted papers list(NeurIPS/CVPR/ICML/ICLR/ECCV/AAAI/IJCAI/WWW...)
  • 空闲态LTE到NR重选优先级介绍
  • 数据结构与算法:Map和Set的使用
  • C语言——动态内存管理
  • Docker安装Grafana
  • 数据结构(四):树、二叉树、二叉搜索树
  • 040、动态规划基本技巧(labuladong)
  • html笔记(一)
  • 索引的情况
  • Verilog 学习第五节(串口发送部分)
  • 破解遗留系统快速重构的5步心法(附实例)
  • 信号量(上)实验
  • 阿里5年,一个女工对软件测试的理解
  • 前端练习项目