Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【愚公系列】2024年01月 GDI+绘图专题 GraphicsPath

【愚公系列】2024年01月 GDI+绘图专题 GraphicsPath

原创
作者头像
愚公搬代码
发布于 2024-01-04 06:08:12
发布于 2024-01-04 06:08:12
4070
举报
文章被收录于专栏:历史专栏历史专栏

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。

🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、联网、络安全、数据、工智能、U3D游戏、小程序等相关领域知识。

🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

GraphicsPath类是在WinForm中用于绘制自定义形状的类,它表示由一系列路径段和连接线段组成的形状。

GraphicsPath类可以用于创建和编辑几何路径,以便在图形设备上渲染复杂的形状。 GraphicsPath类提供了一系列方法,如AddLine、AddRectangle、AddEllipse等,用于向路径中添加线段、矩形、椭圆等几何形状。

GraphicsPath类还可以进行路径操作,如平移、旋转、缩放、联合、剪切、差异等,以创建更复杂的形状。例如,应用一个旋转变换可以在GraphicsPath中旋转图形,而将一个路径添加到另一个路径可以将两个形状组合成更复杂的形状。

GraphicsPath类可以用于绘制线条、多边形、曲线和文本等复杂形状,使得在WinForm应用程序中实现高级绘图功能变得更为容易。

🚀一、GraphicsPath

🔎1.属性

🦋1.1 FillMode属性

FillMode属性指定如何填充GraphicsPath对象的内部区域。它的值是FillMode枚举类型之一:Alternate和Winding。

  • Alternate表示交替填充图形内部的每个区域。具体来说,它会跳过每隔图形内部有一个交叉点时的绘制。这意味着如果两个区域重叠,则只绘制其中一个区域。
  • Winding表示按照顺时针或逆时针方向绘制GraphicsPath对象内部区域。如果两个区域重叠,则会绘制交叉区域的顶点。

以下是使用FillMode属性绘制两个图形的示例:

代码语言:csharp
AI代码解释
复制
//创建两个GraphicsPath对象,一个矩形和一个三角形
GraphicsPath path1 = new GraphicsPath();
path1.AddRectangle(new Rectangle(100, 100, 100, 100));

GraphicsPath path2 = new GraphicsPath();
path2.AddPolygon(new Point[] { new Point(50, 200), new Point(200, 200), new Point(125, 50) });

//设置FillMode属性为Alternate并绘制
path1.FillMode = FillMode.Alternate;
e.Graphics.FillPath(Brushes.Red, path1);

//设置FillMode属性为Winding并绘制
path2.FillMode = FillMode.Winding;
e.Graphics.FillPath(Brushes.Blue, path2);

🦋1.2 PathData属性

PathData属性返回一个PathData对象,该对象包含了GraphicsPath对象的几何形状数据。具体来说,PathData对象包含了一个PathPoints数组和一个PathTypes数组,分别用于存储路径的顶点和线段类型。

以下是路径数据的示例:

代码语言:csharp
AI代码解释
复制
//创建GraphicsPath对象和PathData对象
GraphicsPath path = new GraphicsPath();
path.AddEllipse(new Rectangle(100, 100, 100, 50));

PathData pathData = path.PathData;

//获取顶点数据并输出
PointF[] points = pathData.Points;
foreach (PointF point in points)
{
    Console.WriteLine("({0}, {1})", point.X, point.Y);
}

//获取线段类型数据并输出
byte[] types = pathData.Types;
foreach (byte type in types)
{
    Console.WriteLine(type);
}

🦋1.3 PathPoints属性

PathPoints属性是一个PointF数组,用于获取或设置GraphicsPath对象的所有顶点。这可以用于修改或者处理路径的顶点数据。

以下是修改顶点数据并重新绘制GraphicsPath对象的示例:

代码语言:c#
AI代码解释
复制
//创建一个GraphicsPath对象和一个Brush对象
GraphicsPath path = new GraphicsPath();
path.AddRectangle(new Rectangle(100, 100, 100, 100));

SolidBrush brush = new SolidBrush(Color.Red);

//绘制原始矩形
e.Graphics.FillPath(brush, path);

//修改顶点数据并重新绘制
PointF[] points = path.PathPoints;
for (int i = 0; i < points.Length; i++)
{
    points[i].Y += 50;
}

e.Graphics.FillPath(brush, path);

🦋1.4 PathTypes属性

PathTypes属性是一个byte数组,用于获取或设置GraphicsPath对象的所有线段类型。线段类型可以是线段、曲线、角等等。

以下是修改线段类型数据并重新绘制GraphicsPath对象的示例:

代码语言:c#
AI代码解释
复制
//创建一个GraphicsPath对象和一个Brush对象
GraphicsPath path = new GraphicsPath();
path.AddRectangle(new Rectangle(100, 100, 100, 100));

SolidBrush brush = new SolidBrush(Color.Red);

//绘制原始矩形
e.Graphics.FillPath(brush, path);

//修改线段类型数据并重新绘制
byte[] types = path.PathTypes;
for (int i = 0; i < types.Length; i++)
{
    if (types[i] == (byte)PathPointType.Line)
    {
        types[i] = (byte)PathPointType.Bezier3;
    }
}

e.Graphics.FillPath(brush, path);

FillMode、PathData、PathPoints和PathTypes属性可以用于操作和处理GraphicsPath对象的几何形状数据,从而实现更加复杂的图形绘制和处理。

🔎2.方法

🦋2.1 IsOutlineVisible

IsOutlineVisible是GraphicsPath类的一个方法,用于检查路径是否被指定的画笔和区域所覆盖。

该方法有两个重载:

  1. IsOutlineVisible(PointF point, Pen pen):判断指定的点是否在路径的边缘范围内,如果点在路径的边缘范围内,则返回True,否则返回False。
  2. IsOutlineVisible(PointF point, Pen pen, Graphics graphics):与第一个重载不同的是,需要传递一个Graphics对象,该对象用于指定路径的坐标系统。

示例代码:

代码语言:csharp
AI代码解释
复制
GraphicsPath path = new GraphicsPath();
path.AddRectangle(new Rectangle(10, 10, 100, 100));
Pen pen = new Pen(Color.Blue, 2);

// 判断指定点是否在路径的边缘范围内
bool isOutlineVisible = path.IsOutlineVisible(new PointF(10, 10), pen);
Debug.WriteLine(isOutlineVisible); // True

// 在指定的Graphics对象中绘制路径
using (Graphics g = this.CreateGraphics())
{
    g.DrawPath(pen, path);
}

// 使用Graphics对象判断指定点是否在路径的边缘范围内
bool isOutlineVisible1 = path.IsOutlineVisible(new PointF(120, 120), pen, this.CreateGraphics());
Debug.WriteLine(isOutlineVisible1); // False

在上面的代码中,我创建了一个矩形路径,并使用蓝色画笔在窗体中绘制出来。然后,我使用IsOutlineVisible方法检查两个点是否在路径的边缘范围内,并输出结果,其中第一个点在路径的边缘范围内,第二个点不在范围内。

需要注意的是,IsOutlineVisible方法只能检查点是否在路径的边缘范围内,如果需要检查点是否在路径内部,则需要使用IsVisible方法。同时,如果路径中存在多个子路径,则需要使用IsVisible方法的重载版本。

🦋2.2 IsVisible

在使用GraphicsPath的IsVisible方法时,需要提供一个Point对象作为参数,方法会返回一个bool值,表示该点是否在GraphicsPath中可见。

例如,以下代码创建了一个GraphicsPath对象,并使用IsVisible方法检查指定的点是否在路径中可见:

代码语言:csharp
AI代码解释
复制
GraphicsPath path = new GraphicsPath();
path.AddEllipse(0, 0, 100, 100);
bool isVisible = path.IsVisible(50, 50);
Debug.WriteLine(isVisible); // true

上述代码会创建一个椭圆形的GraphicsPath对象,并使用IsVisible方法检查指定的点(50,50)是否在路径中可见。

需要注意的是,IsVisible方法是针对路径的形状进行判断的,而不是路径的颜色或填充。如果路径已经被填充了,那么仍然可以使用IsVisible方法来判断填充区域的可见性。

🦋2.3 StartFigure

在使用GraphicsPath绘制图形时,StartFigure方法用于开始一个新的图形子路径。这个方法在绘制多个图形时非常有用,因为它可以帮助我们创建独立的图形,而不会互相影响。

例如,如果我们要绘制一个由两个矩形组成的图形,我们可以使用以下代码:

代码语言:csharp
AI代码解释
复制
GraphicsPath path = new GraphicsPath();
path.AddRectangle(new Rectangle(10, 10, 50, 50));
path.StartFigure();
path.AddRectangle(new Rectangle(70, 10, 50, 50));
Pen pen = new Pen(Color.Black, 2);
e.Graphics.DrawPath(pen, path);

在上面的代码中,我们首先创建了一个GraphicsPath对象,并使用AddRectangle方法添加了第一个矩形,然后调用StartFigure方法开始一个新的图形子路径,最后再添加第二个矩形。这样,我们就创建了两个独立的矩形,它们不会相互连接。

另外,StartFigure方法还可以用于创建空的图形子路径,如下所示:

代码语言:csharp
AI代码解释
复制
GraphicsPath path = new GraphicsPath();
path.StartFigure();
path.AddLine(new Point(10, 10), new Point(50, 50));
Pen pen = new Pen(Color.Black, 2);
e.Graphics.DrawPath(pen, path);

在上面的代码中,我们创建了一个空的图形子路径,并使用AddLine方法添加了一条线段。这种方法可以让我们在不同的位置创建不同的图形,而不会互相干扰。

🦋2.4 CloseFigure

GraphicsPath是一个用于创建和管理图形路径的类,它允许您定义一个形状并在其中添加线条、曲线和其他图形元素。

CloseFigure是GraphicsPath中的一个方法,它可用于将当前路径的最后一个点与路径的起始点连接起来,形成一个封闭的形状。当您需要创建具有填充和边框的封闭形状时,CloseFigure非常有用。

下面是一个示例,展示了如何使用CloseFigure来创建一个简单的封闭路径:

代码语言:csharp
AI代码解释
复制
GraphicsPath path = new GraphicsPath();
path.AddLine(10, 10, 50, 50);
path.AddLine(50, 50, 10, 90);
path.AddLine(10, 90, 10, 10);
path.CloseFigure();

Pen pen = new Pen(Color.Black, 2);
e.Graphics.DrawPath(pen, path);

在这个示例中,我们使用AddLine方法添加三条线条来创建一个三角形路径。然后,我们使用CloseFigure方法将路径封闭起来。最后,我们使用DrawPath方法将路径绘制在Graphics对象上。

请注意,如果您想绘制填充的形状,您需要使用Graphics对象的FillPath方法而不是DrawPath方法。

🦋2.5 CloseAllFigures

GraphicsPath是C#中的一个类,用于表示一个二维图形的路径,包括曲线和直线等。CloseAllFigures是其中的一个方法,它的作用是关闭所有的子路径,使其成为一个完整的图形路径。

具体来说,当我们使用GraphicsPath类的AddXXX方法添加多条路径时,这些路径会被视为子路径,而CloseAllFigures方法可以将这些子路径连接起来,形成一个闭合的路径,使其成为一个完整的图形。

例如,下面的代码创建了一个GraphicsPath对象,并添加了两条直线和一条曲线。在调用CloseAllFigures方法后,这些路径就会被连接成一个封闭的路径。

代码语言:csharp
AI代码解释
复制
GraphicsPath path = new GraphicsPath();
path.AddLine(0, 0, 50, 50);
path.AddLine(50, 50, 100, 0);
path.AddBezier(100, 0, 150, 50, 200, -50, 250, 0);
path.CloseAllFigures();

Pen pen = new Pen(Color.Black, 2);
e.Graphics.DrawPath(pen, path);

注意,如果使用CloseFigure方法只会关闭当前路径,而不会影响其他子路径。因此,如果需要完全闭合整个图形路径,应该使用CloseAllFigures方法。


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2024年01月 GDI+绘图专题 Region
在WinForm中,Region可以被用来定义或裁剪控件的形状。它可以用于创建不规则的控件,如圆形、椭圆形、星型等。Region可以被用于以下场景:
愚公搬代码
2024/01/05
3380
(四十)c#Winform自定义控件-开关
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/09
1.5K0
(四十)c#Winform自定义控件-开关
CSharp代码示例每日一讲: 在GDI+中使用填充Fill方法
CSharp代码示例每日一讲,为刚刚学习编程的人准备,利用最简单的代码介绍CSharp编程知识! 画笔Pen被用来绘制图形、形状,画刷用来填充图形形状的内部。今天,我们将介绍图形类的填充方法。您只能填充某些图形形状;在Graphics类中只有少量的填充方法。 FillCloseCurve方法 FillCloseCurve填充曲线的内部,填充曲线的第一个参数是画刷,它可以是实心画刷solid brush, 影线画刷hatch brush, 或者渐变画刷gradient brush。第二个参数是绘制点的数组,第
程序你好
2018/07/20
1.6K0
【愚公系列】2023年12月 GDI+绘图专题 Matrix
WinForm中的Matrix是一个矩阵类,用于表示二维矩阵。它属于System.Drawing命名空间下的Matrix类。Matrix类表示一个二维仿射变换矩阵,其中包含有关旋转、平移、缩放和倾斜的信息。这个类可以用于WinForm中的图形变换、图形绘制以及几何计算等方面。
愚公搬代码
2023/12/27
2240
【愚公系列】2023年12月 GDI+绘图专题 Pen
Pen是在WinForm中用于绘制线条、轮廓和边框的对象。它定义了一个画笔,具有不同的颜色、宽度和样式。在绘制图形或图形对象时,Pen对象通常会与Graphics对象一起使用。
愚公搬代码
2023/12/28
2130
利用GDI+制作背景颜色淡入淡出效果的按钮
用过QQ2009的网友都知道QQ主面板的界面非常炫丽,特别好看,鼠标移上去还有淡入淡出的效果。那这样效果是怎么做出来的呢?其实不难,只要自定义一个用户控件的外怪就可以了,用到GDI+技术和时钟控件来操作…
SAP梦心
2022/05/09
1.1K0
(五十五)c#Winform自定义控件-管道
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/09
1.1K0
代码挑战画 魔法圣诞树
2022年圣诞节到来啦,很高兴这次我们又能一起度过~ 本文会基于C# GDI+技术 实现魔法圣诞树效果!源码和素材在文末全部都有!
天罡gg
2022/12/25
1.3K0
代码挑战画 魔法圣诞树
(三十四)c#Winform自定义控件-Tab页
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
1.6K0
(三十四)c#Winform自定义控件-Tab页
【愚公系列】2023年12月 GDI+绘图专题 颜色获取和图形绘制
颜色获取是指从图像或者其他的颜色源中获取颜色值的过程。在计算机中,颜色值通常由RGB值来表示,即红、绿、蓝三原色的取值组合。通常可以通过鼠标选择选取颜色和颜色值,或者通过程序代码指定颜色值来获取颜色。
愚公搬代码
2023/12/24
2850
【愚公系列】2024年01月 GDI+绘图专题(裁剪、变换、重绘)
裁剪(Clipping)指的是将图像或元素的一部分进行裁剪,只显示所需区域,而隐藏不需要的部分。
愚公搬代码
2024/01/11
7361
鸿蒙原生绘图 API:从基础到高阶的绘制之旅(进阶版)
家人们,还记得上次一起探索的鸿蒙绘图 API 基础用法吗?上手是不是特别容易!今天,咱们就接着深入,开启进阶版的学习,解锁更多复杂又炫酷的绘图技能,让你的鸿蒙应用界面直接“出圈”!
陈杨
2025/03/15
600
【愚公系列】2023年12月 GDI+绘图专题 Rectangle
在WinForm中,Rectangle是一个表示矩形的类,它包含了多个属性和方法,下面是一些常用的属性和方法介绍:
愚公搬代码
2023/12/26
2650
(五十八)c#Winform自定义控件-管道阀门(工业)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/09
7470
【愚公系列】2023年12月 GDI+绘图专题 Point
Point是Windows Forms中的一个类,它表示一个具有二维X和Y坐标的点。可以用来表示控件上的位置、鼠标的位置、绘图的起始点等。
愚公搬代码
2023/12/25
2380
【愚公系列】2024年01月 GDI+绘图专题 DrawImage
在WinForm中,可以使用Graphics类的DrawImage方法来绘制图像。具体步骤如下:
愚公搬代码
2024/01/03
4860
(六十二)c#Winform自定义控件-警灯(工业)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
5520
(六十二)c#Winform自定义控件-警灯(工业)
(六十四)c#Winform自定义控件-温度计(工业)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/29
1.6K0
(六十四)c#Winform自定义控件-温度计(工业)
【愚公系列】2023年12月 GDI+绘图专题 Brush
在WinForm中,Brush是用于填充绘制图形的对象,它们提供了不同的填充方式和样式。在绘制图形时,可以通过Graphics对象的Fill方法使用Brush进行填充。以下是一些常见的Brush类型:
愚公搬代码
2023/12/29
3240
(三十九)c#Winform自定义控件-面包屑导航
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/09
6880
(三十九)c#Winform自定义控件-面包屑导航
推荐阅读
相关推荐
【愚公系列】2024年01月 GDI+绘图专题 Region
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档