GDI+ 中区域的使用

背景

GDI+ 中的区域是一种显示表面的范围,可以是任意形状,边界一般为路径。区域所对应的类是 Region。

构造区域

①.矩形构造

Rect m_rect(30, 30, 180, 120);
Region m_region(m_rect);

②.路径构造

GraphicsPath m_path;
m_path.AddEllipse(20, 20, 180, 180);
Region m_region(&m_path);

③.常用函数

m_region.IsEmpty();//判断是否空区域
m_region.MakeEmpty();//清空区域

区域运算

①.并集

对两个区域进行合并操作。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象
  SolidBrush solidBrush(Color::Green);
  Pen m_pen1(Color::Blue, 2), m_pen2(Color::Red, 2);

  GraphicsPath path1,path2;
  path1.AddEllipse(20, 20, 180, 180);
  path2.AddEllipse(100, 20, 180, 180);

  graphics.DrawPath(&m_pen1, &path1);
  graphics.DrawPath(&m_pen2, &path2);


  Region m_region1(&path1);
  Region m_region2(&path2);
  m_region1.Union(&m_region2);//并集

  graphics.TranslateTransform(300, 0);
  graphics.FillRegion(&solidBrush, &m_region1);
  
}

在这里插入图片描述

②.交集
获取两个区域重合的部分。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象
  SolidBrush solidBrush(Color::Green);
  Pen m_pen1(Color::Blue, 2), m_pen2(Color::Red, 2);

  GraphicsPath path1,path2;
  path1.AddEllipse(20, 20, 180, 180);
  path2.AddEllipse(100, 20, 180, 180);

  graphics.DrawPath(&m_pen1, &path1);
  graphics.DrawPath(&m_pen2, &path2);


  Region m_region1(&path1);
  Region m_region2(&path2);
  m_region1.Intersect(&m_region2);//交集

  graphics.TranslateTransform(300, 0);
  graphics.FillRegion(&solidBrush, &m_region1);
  
}

在这里插入图片描述

③.余集
在区域1中去掉和区域2重合的部分。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象
  SolidBrush solidBrush(Color::Green);
  Pen m_pen1(Color::Blue, 2), m_pen2(Color::Red, 2);

  GraphicsPath path1,path2;
  path1.AddEllipse(20, 20, 180, 180);
  path2.AddEllipse(100, 20, 180, 180);

  graphics.DrawPath(&m_pen1, &path1);
  graphics.DrawPath(&m_pen2, &path2);

  Region m_region1(&path1);
  Region m_region2(&path2);
  m_region1.Exclude(&m_region2);//余集

  graphics.TranslateTransform(300, 0);
  graphics.FillRegion(&solidBrush, &m_region1);
  
}

在这里插入图片描述

④.补集
区域2中去掉和区域1重合的部分。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象
  SolidBrush solidBrush(Color::Green);
  Pen m_pen1(Color::Blue, 2), m_pen2(Color::Red, 2);

  GraphicsPath path1,path2;
  path1.AddEllipse(20, 20, 180, 180);
  path2.AddEllipse(100, 20, 180, 180);

  graphics.DrawPath(&m_pen1, &path1);
  graphics.DrawPath(&m_pen2, &path2);

  Region m_region1(&path1);
  Region m_region2(&path2);
  m_region1.Complement(&m_region2);//补集

  graphics.TranslateTransform(300, 0);
  graphics.FillRegion(&solidBrush, &m_region1);
  
}

在这里插入图片描述

⑤.异或集
区域1和区域2合并后去掉重合的部分。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象
  SolidBrush solidBrush(Color::Green);
  Pen m_pen1(Color::Blue, 2), m_pen2(Color::Red, 2);

  GraphicsPath path1,path2;
  path1.AddEllipse(20, 20, 180, 180);
  path2.AddEllipse(100, 20, 180, 180);

  graphics.DrawPath(&m_pen1, &path1);
  graphics.DrawPath(&m_pen2, &path2);

  Region m_region1(&path1);
  Region m_region2(&path2);
  m_region1.Xor(&m_region2);//异或集

  graphics.TranslateTransform(300, 0);
  graphics.FillRegion(&solidBrush, &m_region1);
  
}

在这里插入图片描述

区域的使用

①.裁剪
裁剪是指限制对特定区域进行绘制。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象
  SolidBrush solidBrush(Color::Green);
  Pen m_pen1(Color::Blue, 2), m_pen2(Color::Red, 2);

  GraphicsPath path1,path2;
  path1.AddEllipse(20, 20, 180, 180);
  path2.AddEllipse(100, 20, 180, 180);

  graphics.DrawPath(&m_pen1, &path1);
  
  Region m_region1(&path1);
  
  graphics.SetClip(&m_region1);
  graphics.DrawPath(&m_pen2, &path2);    
}

在这里插入图片描述

②.包含判断
判断指定的点或者矩形是否包含在区域内

m_region.IsVisible(20,20);
m_region.IsVisible(30, 30, 180, 120);

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值