【愚公系列】2023年11月 GDI+绘图专题 Region

举报
愚公搬代码 发表于 2023/11/29 22:46:19 2023/11/29
【摘要】 🏆 作者简介,愚公搬代码🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物...

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

在WinForm中,Region可以被用来定义或裁剪控件的形状。它可以用于创建不规则的控件,如圆形、椭圆形、星型等。Region可以被用于以下场景:

  1. 裁剪控件的形状:可以通过Region来裁剪控件的形状,使得控件成为不规则形状。

  2. 控制控件的可见性:使用Region属性,可以设置控件的可见区域,控制控件的可见性。

  3. 事件处理:在控件中移动鼠标或者单击鼠标时,可以使用Region属性来确定哪些区域需要处理事件。

  4. 绘制控件:可以使用Region属性来绘制控件的背景。

使用Region非常简单,只需要实例化一个Region对象,并将其分配给控件的Region属性即可。例如,要给一个按钮设置圆形形状,可以使用以下代码:

Region region = new Region(new Rectangle(0, 0, button1.Width, button1.Height));
GraphicsPath path = new GraphicsPath();
path.AddEllipse(0, 0, button1.Width, button1.Height);
region = new Region(path);
button1.Region = region;

注意,为了正确显示控件的区域,控件的背景颜色应该与其父容器的背景颜色一致。

🚀一、Region

🔎1.创建区域

🦋1.1 路径

Graphics g = e.Graphics;
GraphicsPath gp = new GraphicsPath();

gp.AddLine(10, 10, 10, 50);
gp.AddLine(10, 50, 50, 50);
gp.AddLine(50, 50, 50, 10);
gp.StartFigure();
gp.AddLine(60, 10, 60, 50);
gp.AddLine(60, 50, 100, 50);
gp.AddLine(100, 50, 100, 10);
gp.CloseFigure();

Rectangle rectangle = new Rectangle(110, 10, 40, 40);
gp.AddEllipse(rectangle);
Region region = new Region(gp);
g.FillRegion(Brushes.Green, region);

在这里插入图片描述

🦋1.2 矩形

Graphics g = e.Graphics;
Rectangle rectangle = new Rectangle(110, 10, 40, 40);
Region region = new Region(rectangle);
g.FillRegion(Brushes.Green, region);

在这里插入图片描述

🦋1.3 区域

☀️1.3.1 GetRegionData

GetRegionData方法是Region类中的一个方法,可以用于获取包含区域信息的RegionData对象。RegionData对象包含了一个由连续的矩形和路径构成的区域,可以用于序列化和反序列化区域数据。

具体来说,GetRegionData方法返回一个RegionData对象,可以通过RegionData.Data属性获取一个字节数组,表示区域数据。可以将这个字节数组保存在文件中或通过网络进行传输。当需要使用这个区域数据时,可以使用RegionData类的FromBytes方法将字节数组转换回RegionData对象,然后再通过Region类的构造函数将其转换为Region对象。

Graphics g = e.Graphics;
Rectangle rectangle = new Rectangle(110, 10, 40, 40);
Region region = new Region(rectangle);

RegionData regionData = region.GetRegionData();
Region region2 = new Region(regionData);
g.FillRegion(Brushes.Green, region2);

在这里插入图片描述
需要注意的是,GetRegionData方法返回的RegionData对象中仅包含了区域的矩形和路径信息,而没有包含区域的颜色、填充方式等其他属性。在反序列化时,需要根据具体情况重新设置这些属性。

☀️1.3.2 clone

需要注意的是,GetRegionData方法返回的RegionData对象中仅包含了区域的矩形和路径信息,而没有包含区域的颜色、填充方式等其他属性。在反序列化时,需要根据具体情况重新设置这些属性。

Graphics g = e.Graphics;
Rectangle rectangle = new Rectangle(110, 10, 40, 40);
Region region = new Region(rectangle);
Region region2 = region.Clone();
g.FillRegion(Brushes.Green, region2);

在这里插入图片描述
需要注意的是,GetRegionData方法返回的RegionData对象中仅包含了区域的矩形和路径信息,而没有包含区域的颜色、填充方式等其他属性。在反序列化时,需要根据具体情况重新设置这些属性。

🔎2.区域的并合交集

🦋2.1 交集

GDI+绘图Region中的交集可以通过Region类的IntersectWith方法实现。该方法接受一个Region参数,表示要与当前Region进行交集操作的另一个Region,将会返回一个新的Region对象,表示两个Region的交集。

以下是一个简单的示例代码,展示如何使用IntersectWith方法计算两个Region的交集:

Graphics g = e.Graphics;
Rectangle rect1 = new Rectangle(50, 10, 50, 130);
Rectangle rect2 = new Rectangle(10, 50, 130, 50);
Region reg = new Region(rect1);
reg.Intersect(rect2);

g.FillRegion(Brushes.Red, reg);
g.DrawRectangle(Pens.Blue, rect1);
g.DrawRectangle(Pens.LimeGreen, rect2);

在这里插入图片描述

在这个示例中,我们创建了两个矩形,然后使用它们创建了两个Region对象。接下来,我们使用Intersect方法计算这两个Region对象的交集,并将结果绘制到图像上。最终,我们将得到一个以红色填充颜色的矩形区域,它表示两个原始Region对象的交集。

🦋2.2 并集

GDI+ 中的 Region 是一个封装了一组封闭的图形图像(如矩形、椭圆等)的类,主要用于控制绘图操作的区域。Region 有许多操作函数,其中之一就是并集操作。

并集操作指的是将两个 Region 合并成一个 Region。合并后,新的 Region 中包含了原来两个 Region 中所有的图形。具体实现方法如下:

Graphics g = e.Graphics;
Rectangle rect1 = new Rectangle(50, 10, 50, 130);
Rectangle rect2 = new Rectangle(10, 50, 130, 50);
Region reg = new Region(rect1);
reg.Union(rect2);

g.FillRegion(Brushes.Red, reg);
g.DrawRectangle(Pens.Blue, rect1);
g.DrawRectangle(Pens.LimeGreen, rect2);

在这里插入图片描述

执行以上代码,会在画布上绘制一个包含两个矩形的新矩形。其中,两个矩形的重叠部分只会出现一次。

需要注意的是,Region 的并集操作不会改变原来的 Region,而是返回一个新的 Region。因此,在实际应用中,需要将返回的新 Region 赋值给原来的 Region,以更新区域。

🦋2.3 异并集

异或集是指两个区域中不重合的部分合并成为一个新的区域,而重合的部分被剔除。在GDI+中,可以通过Region类的Xor方法来实现异或集操作。具体使用方法如下:

Graphics g = e.Graphics;
Rectangle rect1 = new Rectangle(50, 10, 50, 130);
Rectangle rect2 = new Rectangle(10, 50, 130, 50);
Region reg = new Region(rect1);
reg.Xor(rect2);

g.FillRegion(Brushes.Red, reg);
g.DrawRectangle(Pens.Blue, rect1);
g.DrawRectangle(Pens.LimeGreen, rect2);

在这里插入图片描述

在以上代码中,首先创建了两个矩形区域region1和region2,并将它们进行异或集操作,然后使用FillRegion方法将结果区域填充为红色。

需要注意的是,在进行异或集操作时,两个区域必须都是闭合的,即区域边界必须完全封闭,否则可能会产生意外的结果。

🦋2.4 补集

在GDI+中,Region是指一个区域或一个形状,可以用来对画布进行剪切、填充等操作。Region有一个非常有用的属性是补集,它可以用来对Region进行取反操作,即将原来不属于该区域的部分转变为属于该区域的部分。

在C#中,可以通过Region类的Complement方法来获取Region的补集。例如:

Graphics g = e.Graphics;
Rectangle rect1 = new Rectangle(50, 10, 50, 130);
Rectangle rect2 = new Rectangle(10, 50, 130, 50);
Region reg = new Region(rect1);
reg.Complement(rect2);

g.FillRegion(Brushes.Red, reg);
g.DrawRectangle(Pens.Blue, rect1);
g.DrawRectangle(Pens.LimeGreen, rect2);

在这里插入图片描述

上面的代码中,首先创建了两个矩形区域region1和region2,然后调用region2的Complement方法,将不属于region1的部分转变为属于region2的部分,即上、下、左、右各自的矩形区域。最终,region2中的区域就是原来不属于region1的区域的补集。

🦋2.5 反补集

在GDI+中,Region是用来定义2D图形区域的类。Region可以用来实现图形的裁剪、填充等操作,同时也支持对区域进行并、交、差等运算。

而Region的反补集就是指对一个Region进行取反操作,得到其在整个空间上的补集。可以通过Region类的Complement方法来实现反补集操作。

下面是一个例子,展示了如何使用Region类实现反补集操作:

Graphics g = e.Graphics;
Rectangle rect1 = new Rectangle(50, 10, 50, 130);
Rectangle rect2 = new Rectangle(10, 50, 130, 50);
Region reg = new Region(rect1);
reg.Exclude(rect2);

g.FillRegion(Brushes.Red, reg);
g.DrawRectangle(Pens.Blue, rect1);
g.DrawRectangle(Pens.LimeGreen, rect2);

在这里插入图片描述

该代码会在窗体中绘制一个圆形和一个矩形的并集,并对其进行反补集操作,最终得到的结果是除圆形和矩形并集以外的所有区域都被填充为黑色。


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

![在这里插入图片描述](https://img-blog.csdnimg.cn/e06a317e89694a23ad89d2c59538c3a1.jpeg#pic_center =450x300)

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。