【C#】Region、Exclude的用法

在 C# 中,RegionExclude 是与图形编程相关的概念,通常在使用 System.Drawing 命名空间进行 GDI+ 绘图时出现。它们主要用于定义和操作二维空间中的区域(几何区域),常用于窗体裁剪、控件重绘、图形绘制优化等场景。

一、Region 的用法

Region 类(位于 System.Drawing 命名空间)表示一个屏幕上的区域,可以是矩形、椭圆、多边形,甚至是复杂组合形状。

  1. 创建 Region 的方式:
cs 复制代码
using System.Drawing;

// 1. 从矩形创建
Rectangle rect = new Rectangle(10, 10, 100, 100);
Region region1 = new Region(rect);

// 2. 从椭圆创建
GraphicsPath path = new GraphicsPath();
path.AddEllipse(20, 20, 80, 80);
Region region2 = new Region(path);

// 3. 从 GraphicsPath 创建复杂形状
GraphicsPath complexPath = new GraphicsPath();
complexPath.AddPolygon(new Point[] {
    new Point(0, 0),
    new Point(50, 100),
    new Point(100, 0)
});
Region region3 = new Region(complexPath);
  1. Region 的常用操作
  • Intersect:交集
  • Union:并集
  • Xor:异或
  • Exclude:排除(见下文)
  • Complement:补集
  • GetHrgn:获取 GDI 句柄(用于 Win32 API)

二、Exclude 的用法

ExcludeRegion 类的一个方法,用于从当前区域中移除另一个区域,即执行"差集"操作。

方法签名:

cs 复制代码
public void Exclude(Rectangle rect);
public void Exclude(RectangleF rect);
public void Exclude(Region region);

示例:

cs 复制代码
// 创建一个大矩形区域
Region bigRegion = new Region(new Rectangle(0, 0, 200, 200));

// 创建一个小矩形区域(要排除的部分)
Rectangle hole = new Rectangle(50, 50, 100, 100);

// 从小区域中"挖掉"一个洞
bigRegion.Exclude(hole);

// 现在 bigRegion 是一个外框为 200x200,中间有 100x100 空洞的区域

实际应用场景:

创建非矩形窗体的透明区域

这样窗体就变成了一个"框",中间是透明的(不可点击、不绘制)。

cs 复制代码
this.Region = new Region(new Rectangle(0, 0, 300, 300));
this.Region.Exclude(new Rectangle(50, 50, 200, 200)); // 中间挖空

绘制时排除某些区域不重绘

cs 复制代码
Graphics g = this.CreateGraphics();
Region updateRegion = g.Clip; // 获取当前裁剪区域
updateRegion.Exclude(someControl.Bounds); // 排除某个控件区域
g.Clip = updateRegion;
// 然后只绘制除该控件外的区域

三、注意事项

  • Region 是 GDI+ 资源,使用后应释放
  • 在 WinForms 中,Control.Region 属性可以设置控件的可见/可点击区域。
  • Exclude 操作是破坏性操作,会修改原 Region 对象,而不是返回新对象。
  • 对于高性能图形应用,频繁创建/销毁 Region 可能影响性能,需注意优化。

四、总结

概念 说明
Region 表示一个二维区域,可用于裁剪、绘图、窗体形状控制等
Exclude 从当前 Region 中移除指定区域,实现"差集"效果,常用于"挖洞"或排除绘制区域

这些功能在自定义控件、不规则窗体、动画特效等场景中非常有用。

五、扩展

【C#】GraphicsPath的用法文章浏览阅读449次,点赞3次,收藏6次。【C#】GraphicsPath的用法_c# graphicspath 对象说明https://blog.csdn.net/wangnaisheng/article/details/149226810?spm=1011.2415.3001.5331【C#】 使用GDI+获取两个多边形区域相交、非相交区域文章浏览阅读753次。【C#】 使用GDI+获取两个多边形区域相交、非相交区域_c# 图形相交区域https://blog.csdn.net/wangnaisheng/article/details/140527315?spm=1011.2415.3001.5331