注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

GDI+路径(2)  

2011-07-25 21:02:49|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

子路径

       前面的例子中介绍的路径都只包含了一个单独的图形,事实上GraphicsPath可以包含多个子图形,就好像一个文件夹中可以包含多个文件一样,将一个路径中的每一个子图形都称之为子路径,在GraphicsPath中使用StartFigure或者CloseFigure方法构建一个新的子路径。这两个方法有点区别。StartFigure方法只是简单的添加新的子路径,而CloseFigure方法会将前一个可能不封闭的子路径封闭,然后再添加新的子路径,下面的例子将演示子路径的添加。

private void button1_Click(object sender, EventArgs e)

{

    Graphics gp = this.CreateGraphics();

    Pen p=new Pen(Color.Red,3f);

    //gpath1为单一子路径,gpath2包含三个子路径

    GraphicsPath gpath1 = new GraphicsPath();

    GraphicsPath gpath2 = new GraphicsPath();

    Rectangle rect = new Rectangle(10, 20, 150, 100);

    gpath1.AddArc(rect, 0, 180);

    rect = new Rectangle(10, 60, 150, 100);

    gpath1.AddArc(rect, 0, 180);

    rect = new Rectangle(10, 100, 150, 100);

    gpath1.AddArc(rect, 0, 180);

    rect = new Rectangle(10, 140, 150, 100);

    gpath1.AddArc(rect, 0, 180);

    rect = new Rectangle(10, 180, 150, 100);

    gpath1.AddArc(rect, 0, 180);

    gp.DrawPath(p, gpath1);

    //第二个路径

    gp.TranslateTransform(200, 0);

    rect = new Rectangle(10, 20, 150, 100);

    gpath2.AddArc(rect, 0, 180);

    rect = new Rectangle(10, 60, 150, 100);

    gpath2.AddArc(rect, 0, 180);

    rect = new Rectangle(10, 100, 150, 100);

    gpath2.AddArc(rect, 0, 180);

    gpath2.StartFigure();//开始第二个子路径

    rect = new Rectangle(10, 140, 150, 100);

    gpath2.AddArc(rect, 0, 180);

    gpath2.CloseFigure();//第三个子路径

    rect = new Rectangle(10, 180, 150, 100);

    gpath2.AddArc(rect, 0, 180);

    gp.DrawPath(p, gpath2);

}

运行效果如下:

GDI+路径(2) - Castor - 趁年轻,多折腾~~
 
左边是一个包含单一子路径的路径,右边则包含三个子路径,其中第二个是封闭的,因为使用的CloseFigure,而最后一个由于使用的是StartFigure方法,所以是开放的。

子路径信息的获取

由于路径中存在一个或者多个子路径,因此对于一个路径,需要有相应方法访问和控制其中的子路径,GDI+中提供GraphicsPathIterator类完成对路径的一个或者多个子路径的描述、管理和测试等工作。

GraphicsPathIterator的创建

public GraphicsPathIterator(GraphicsPath path);

用指定的GraphicsPath对象初始化GraphicsPathIterator 类的新实例。

GraphicsPathIterator的属性、方法

GraphicsPathIterator有两个重要的属性:CountSubpathCount,前者统计路径中点的个数,而后者计算路径中子路径的数目。

另外,GraphicsPathIterator类比较重要的方法如下:

方法

说明

CopyData

将关联的GraphicsPathPathPoints属性和PathTypes 属性数组复制到两个指定的数组中

Enumerate

将关联的GraphicsPathPathPoints属性和 PathTypes属性数组复制到两个指定的数组中

HasCurve

指示与此 GraphicsPathIterator 关联的路径是否包含曲线

NextMarker

将迭代程序移到路径中的下一个标记

NextPathType

获取全部具有相同类型的下一组数据点的起始索引和结束索引

NextSubpath

将此子路径移到指定 GraphicsPath 中的下一子路径

Rewind

将此 GraphicsPathIterator 重绕到其关联路径的起始处

下面的例子演示对子路径的基本操作:

private void button1_Click(object sender, EventArgs e)

{

    Graphics gp = this.CreateGraphics();

    GraphicsPath gpath = new GraphicsPath();

    Pen p = new Pen(Color.Red, 3f);

    //子路径1

    gpath.AddRectangle(new Rectangle(20, 50, 100, 50));

    //子路径2

    gpath.AddLine(150, 50, 300, 100);

    gpath.AddArc(new Rectangle(350, 50, 100, 100), 180f, 180f);

    //子路径3

    gpath.AddRectangle(new Rectangle(500, 50, 100, 100));

    //子路径4

    gpath.AddArc(new Rectangle(650, 50, 100, 100),270f,180f);

    gp.DrawPath(p, gpath);

    //子路径的操作

    GraphicsPathIterator iterator = new GraphicsPathIterator(gpath);

    int cnt = iterator.Count;

    int spcnt = iterator.SubpathCount;

    Font f = new Font("Arial", 12);

    gp.DrawString("路径中点的数目为:"+cnt.ToString(), f, new SolidBrush(Color.Green), new PointF(20, 150));

    gp.DrawString("路径子路径的数目为:" + spcnt.ToString(), f, new SolidBrush(Color.Green), new PointF(20, 165));

    //复制子路径,并绘制

    gp.TranslateTransform(0, 150);

    p = new Pen(Color.Blue,3.0f);

    GraphicsPath subpath = new GraphicsPath();

    iterator.Rewind();

    bool IsClosed;

    int i=iterator.NextSubpath(subpath, out IsClosed);//i返回子路径数目

    gp.DrawPath(p, subpath);

    gp.DrawString("该子路径是否封闭:" + IsClosed.ToString(), f, new SolidBrush(Color.Green), new PointF(20, 150));

    //跳过两个子路径

    i = iterator.NextSubpath(subpath, out IsClosed);

    i = iterator.NextSubpath(subpath, out IsClosed);

    i = iterator.NextSubpath(subpath, out IsClosed);

    gp.DrawPath(p, subpath);

    gp.DrawString("该子路径是否封闭:" + IsClosed.ToString(), f, new SolidBrush(Color.Green), new PointF(650, 150));

}

程序运行效果如下:

GDI+路径(2) - Castor - 趁年轻,多折腾~~
 另外,我们也可以使用GraphicsPathPathPoints方法获取其控制点,下面的例子显示了一个路径中所有的控制点

private void button1_Click(object sender, EventArgs e)

{

    Graphics gp = this.CreateGraphics();

    GraphicsPath gpath = new GraphicsPath();

    Pen p = new Pen(Color.Red, 3f);

    //子路径1

    gpath.AddRectangle(new Rectangle(20, 50, 100, 50));

    //子路径2

    gpath.AddLine(150, 50, 300, 100);

    gpath.AddArc(new Rectangle(350, 50, 100, 100), 180f, 180f);

    //子路径3

    gpath.AddRectangle(new Rectangle(500, 50, 100, 100));

    //子路径4

    gpath.AddArc(new Rectangle(650, 50, 100, 100),270f,180f);

    gp.DrawPath(p, gpath);

    //子路径的操作

    GraphicsPathIterator iterator = new GraphicsPathIterator(gpath);

    int cnt = iterator.Count;

    int spcnt = iterator.SubpathCount;

    Font f = new Font("Arial", 12);

    gp.DrawString("路径中点的数目为:"+cnt.ToString(), f, new SolidBrush(Color.Green), new PointF(20, 150));

    gp.DrawString("路径子路径的数目为:" + spcnt.ToString(), f, new SolidBrush(Color.Green), new PointF(20, 165));

   

    PointF[] pts = gpath.PathPoints;

    foreach(PointF pt in pts)

    {

        gp.FillRectangle(new SolidBrush(Color.Yellow),new RectangleF(pt.X-5,pt.Y-5,10,10));

    }

}

程序运行效果如下:

GDI+路径(2) - Castor - 趁年轻,多折腾~~

  评论这张
 
阅读(1304)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016