加入收藏 | 网站地图 | | RSS | WAP
你好,游客 登录 注册 搜索

C#中CGI+绘图知识:区域Region

[日期:2013-03-20] 作者: 来源: [字体: ]

CGI+绘图过程中我们有时候需要让绘图实现类似于XOR那种颜色透明叠加的效果,或者制作无规则窗体控件等,这时可以采用Region对象。Region对象需引用System.Drawing.Region空间。

Region常用的有以下方法:Union、Xor、Exclude、Intersect等,可实现交集、差集、并集等等,详细参见:

http://msdn.microsoft.com/zh-cn/library/system.drawing.region.aspx

这里仅做简单介绍及示例。

可以用路径和矩形来创建一个区域。通过Region的构造函数。

如下示例,用矩形创建两个区域,并填充这两个区域。

private void formPaint(Object sender, PaintEventArgs e)
{
//两个100宽高的矩形区域
Region region1=new Region(new Rectangle(0,0,100,100));
Region region2=new Region(new Rectangle(50,50,100,100));
//创建画刷1,并填充区域1,颜色的Alpha值是125
SolidBrush brush1 = new SolidBrush(Color.FromArgb(125, 255, 0, 0));
e.Graphics.FillRegion(brush1, region1);
//创建画刷2,并填充区域2
SolidBrush brush2 = new SolidBrush(Color.FromArgb(125, 0, 255, 0));
e.Graphics.FillRegion(brush2, region2);
}

效果图:

另外也可以合并两个区域,合并区域在第九十五个函数CombineRgn里也讲过了,可以参考一下那个函数。

CombineRgn API函数的最后一个参数nCombineMode指明如何合并两个区域,那么Region类里的合并也应该有类似的功能。

指明如何合并,不过Region类不是用参数来指明,Region是直接调用不同的函数。

比如Region.Intersect函数就是RGN_AND ,Region.Union就是RGN_OR方式合并。。region1.Exclude是RGN_DIFF ,

Region.Xor是RGN_XOR方式合并

关于nCombineMode参数的解释:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>来自API CombineRgn函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

RGN_AND 两个区域的重叠部分

RGN_OR 组合两个区域

RGN_DIFF hSrcRgn1未重叠的部分

RGN_XOR hSrcRgn1和hSrcRgn2未重叠的部分

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Region类里还有个函数Complement,用这个函数合并得到的区域是区域2未重叠的部分。

看示例吧:

private void formPaint(Object sender, PaintEventArgs e)
{
//两个100宽高的矩形区域
Region region1=new Region(new Rectangle(0,0,100,100));
Region region2=new Region(new Rectangle(50,50,100,100));
//用Xor函数合并区域,得到的是两个区域未重叠部分的区域。
region1.Xor(region2);
//创建画刷,填充合并后的区域
SolidBrush brush = new SolidBrush(Color.Green);
e.Graphics.FillRegion(brush, region1);
}

效果图:

 

设置窗口显示区域:

指定Form类里的Region属性成员就行了,比如显示一个圆形窗口:

public Form1()
{
InitializeComponent();
//创建一个圆形路径
GraphicsPath path = new GraphicsPath();
path.AddEllipse(0, 0, 100, 100);
//通过路径创建区域
Region region = new Region(path);
//指定窗口显示区域
this.Region = region;
}

效果图:

 

Region.IsVisible判断一个点(或者矩形)是否在区域内
看示例,例子中创建了一个圆形区域,只要鼠标一进入这个圆形区域,这个区域就显示红色。
public partial class Form1 : Form
{
//区域正常状态下填充的画刷
public SolidBrush norBrush=new SolidBrush(Color.Green);
//鼠标在区域内时填充的画刷
public SolidBrush hoVBrush = new SolidBrush(Color.Red);
//标明鼠标是否在区域内
public bool hovFlag = false;
//圆形区域
public Region region;
public Form1()
{
InitializeComponent();
//创建圆形路径
GraphicsPath path = new GraphicsPath();
path.AddEllipse(50, 50, 100, 100);
//通过路径创建区域
region = new Region(path);

//添加事件处理
this.Paint += formPaint;
//鼠标移动事件
this.MouseMove += fromMouseMove;

}
private void formPaint(Object sender, PaintEventArgs e)
{
if (hovFlag)
{
e.Graphics.FillRegion(hovBrush, region);
}
else
{
e.Graphics.FillRegion(norBrush, region);
}
}
//鼠标移动事件处理函数
private void fromMouseMove(object sender, MouseEventArgs e)
{
Graphics graphics = this.CreateGraphics();
//鼠标初次进入区域
if (region.IsVisible(e.X, e.Y) && hovFlag != true)
{
hovFlag = true;
graphics.FillRegion(hovBrush, region);
}
//鼠标离开区域了
else if (region.IsVisible(e.X, e.Y) != true && hovFlag)
{
hovFlag = false;
graphics.FillRegion(norBrush, region);
}
}
}

关键词:绘图  区域  CGI  region 

收藏 推荐 打印 | 录入:blue1000 | 阅读:
本文评论   查看全部评论 (3)
表情: 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事/刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 3 楼
* 匿名 发表于 2016/12/25 15:37:58
http://www.blue1000.com/bkhtml/c17/2013-04/71160.htm 2016年幼儿园保教工作计划 http://www.135995.com/show/3235.html 2016年春季幼儿园保教工作计划 http://www.135995.com/show/3234.html
第 2 楼
* 匿名 发表于 2016/12/24 15:26:30
http://www.blue1000.com/bkhtml/c17/2013-04/71160.htm 结婚典礼上的证婚人证词 http://www.135995.com/show/18950.html 婚礼证婚人祝贺词 http://www.135995.com/show/18949.html
第 1 楼
* 匿名 发表于 2013/5/2 11:09:24
多谢