您的当前位置:首页>全部文章>文章详情

【C#】C# Winform GDI+ 绘图

CrazyPanda发表于:2024-02-18 22:31:33浏览:389次TAG:

目录

一、概述

二、绘图

1.画直线

2.画矩形

3.画圆、圆弧

4.画扇形

5.画多边形

6.绘制字符串

7.填充图形

结束





一、概述

Graphics类是GDI+技术的一个基本类。GDI+(Graphics Device Interface)是.NET框架的重要组成部分,提供对二维图形图像和文字排版处理的支持。

GDI+相关的类分布在下列命名空间中:
System.Drawing:提供了最基本的绘图功能(比如画直线、矩形、椭圆等);
System.Drawing.Drawing2D: 提供了高级的二维和矢量绘图功能(比如渐变、 图案填充、- 轨迹等)
System.Drawing.Imaging: 提供图像处理功能
System.Drawing.Text: 提供排版功能
System.Drawing.Printing: 提供与打印相关的服务


坐标系

在 GDI 绘图中,水平轴 X 由左到右,垂直轴 Y 由上到下

1.png


画笔 Pen

定义用于绘制直线和曲线的对象。 此类不能被继承。

主要用来定义画笔的相关设置,比如直线,虚线,线条的颜色等,

//定义一个画笔,线条颜色是黑色,线条为虚线,虚线之间的间隔为3像素
Pen Pens1 = new Pen(new SolidBrush(Color.Black), 2);
Pens1.DashStyle = DashStyle.Custom;
Pens1.DashPattern = new float[] { 3, 3 };


绘图类常用属性和方法

Graphics 常用的属性和方法下图,图片来源 链接 ,另外参考微软官方的文档:点击跳转

1.png


二、绘图

绘图我一般在 PictureBox 控件中进行,在此之前,我们需要先做一张背景图片,打开 Windows 自带的画图软件

1.png

点击调整大小,假设  PictureBox 控件的大小是 800 * 800,那么我们就将画图调整为 800 * 800

随后将图片保存到项目的文件夹中

1.png

打开 Resources.resx

1.png

如果第一次打开,这里应该是字符串,手动切换到图片

1.png

将 UI 文件夹中的 white.png 图片直径拖过来就行了

1.png

在窗体中拖入一个 PictureBox 控件

1.png

点击  PictureBox 组件,找到 Image 属性,选择图片

1.png

选中 white ,然后点击确定

1.png

这样图片就添加完成了,下面开始画图


1.画直线

画一条直线只需要提供两个坐标。

函数重载

1.png

代码 

using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace Test3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Pen pens = new Pen(new SolidBrush(Color.Red), 1);//线条的粗细
            pens.DashStyle = DashStyle.Solid;//线条的线型
 
            Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
            pictureBox1.Image.Dispose();
 
            Point start = new Point(300, 300);
            Point end = new Point(100, 100);
            g.DrawLine(pens, start, end);
 
            g.Dispose();
 
            pictureBox1.Image = bmp;
        }
    }
}

效果

01174706_63da351a96fff24847.gif


2.画矩形

绘制由坐标对、宽度和高度指定的矩形。(注意,x,y 的位置是矩形的左上角)

参数
pen
Pen
Pen,它确定矩形的颜色、宽度和样式。

x
Int32
要绘制的矩形的左上角的 x 坐标。

y
Int32
要绘制的矩形的左上角的 y 坐标。

width
Int32
要绘制的矩形的宽度。

height
Int32
要绘制的矩形的高度。


下面是函数的重载

1.png


代码

using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace Test3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Pen pens = new Pen(new SolidBrush(Color.Red), 1);//线条的粗细
            pens.DashStyle = DashStyle.Solid;//线条的线型
 
            Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
            pictureBox1.Image.Dispose();
 
            Rectangle rec = new Rectangle(100, 100, 200, 200);
            g.DrawRectangle(pens, rec);
 
            g.Dispose();
 
            pictureBox1.Image = bmp;
        }
    }
}

效果

1.png


3.画圆、圆弧

画圆稍微特殊一点,首先需要提供一个矩形的参数,矩形的坐标是在矩形的左上角,矩形的宽和高则决定了这个圆是一个标准的圆还是一个椭圆,另外需要提供两个参数,弧线的起始角和画多少度角为止

pen
Pen
Pen,它确定弧线的颜色、宽度和样式。

x
Int32
定义椭圆的矩形的左上角的 x 坐标。

y
Int32
定义椭圆的矩形的左上角的 y 坐标。

width
Int32
定义椭圆的矩形的宽度。

height
Int32
定义椭圆的矩形的高度。

startAngle
Int32
从 x 轴到弧线的起始点沿顺时针方向度量的角(以度为单位)。

sweepAngle
Int32
从 startAngle 参数到弧线的结束点沿顺时针方向度量的角(以度为单位)。

1.png

函数的重载

1.png

代码

using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace Test3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Pen pens = new Pen(new SolidBrush(Color.Red), 2);//线条的粗细
            pens.DashStyle = DashStyle.Solid;//线条的线型
 
            Pen pen2 = new Pen(new SolidBrush(Color.Green), 1);
 
            Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
            pictureBox1.Image.Dispose();
 
            Rectangle rectangle = new Rectangle(100, 100, 200, 200);
            g.DrawRectangle(pen2, rectangle);
            //画弧线
            g.DrawArc(pens, rectangle, 180, 90);
 
            g.Dispose();
 
            pictureBox1.Image = bmp;
        }
    }
}

效果(下图矩形是画的辅助线,不要注释掉 DrawRectangle 这行代码就行了)

1.png


4.画扇形

绘制一个扇形,该形状由一个坐标对、宽度、高度以及两条射线所指定的椭圆定义。

Pen
Pen,它确定扇形的颜色、宽度和样式。

x
Int32
边框的左上角的 x 坐标,该边框定义扇形所属的椭圆。

y
Int32
边框的左上角的 y 坐标,该边框定义扇形所属的椭圆。

width
Int32
边框的宽度,该边框定义扇形所属的椭圆。

height
Int32
边框的高度,该边框定义扇形所属的椭圆。

startAngle
Int32
从 x 轴到扇形的第一条边沿顺时针方向度量的角(以度为单位)。

sweepAngle
Int32
从 startAngle 参数到扇形的第二条边沿顺时针方向度量的角(以度为单位)。

函数的重载

1.png

 代码

using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace Test3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Pen pens = new Pen(new SolidBrush(Color.Red), 2);//线条的粗细
            pens.DashStyle = DashStyle.Solid;//线条的线型
 
            Pen pen2 = new Pen(new SolidBrush(Color.Green), 1);
 
            Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
            pictureBox1.Image.Dispose();
 
            Rectangle rectangle = new Rectangle(100, 100, 200, 200);
            g.DrawRectangle(pen2, rectangle);
            //画扇形
            g.DrawPie(pens, rectangle, 0, 90);
 
            g.Dispose();
 
            pictureBox1.Image = bmp;
        }
    }
}

效果

1.png


5.画多边形

绘制由一组 Point 结构定义的多边形

Pen
Pen,它确定多边形的颜色、宽度和样式。

points
Point[]
Point 结构数组,这些结构表示多边形的顶点。

函数的重载

1.png

画多边形是由一组顶点组成的,如下图,把相邻的点连接在一起,无论从那个方向,最终的图形都是一样的,具体效果看下面的案例

1.png

代码

using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace Test3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Pen pens = new Pen(new SolidBrush(Color.Red), 2);//线条的粗细
            pens.DashStyle = DashStyle.Solid;//线条的线型
 
            Pen pen2 = new Pen(new SolidBrush(Color.Green), 1);
 
            Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
            pictureBox1.Image.Dispose();
 
            //画多边形
            Point[] points ={
                           new Point(100,200),
                           new Point(200,300),
                           new Point(400,300),
                           new Point(400,100),
                           new Point(200,100),
                           };
            g.DrawPolygon(pens, points);
 
            g.Dispose();
 
            pictureBox1.Image = bmp;
        }
    }
}

 效果

1.png


6.绘制字符串

在指定位置并且用指定的 Brush 和 Font 对象绘制指定的文本字符串

String
要绘制的字符串。

font
Font
Font,它定义字符串的文本格式。

brush
Brush
Brush,它确定所绘制文本的颜色和纹理。

x
Single
所绘制文本的左上角的 x 坐标。

y
Single
所绘制文本的左上角的 y 坐标。

format
StringFormat
StringFormat,它指定应用于所绘制文本的格式化特性(如行距和对齐方式)。

函数的重载

1.png

代码


using System.Drawing.Drawing2D;
 
namespace Test3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Pen pens = new Pen(new SolidBrush(Color.Red), 2);//线条的粗细
            pens.DashStyle = DashStyle.Solid;//线条的线型
 
            Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
            pictureBox1.Image.Dispose();
 
            string text = "绘制的文字";
            int fontSize = 15;
            Color lineColor = Color.Red;
            int fontPosX = 100;
            int fontPosY = 100;
 
            Font myFont = new Font("宋体", fontSize, FontStyle.Regular);
            Brush bush = new SolidBrush(lineColor);
            g.DrawString(text, myFont, bush, fontPosX, fontPosY);
 
            g.Dispose();
 
            pictureBox1.Image = bmp;
        }
    }
}

效果:

1.png


7.填充图形

填充图形的接口可以参考下图,当然,微软实际绘图和填充图形的方法和属性是要比下图多的多,但常用的功能我这里基本都做了介绍了

1.png

这里就用上面的多边形例子基础上做新的一个案例

using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace Test3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Pen pens = new Pen(new SolidBrush(Color.Red), 2);//线条的粗细
            pens.DashStyle = DashStyle.Solid;//线条的线型
 
            Pen pen2 = new Pen(new SolidBrush(Color.Green), 1);
 
            Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
            pictureBox1.Image.Dispose();
 
            //画多边形
            Point[] points ={
                           new Point(100,200),
                           new Point(200,300),
                           new Point(400,300),
                           new Point(400,100),
                           new Point(200,100),
                           };
            g.DrawPolygon(pens, points);
            //填充图形
            g.FillPolygon(Brushes.Pink, points);
 
            g.Dispose();
 
            pictureBox1.Image = bmp;
        }
    }
}

效果

1.png

源码:点击下载


结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end


原文链接C# Winform GDI+ 绘图_c#gdi-CSDN博客

猜你喜欢

【C#】c#开发桌面应用程序用什么框架
style="text-wrap: wrap;">在C#开发桌面应用程序时,可以使用以下几种常见的框架:</p><ol class=" list-paddingleft-2" style="width: 1529.1px; text-wrap: wrap;"><li><p>Windows Forms:这是一种由.NET Framework提供的GUI框架,它提供了丰富的GUI控件和易于使用的编程模型。Windows Forms在C#开发领域中使用非常广泛,并且已经存在多年,获得了广泛的支持和优化。</p></li></ol
发表于:2024-01-27 浏览:452 TAG:
【C#】C# Winform 自定义进度条ProgressBar
效果:一、前言Winfrom各种老毛病真的不适合做大型项目,甚至中型项目都不适合,一些小功能都能把你折腾半死,比如,我想在界面上显示一个进度条,用来显示现在硬盘和内存已经使用了多少,使用了 ProgressBar 控件你看看效果:进度条中间一直有个白色光影在晃来晃去的,是不是想让别人感慨:“哇!好强的光芒,我的眼睛快睁不开了...”。而且背景颜色无法改变,这个动画也无法关掉,为了解决这两个问题,我找了很久,终于找到了下面的解决方法。二、自定义进度条于是我在网上找了一些资料,有到效果有,但不是特别
发表于:2024-02-01 浏览:338 TAG:
【C#】C# Winform 配置文件App.config
目录一、简介二、添加引用&nbsp;三、添加节点1.普通配置节点2.数据源配置节点四、管理类 ConfigHelper.cs1.获取配置节点2.更新或加入配置节点结束一、简介在C#中,配置文件很常用,ASP.NET 和 Winform 名称不同,用法一样,如下图config 文件通常用来存储一些需要修改的数据,比如用户名密码,连接数据库的IP地址等,而不是在代码中写死。有人可能会问,那我自己自定义一个配置文件也行,为什么要用它这个?区别当然有,微软自己封装的读取和写入会更简单一些,你自己封装的,
发表于:2024-01-31 浏览:385 TAG:
【C#】Winform NanUI 0.77版本 清除Cookie等本地缓存
目录需求NanUI0.88版本的缓存路径NanUI0.77版本的缓存路径试着实现功能添加扩展出现的问题解决问题结束需求清除web前端保存的一些的数据,或者清除浏览器缓存会用到。NanUI0.88版本的缓存路径在NanUI0.88版本中,只要在Program.cs启动模块中调用app.ClearCacheFile();就可以清除浏览的缓存了。0.88版本的缓存路径:&quot;C:\\Users\\Administrator\\AppData\\Roaming\\Net Dimension Stu
发表于:2024-02-08 浏览:319 TAG:
【C#】C# 自动更新(基于FTP)
目录一、前言二、功能的实现1.本地黑名单2.读取配置文件3.读取 FTP 文件列表4.读取本地文件5.匹配更新6.版本的切换三、环境搭建四、常见问题2023.12.30 更新结束效果启动软件后,会自动读取所有的 FTP 服务器文件,然后读取本地需要更新的目录,进行匹配,将 FTP 服务器的文件同步到本地Winform 界面一、前言在去年,我写了一个 C# 版本的自动更新,这个是根据配置文件 + 网站文件等组成的框架,以实现本地文件的新增、替换和删除,虽然实现了自动更新的功能,但用起来过于复杂,代
发表于:2024-02-03 浏览:367 TAG:
【C#】Winform NanUI 0.77版本 JS和C#相互调用
目录一、导入插件二、常用方法三、C#和JS相互调用1.C# 调用JS2.JS调用C#方法3.完整版C#代码4.完整版JS代码结束一、导入插件用的NanUI版本0.77参考官方地址:https://docs.formium.net/zh-hans/tutorial/first-app.html二、常用方法基础代码:using&nbsp;NetDimension.NanUI; using&nbsp;NetDimension.NanUI.Browser; &nbsp; class&nbsp;MainW
发表于:2024-02-06 浏览:394 TAG:
【C#】Winform NanUI 相关功能整合
目录NanUI 0.88版本 去掉启动界面(遮罩)NanUI 0.88版本 读取本地资源和嵌入式资源NanUI 0.77版本 打开控制台NanUI 0.77版本 C#调用多个参数的JS方法NanUI 0.77版本 传递数组参数NanUI 0.77版本 设置窗体全屏显示(类似Kiosk模式)NanUI 0.77版本 Bootstrap类 APINanUI 0.88版本 去掉启动界面(遮罩)启动界面是作者给我们显示公司产品的Logo用的,如果用不着可以去掉,但必须要更改源码,如果不想改源码,直接将启
发表于:2024-02-09 浏览:383 TAG:
【C#】C# Winform程序之间通讯
实现原理通过Windows系统中 User32.dll 中的 FindWindow 方法来寻找系统正在运行的程序句柄,通过 SendMessage 方法来发送消息,winform 中的&nbsp;WndProc 方法来接收消息,下面是SendMessage,FindWindow 这两个参数的具体介绍:1.SendMessage该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。该函数是应用程序和应用程序之间进行消息传递的主要手段之一 函数原型:I
发表于:2024-01-30 浏览:392 TAG:
【C#】从零开始用C#写一个桌面应用程序(二)一个表白程序
恶搞表白小程序如何添加按钮,如何添加属性和事件请移步前文。基础操作第一步:新建窗口&nbsp;&nbsp;在工具箱内找到label和button,拖到form上,设置它们的size属性,autosize属性,text属性。第二步:添加事件为了实现我们的效果,需要给三个按钮分别设计点击事件,鼠标移入事件,鼠标点下事件。分别为click,mouseenter,mousedown事件。第三步:实现移动逻辑this获取form对象,clientsize获取实时大小,使用随机数值,设置对应按钮位置。将对应
发表于:2024-01-30 浏览:304 TAG:
【C#】C#二分查找(迭代与递归)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二分搜索被定义为一种在排序数组中使用的搜索算法,通过重复将搜索间隔一分为二。二分查找的思想是利用数组已排序的信息,将时间复杂度降低到O(log N)。二分查找算法示例&nbsp;何时在数据结构中应用二分查找的条件: 应用二分查找算法: &nbsp; &nbsp; &nbsp; &nbsp; 1、数据结构必须是有序的。 &nbsp; &nbsp; &nbsp; &nbsp; 2、访问数据结构的任何元素都
发表于:2024-03-11 浏览:315 TAG: