C#中GDI+的矩形功能扩展

news2024/12/23 13:50:01

原文出处:https://haigear.blog.csdn.net/article/details/129060020
GDI发展到GDI+绘制函数中的参数往往都有矩形这个参数(除绘制直线和路径),所以我们用好了矩形绘图就容易多了。

一、中心定位绘制图形

但当我们绘制一个图形时都需要定位,而按照我们的定位习惯或者可预见的能力,一般都还是喜欢中心定位,恰恰gdi+不提供。
所以,这里我特意扩展了两个函数,我想一定可以给大家带来便利:

1、矩形及椭圆中心定位

 /// <summary>
        /// 为画矩形和椭圆提供rectangle中心
        /// </summary>
        /// <param name="centerPoint"></param>
        /// <param name="width"></param>
        /// <param name="hight"></param>
        /// <returns></returns>
        Rectangle getRectByCenter(Point centerPoint,int width,int hight) 
        {
            return new Rectangle(centerPoint.X - width/2, centerPoint.Y - hight/2, width, hight);
        }
       

2、圆的中心定位矩形

 /// <summary>
/// 为画圆或者圆弧提供rect中心
/// </summary>
/// <param name="centerPoint"></param>
/// <param name="radius"></param>
/// <returns></returns>
Rectangle getRectByCenter(Point centerPoint, int radius)
  {
      //圆半径在水平是的X坐标和垂直时的Y坐标刚好是矩形的起始坐标,半径的两倍刚好是正方形的边长
      return new Rectangle(centerPoint.X - radius, centerPoint.Y - radius, 2 * radius, 2 * radius);
  }

有了中心定位,我们只要给定一个中心,那么绘制图形就随心所欲啦,比如我们在屏幕的中心绘制一个圆:

  g.DrawEllipse(new Pen(Color.Red, 3), getRectByCenter(new Point(this.Width / 2, this.Height / 2),  100));

在这里插入图片描述

如果,我们想绘制一个圆球体,那就纵横都绘制一些椭圆即可,如下图:
在这里插入图片描述

二、圆角矩形

下面的方法其实是将一个矩形转化为了一个Path,里面添加了几个Arc

 void drawRoundRectangle(Graphics gp,Rectangle rectangle,int radius)
{
    GraphicsPath graphicsPath = new GraphicsPath();             
    for(int i = 0; i < 4; i++)
    {
        var x=  (i>0 && i<3)?rectangle.X+rectangle.Width-radius: rectangle.X ;
        var y = (i>1)?rectangle.Y +(rectangle.Height-radius): rectangle.Y ;
        graphicsPath.AddArc(new Rectangle(x,y,radius,radius),180+i*90,90);
    }
    graphicsPath.CloseFigure();
    gp.DrawPath(new Pen(Color.Red, 4),graphicsPath);
    
}

但这样以后我们绘制圆角矩形就容易多了

drawRoundRectangle(g, getRectByCenter(new Point(this.Width / 2, this.Height / 2), 100,200),40);

在这里插入图片描述
再配合我们后面的移动复制函数,很随意就画出一排圆角矩形,适合做界面
在这里插入图片描述

drawRoundRectangle(g, centerRect,40);
drawRoundRectangle(g, copyRectWithGap(centerRect, 20), 40);
drawRoundRectangle(g, copyRectWithGap(centerRect, -20), 40);

三、收缩功能

  Rectangle shrinkRectangle(ref Rectangle rectangle,int offset)
        {
            rectangle.Offset(offset,offset);
            rectangle.Width = rectangle.Width-2*offset;
            rectangle.Height= rectangle.Height-2*offset;
            return rectangle;
        }

我们将上面的图形收缩一下,就很容易了:
在这里插入图片描述

 Rectangle rect1 = new Rectangle(50, 50, 200, 200);
  g.DrawRectangle(new Pen(Color.Yellow, 2), rect1);
  shrinkRectangle(ref rect1, 20);
  drawRoundRectangle(g, rect1, 20);

这里调用了前面的drawRoundRectangle绘制圆角矩形函数。

四、移动复制功能

这个系统自带了,但我们还是想给它扩展出一个相对另一个矩形的移动功能,也就是所,我们一只一个矩形,在这个矩形的基础上再移动一定的距离

Rectangle copyRectWithGap(Rectangle rect, int gapx=0,int gapy=0)
 {
     Rectangle rt = rect;          
     rt.Offset(gapx+rect.Width,gapy+rect.Height);
     return rt;

 }

暂时扩展了这四种功能,后面有时间再多扩展一些便于我们使用的函数,弥补、gdi+的绘制功能灵活度的不足。
码字不易,请标明出处:https://haigear.blog.csdn.net/article/details/129060020

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/350903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Towards Adversarial Attack on Vision-Language Pre-training Models

摘要虽然视觉-语言预训练模型(VLP)在各种视觉-语言(VL)任务上表现出革命性的改进&#xff0c;但关于其对抗鲁棒性的研究在很大程度上仍未被探索。本文研究了常用VLP模型和VL任务的对抗性攻击。首先&#xff0c;我们分析了不同设置下对抗性攻击的性能。通过研究不同扰动对象和攻…

HHDESK图片管理——批量重命名及递归搜索

HHDESK作为一款国产桌面软件&#xff0c;考虑到国人的操作及阅读习惯。因此我们开发了一些有意义的新功能&#xff0c;比如今天要介绍的图片批量重命名及递归搜索功能 1.图片批量重命名功能 网上下载的图片名称大多杂乱无章&#xff0c;一眼望去毫无头绪。 而windows自带的…

第41天|LeetCode198. 打家劫舍、LeetCode213. 打家劫舍II、LeetCode337. 打家劫舍III

1.题目链接&#xff1a;198. 打家劫舍 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&a…

Ubuntu中利用aircrack-ng和Wireshark抓空口包

系统&#xff1a;Ubuntu20.04网卡&#xff1a;RTL8188CUS USB网卡工具安装sudo apt-get install aircrack-ngsudo add-apt-repository ppa:wireshark-dev/stable sudo apt update sudo apt install -y wireshark网卡确认网卡是否支持monitor模式&#xff0c;输入iw list命令&am…

Java最全八股文(2023最新整理)

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

vTESTstudio - VT System CAPL Functions - VT2004

纵使生活有白般不顺&#xff0c;我们依然要千般喜乐&#xff0c;万般热爱&#xff0c;只因那些我们喜爱和爱我们的人儿。vtsLoadWFResistance - 从指定文件加载通道的电阻曲线功能&#xff1a;此函数从指定文件加载VT2004通道的电阻曲线注意&#xff1a;该函数不能在任何CAPL处…

电子技术——分立CS和CE放大器的低频响应

电子技术——分立CS和CE放大器的低频响应 我们之前在学习放大器中从来没有关系过信号频率对放大器的影响&#xff0c;也就是说我们默认放大器具有无限的带宽&#xff0c;这当然不符合现实逻辑。为了说明这一点&#xff0c;我们使用下图&#xff1a; 上图描述了MOS或BJT分立电路…

电脑录屏是哪个快捷键?3个录屏快捷键,教你快速录屏

在每天的办公、学习、生活中&#xff0c;很多小伙伴经常需要使用电脑录屏功能。想要快速进行电脑录屏&#xff0c;那么就需要使用电脑录屏的快捷键进行协助。电脑录屏是哪个快捷键&#xff1f;今天&#xff0c;小编就分享3个录屏快捷键&#xff0c;教你如何快速录屏。 一、电脑…

C语言格式化输入和输出; Format格式化

Format格式化 %1s或者%2s,%3s:取字符串的前1,2或者3位。%*c:屏蔽一个字符。%[A-Z]:取一个A到Z的值。 %[^a-z]:不取a到z的值。 %[^\n]&#xff1a;取非换行之前的值。printf("%5d", a):左边补 格式化&#xff1a;有正则在其中。 int main() {printf("%5d\n&quo…

二叉树讲解

对于二叉树&#xff0c;是真正的很难&#xff01;很难&#xff0c;不是一般的难度&#xff01;&#xff01;笔者学习完二叉树&#xff0c;笔记记录了得有三十多页&#xff0c;但是&#xff0c;还是很不理解&#xff08;做题不怎么会&#xff09;下面进入二叉树的基础部分&#…

无法决定博客主题的人必看!如何选择类型和推荐的 5 种选择

是否有人不能迈出第一步&#xff0c;因为博客的类型还没有决定&#xff1f;有些人在出发时应该行动&#xff0c;而不是思考&#xff0c;但让我们冷静下来&#xff0c;仔细想想。博客的难度因流派而异&#xff0c;这在很大程度上决定了随后的发展。因此&#xff0c;在选择博客流…

关于IDM下载器,提示:一个假冒的序列号被用来注册……idea项目文件路径报红

关于IDM下载器&#xff0c;提示&#xff1a;一个假冒的序列号被用来注册……到C:\Windows\System32\drivers\etc 修改目录下面的hosts文件&#xff08;如果没有修改的权限就右键属性hosts文件修改user的权限为完全控制&#xff09;&#xff0c;在hosts里面增加以下内容&#xf…

RadGraph: Extracting Clinical Entities and Relations from Radiology Reports代码

文章来源&#xff1a;NeurIPS 文章类别&#xff1a;IE(Information Extraction) RadGraph主要基于dygie&#xff0c;主要文件为inference.py。 inference.py&#xff1a; 1、get_file_list(data_path) def get_file_list(path):file_list [item for item in glob.glob(f&q…

遮挡贴图(Occlusion Map)和微表面贴图(Microsurface Map)

遮挡贴图&#xff08;Occlusion Map&#xff09; 在3D图形学中&#xff0c;遮挡&#xff08;Occlusion&#xff09;是指光被物体挡住。即便是在PBR中&#xff0c;环境光在某些应该被遮挡的地方&#xff0c;也会以古怪的方式被反射。遮挡贴图&#xff08;Occlusion Map&#xff…

ffmpeg h264文件转mp4

h264文件不能直接在网页上播放&#xff0c;比如在浏览器上输入http://10.0.0.2/2022-01-08T22-32-58.h264&#xff0c;变成了下载。 若在浏览器上输入http://10.0.0.2/2022-01-08T22-32-58.mp4&#xff0c;则可以播放。 本文讲解用ffmpeg将h264文件转换成mp4。 首先&#xf…

视频融合 flv流格式对接(上)

FLV 是FLASH VIDEO的简称&#xff0c;FLV流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快&#xff0c;使得网络观看视频文件成为可能&#xff0c;它的出现有效地解决了视频文件导入Flash后&#xff0c;使导出的SWF文件体积庞大&#xf…

R-Drop: Regularized Dropout for Neural Networks 论文笔记(介绍,模型结构介绍、代码、拓展KL散度等知识)

目录前言一、摘要二、R-Drop介绍三、R-Drop公式详解四、R-Drop计算流程附录0&#xff1a;代码附录一&#xff1a;熵以及信息熵附录二&#xff1a;KL散度&#xff08;相对熵&#xff09;附录三&#xff1a;JS散度附录四&#xff1a;互信息总结前言 R-Drop——神经网络的正则化Dr…

必看!Salesforce管理员职场如何快速晋升?

2023年的开局略显艰难&#xff0c;在当前的经济环境下&#xff0c;许多行业仍面临挑战。虽然交易周期可能会变得更长&#xff0c;但对新的Salesforce实施仍有巨大需求&#xff0c;现有客户仍然需要经验丰富的专业人员来优化和维护他们的Salesforce组织。 在过去的三年中&#x…

大规模即时云渲染技术,追求体验与成本的最佳均衡

现实世界映射其中&#xff0c;传统文化沉浸其境&#xff0c;旧时记忆交互其间。 仲升&#xff5c;技术作者 IMMENSE&#xff5c;内容编辑 在刚刚过温的春节&#xff0c;云之上&#xff0c;带来了一场「数字文化」新体验。 游花车、舞狮子、踩高跷、放烟花、写福字……还记得儿…

2023最强软件测试面试题,精选100 道,内附答案版,冲刺金3银4

精挑细选&#xff0c;整理了100道软件测试面试题&#xff0c;都是非常常见的面试题&#xff0c;篇幅较长&#xff0c;所以只放出了题目&#xff0c;答案在评论区&#xff01; 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 2、我现在有…