背景
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);