C#的GDI+绘图详解

        创建 Graphics 的对应3个方法。

        // 1.在窗体或控件的Paint事件中,用PaintEventArgs e 创建绘图对象   ---- 控件或窗体重绘时
                private void Form1_Paint(object sender, PaintEventArgs e)
                {
                    Graphics g = e.Graphics;    //绘图对象   
                }

        //2.创建绘图对象 panel1中绘图
                Graphics g = panel1.CreateGraphics();  //为控件创建绘图对象

        //3.基于图片去绘制
                Graphics g = Graphics.FromImage(Image.FromFile("imgs/05.jpg"));

        //--------------------以上方法三选一

        //呈现质量
                g.SmoothingMode= SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

        //开始绘制。。。

        private void btnLine_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
             Graphics g = panel1.CreateGraphics();  //为控件创建绘图对象
             //呈现质量
             g.SmoothingMode= SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //开始绘制。。。
            //1.画一条直线
            Pen pen01 = new Pen(Color.Green, 2);
            g.DrawLine(pen01, 10, 10, 100, 10);//画一条线,起点(10,10)   终点(100,10)
            g.DrawLine(pen01, new Point(100, 10), new Point(100, 100));//画一条线,起点(100,10)   终点(100,100)
            g.DrawLine(pen01, new Point(100, 100), new Point(10, 100));
            g.DrawLine(pen01, new Point(10, 100), new Point(10, 10));
            pen01.Dispose();

            //2.画多条直线 点依次连接起来
            Pen pen03 = new Pen(Color.Red, 2);
            Point[] points = new Point[]
            {
                new Point(200, 10),
                new Point(300, 10),
                new Point(300,150),
                new Point(200,100),
                new Point(200, 10)
            };
            g.DrawLines(pen03, points);
            pen03.Dispose();

            //释放绘图对象
            g.Dispose();
        }

        private void btnCurve_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //画曲线
            Pen pen01 = new Pen(Color.Green, 2);
            Point[] points = new Point[]
            {
                  new Point(100, 10),//起点
                  new Point(300, 50),//控制点
                  new Point(200,100),//控制点
                  new Point(400,150),//控制点
                  new Point(300,180),//控制点
                  new Point(200,130) //终点
            };
            //g.DrawCurve(pen01, points);//没有指定张力,默认0.5
            g.DrawCurve(pen01, points,0.6f);
            pen01.Dispose();

            g.Dispose();
        }

        private void btnClosedCurve_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //画曲线
            Pen pen01 = new Pen(Color.Green, 2);
            Point[] points = new Point[]
            {
                 new Point(100, 200),//起点
                 new Point(200, 150),//控制点
                 new Point(300,100),//控制点
                 new Point(350,200),//控制点
                 new Point(380,270),//控制点
                 new Point(400,230)//终点
            };          
            //填充闭合曲线
            g.FillClosedCurve(new SolidBrush(Color.Pink), points);
            //绘制闭合曲线
            g.DrawClosedCurve(pen01, points);
            pen01.Dispose();    

            g.Dispose();
        }

        private void btnArc_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //画弧线
            Pen pen01 = new Pen(Color.Green, 2);
            //画弧线  起始角度 180,旋转60度
            g.DrawArc(pen01, new Rectangle(50, 20, 200, 100), 180, 60);
            // g.DrawEllipse(new Pen(Color.Red,1), new Rectangle(50, 20, 200, 100));
            //画弧线  起始角度 0,旋转120度
            g.DrawArc(new Pen(Color.Purple, 3), new Rectangle(50, 20, 200, 100), 0, 120);
            //画弧线  起始角度 90,旋转120度
            g.DrawArc(new Pen(Color.Navy, 3), new Rectangle(100, 100, 200, 200), 90, 120);
            pen01.Dispose();

            g.Dispose();
        }

        private void btnEllipse_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            Pen pen01 = new Pen(Color.Orange, 2);
            Rectangle rect = new Rectangle(100, 50, 200, 100);
            //填充椭圆内部
            g.FillEllipse(new SolidBrush(Color.Pink), rect);
            //画椭圆
            g.DrawEllipse(pen01, rect);

            g.FillEllipse(new SolidBrush(Color.LightBlue), 400, 50, 100, 100);
            //画圆
            g.DrawEllipse(pen01, 400, 50, 100, 100);

            //另一种:都填充----边框和背景填充
            //边框椭圆填充
            g.FillEllipse(new SolidBrush(Color.Orange), 100, 200, 200, 100);
            //背景椭圆填充
            g.FillEllipse(new SolidBrush(Color.Pink), 100+2, 200+2, 200-2*2, 100-2*2);

            pen01.Dispose();

            g.Dispose();
        }

        private void btnRectangle_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //画矩形及填充
            Pen pen01 = new Pen(Color.Orange, 2);
            Rectangle rect = new Rectangle(100, 50, 300, 100);
            //填充矩形
            g.FillRectangle(new SolidBrush(Color.LightGreen), rect);
            //填充多个矩形的内部
            g.FillRectangles(new SolidBrush(Color.LightSkyBlue), new Rectangle[] {
                new Rectangle(300,200,100,50),
                new Rectangle(450,200,50,50),
                new Rectangle(300,300,80,60)
            });
            //画矩形
            g.DrawRectangle(pen01, rect);
            //画多个矩形
            g.DrawRectangles(pen01,new Rectangle[] { 
                new Rectangle(300,200,100,50),
                new Rectangle(450,200,50,50),
                new Rectangle(300,300,80,60)
            });
            pen01.Dispose();

            g.Dispose();
        }
        private void btnPolygon_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //画多边形及填充
            Pen pen01 = new Pen(Color.Orange, 2);
            //定义多边形的形状
            Point[] points =
            {
                new Point(100,50),
                new Point(300,100),
                new Point(300,200),
                new Point(200,170),
                new Point(140,120)
            };
            //填充
            g.FillPolygon(new SolidBrush(Color.Gray), points);
            //画多边形
            g.DrawPolygon(pen01, points);
            Point[] points1 =
            {
                new Point(300,50),
                new Point(400,50),
                new Point(480,200),
                new Point(350,150)
            };
            //填充多边形
            g.FillPolygon(new SolidBrush(Color.DarkOrchid), points1);
            pen01.Dispose();

            g.Dispose();
        }

        private void btnPie_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //扇形的绘制与填充
            Pen pen01 = new Pen(Color.Orange, 2);
            Rectangle rect = new Rectangle(100, 20, 100, 100);
            //填充
            g.FillPie(new SolidBrush(Color.LightBlue), rect, 0, 60);
            //绘制扇形  60
            g.DrawPie(pen01, rect, 0, 60);
            pen01.Dispose();

            g.Dispose();
        }

        private void btnPath_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //路径的绘制与填充
            Pen pen01 = new Pen(Color.Orange, 2);
            //路径 
            GraphicsPath path1 = new GraphicsPath();
            path1.AddLine(50, 50, 50, 100);//直线
            path1.AddArc(new Rectangle(50, 50, 100, 100), 270, 90);//弧线
            path1.AddLines(new Point[]   //两条直线
            {
                new Point(200,100),
                new Point(200,150),
                new Point(100,200)
            });
            //添加曲线
            path1.AddCurve(new Point[]
            {
                 new Point(100,200),
                 new Point(50,120),
                 new Point(20,100),
                 new Point(50, 50)
            });

            //添加闭合曲线
            GraphicsPath path2 = new GraphicsPath();
            path2.AddClosedCurve(new Point[]
            {
                new Point(100,30),
                new Point(150,50),
                new Point(200,20)
            });
            //追加子路径
            path1.AddPath(path2,true);

            //添加椭圆
            path1.AddEllipse(new Rectangle(220, 100, 100, 60));

            //添加扇形
            path1.AddPie(new Rectangle(200, 200, 100, 200), 200, 100);
            //添加文字
            path1.AddString("复合图形", this.Font.FontFamily, (int)FontStyle.Italic, 14, new Point(100, 300), new StringFormat() { Alignment = StringAlignment.Center });

            //填充路径
            g.FillPath(new SolidBrush(Color.LightBlue), path1);
            //绘制路径
            g.DrawPath(pen01, path1);
            pen01.Dispose();

            g.Dispose();
        }

        private void btnImageAndIcon_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //图片绘制
            Image imgs = Image.FromFile("Imgs/04-jh.jpg");
            g.DrawImage(imgs, new Rectangle(50, 50, 100, 100));//以指定尺寸在指定位置处绘制图片
            //g.DrawImage(imgs, new Point(100, 50));//指定位置处以原始大小绘制,没有缩放图片
            //g.DrawImageUnscaled(imgs, new Point(100, 50));//指定位置处以原始大小绘制,没有缩放图片
            //g.DrawImageUnscaledAndClipped(imgs, new Rectangle(50, 50, 100, 100));//不缩放,以指定尺寸进行绘制,需要时会进行裁剪

            //图标绘制
            Icon icon = new Icon("Imgs/zxlogo.ico");
            g.DrawIcon(icon, new Rectangle(200, 50, 50, 50)); //会进行缩放
            //g.DrawIconUnstretched(icon, new Rectangle(300, 50, 100, 100));//不会根据目标尺寸进行缩放

            g.Dispose();
        }

        private void btnFont_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias
            
            //绘制文字
            g.DrawString("正在绘制文本", new Font("微软雅黑", 14f, FontStyle.Bold), new SolidBrush(Color.ForestGreen), new Point(100, 100));
            Rectangle rect = new Rectangle(200, 150, 100, 40);
            g.FillEllipse(new SolidBrush(Color.LightBlue), new Rectangle(200, 150, 100, 40));
            //g.DrawString("添加站点", new Font("微软雅黑", 13, FontStyle.Bold), new SolidBrush(Color.White), 215, 157);
            StringFormat format = new StringFormat();
            //水平垂直都居中
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;
            g.DrawString("添加站点", new Font("微软雅黑", 13, FontStyle.Bold), new SolidBrush(Color.White),rect, format);
            
            g.Dispose();
        }
        //标签重绘
        private void label1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;

            g.Clear(label1.BackColor);
            Rectangle rect = label1.ClientRectangle;//工作区矩形
            Rectangle rect1 = new Rectangle(rect.X, rect.Y, rect.Width - 1, rect.Height - 1);
            g.DrawRectangle(new Pen(Color.OrangeRed, 1), rect1);
            StringFormat format = new StringFormat();
            //水平垂直都居中
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;
            g.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect, format);
        }

        //圆角矩形的绘制
        private void btnRoundRect_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //圆角矩形的绘制
            Pen pen01 = new Pen(Color.Orange, 2);
            Rectangle rect1 = new Rectangle(100, 50, 200, 100);
            //圆角路径
            GraphicsPath roundRect = GetRoundRect(rect1, 10);
            //填充圆角矩形
            g.FillPath(new SolidBrush(Color.LightBlue), roundRect);
            //画圆角矩形形状
            g.DrawPath(pen01, roundRect);
            pen01.Dispose();

            g.Dispose();
        }

        // 返回圆角矩形路径   四个圆角是一样的
        private GraphicsPath GetRoundRect(Rectangle rect,int r)
        {
            GraphicsPath path = new GraphicsPath();
            int x = rect.X;
            int y = rect.Y;
            int w= rect.Width;
            int h= rect.Height;
            int d = 2 * r;//直径
            //左上角
            path.AddArc(new Rectangle(x, y, d, d), 180, 90);
            //上方
            path.AddLine(x + r, y, x + w - r, y);
            //右上角
            path.AddArc(new Rectangle(x + w - d, y, d, d), 270, 90);
            //右边
            path.AddLine(x+w,y+r,x+w,y+h-r);
            //右下角
            path.AddArc(new Rectangle(x+w-d,y+h-d, d, d), 0, 90);
            //下边
            path.AddLine(x + w-r, y + h, x + r, y + h);
            //左下角
            path.AddArc(new Rectangle(x , y + h - d, d, d), 90, 90);
            //左边
            path.AddLine(x , y + h-r, x , y + r);

            return path;
        }

        // 渐变填充
        private void btnGradient_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            //线性渐变
            Rectangle rect1 = new Rectangle(100, 50, 200, 100);
            //创建线性渐变画刷
            //LinearGradientBrush gbrush = new LinearGradientBrush(rect1, Color.Silver, Color.Orange, LinearGradientMode.Horizontal);//从左到右的渐变
            //LinearGradientBrush gbrush = new LinearGradientBrush(rect1, Color.Silver, Color.Orange, LinearGradientMode.Vertical);//从上到下的渐变
            //LinearGradientBrush gbrush = new LinearGradientBrush(rect1, Color.Silver, Color.Orange, LinearGradientMode.ForwardDiagonal);//从左上到右下的渐变
            //LinearGradientBrush gbrush = new LinearGradientBrush(rect1, Color.Silver, Color.Orange, LinearGradientMode.BackwardDiagonal);//从右上到左下的渐变
            //LinearGradientBrush gbrush = new LinearGradientBrush(rect1, Color.Silver, Color.Orange, 50);  //按角度渐变
            LinearGradientBrush gbrush = new LinearGradientBrush(new Point(100,50),new Point(100,150), Color.Silver, Color.Orange); //从开始点到结束点之间渐变
            g.FillRectangle(gbrush, rect1);

            //路径渐变  
            GraphicsPath path1 = new GraphicsPath();
            path1.AddEllipse(new Rectangle(100, 200, 100, 100));//椭圆
            PathGradientBrush pbrush = new PathGradientBrush(path1);//路径渐变画刷
            pbrush.CenterColor = Color.White;//中点颜色
            pbrush.SurroundColors = new Color[] { Color.Green };
            g.FillPath(pbrush, path1);//路径填充
            g.DrawPath(new Pen(Color.Gray, 2), path1);

            g.Dispose();
        }

        // 平移、旋转、缩放操作
        private void btnTransform_Click(object sender, EventArgs e)
        {
            //创建绘图对象 panel1中绘图
            Graphics g = panel1.CreateGraphics();//为控件创建绘图对象
            //呈现质量
            g.SmoothingMode = SmoothingMode.HighQuality;//消除锯齿   或 AntiAlias

            1.平移变换
            //Rectangle rect = new Rectangle(100, 50, 200, 100);
            //g.FillRectangle(new SolidBrush(Color.SteelBlue), rect);
            平移  x:50 y:20
            //g.TranslateTransform(50, 20);
            //g.FillRectangle(new SolidBrush(Color.LightGreen), rect);
            平移  x:-30 y:-50
            //g.TranslateTransform(-30, -50);
            //g.FillRectangle(new SolidBrush(Color.CadetBlue), rect);

            2.旋转变换
            //Rectangle rect = new Rectangle(200, 50, 200, 100);
            //g.DrawRectangle(new Pen(Color.Orange, 2), rect);
            平移
            //g.TranslateTransform(100, 30);
            //g.DrawRectangle(new Pen(Color.Green, 2), rect);
            旋转30度
            //g.RotateTransform(30);
            //g.DrawRectangle(new Pen(Color.Green, 2), rect);

            //3.缩放变换
            Rectangle rect = new Rectangle(200, 50, 100, 100);
            g.DrawEllipse(new Pen(Color.Orange, 2), rect);
            //放大  x:2倍   y:1.5倍
            g.ScaleTransform(2, 1.5f);
            g.DrawEllipse(new Pen(Color.Red, 2), rect);

            g.Dispose();
        }

CircleLabel.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinGraphics.UControls
{
    public partial class CircleLabel : Label
    {
        public CircleLabel()
        {
            InitializeComponent();
            //ControlStyles设置
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.Selectable, true);
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.Size = new Size(80, 30);
            BackColor = Color.Transparent;//背景透明
            rect = this.ClientRectangle;
        }
        Rectangle rect;//工作区

        //背景色   边框色   边框粗细
        private Color bgColor= Color.LightGray;
        /// <summary>
        /// 背景画刷
        /// </summary>
        public Color BgColor
        {
            get { return bgColor; }
            set { bgColor = value;
                Invalidate();
            }
        }

        private Color borderColor =Color.Gray;
        /// <summary>
        /// 边框画刷
        /// </summary>
        public Color BorderColor
        {
            get { return borderColor; }
            set
            {
                borderColor = value;
                Invalidate();
            }
        }

        private int borderWidth=0;
        /// <summary>
        /// 边框粗细
        /// </summary>
        public int BorderWidth
        {
            get { return borderWidth; }
            set { borderWidth = value;
                Invalidate();
            }
        }

        protected override void OnSizeChanged(EventArgs e)
        {
            rect= ClientRectangle;
            rect.Width -= 1;
            rect.Height -= 1;
        }

        /// <summary>
        /// 重绘控件
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;
            //边框   背景
            Rectangle rectBg;
            if (borderWidth > 0)//有边框
            {
                g.FillEllipse(new SolidBrush(BorderColor), rect);//边框椭圆
                rectBg = new Rectangle(rect.X + borderWidth, rect.Y + borderWidth, rect.Width - 2 * borderWidth, rect.Height - 2 * borderWidth);
            }
            else
                rectBg = rect;

            //背景填充
            g.FillEllipse(new SolidBrush(BgColor), rectBg);
            StringFormat format = new StringFormat();
            format.LineAlignment= StringAlignment.Center;
            format.Alignment= StringAlignment.Center;
            //文本绘制
            SolidBrush fontBrush = new SolidBrush(this.ForeColor);
            g.DrawString(this.Text, this.Font, fontBrush, rect, format);
        }
    }
}

UCircleButton.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinGraphics.UControls
{
    public class UCircleButton:Button
    {
        public UCircleButton()
        {
            //ControlStyles设置
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.Selectable, true);
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            //this.FlatAppearance.MouseDownBackColor = Color.Transparent;
            this.Size = new Size(80, 30);
            BackColor = Color.Transparent;//背景透明
            this.FlatAppearance.BorderSize = 0;
            this.FlatStyle= FlatStyle.Flat;
          
            rect = this.ClientRectangle;
        }
        Rectangle rect;//工作区

        private Color bgColor = Color.LightGray;
        /// <summary>
        /// 背景色1
        /// </summary>
        [DefaultValue(typeof(Color), "LightGray"),Description("按钮的背景颜色1"),Category("自定义")]
        public Color BgColor
        {
            get { return bgColor; }
            set
            {
                bgColor = value;
                Invalidate();
            }
        }

        private Color bgColor2 = Color.White;
        /// <summary>
        /// 背景色2
        /// </summary>
        public Color BgColor2
        {
            get { return bgColor2; }
            set
            {
                bgColor2 = value;
                Invalidate();
            }
        }

        private Color borderColor = Color.Gray;
        /// <summary>
        /// 边框色
        /// </summary>
        public Color BorderColor
        {
            get { return borderColor; }
            set
            {
                borderColor = value;
                Invalidate();
            }
        }

        private int borderWidth = 0;
        /// <summary>
        /// 边框粗细
        /// </summary>
        public int BorderWidth
        {
            get { return borderWidth; }
            set
            {
                borderWidth = value;
                Invalidate();
            }
        }

        private Color mouseDownFColor = Color.Blue;
        /// <summary>
        /// 按下时的文本颜色
        /// </summary>
        public Color MouseDownFColor
        {
            get { return mouseDownFColor; }
            set
            {
                mouseDownFColor = value;
                Invalidate();
            }
        }

        private Color mouseDownBgColor = Color.OrangeRed;
        /// <summary>
        /// 按下时的背景颜色
        /// </summary>
        public Color MouseDownBgColor
        {
            get { return mouseDownBgColor; }
            set
            {
                mouseDownBgColor = value;
                Invalidate();
            }
        }

        private int radius=5;
        /// <summary>
        /// 边框圆角半径
        /// </summary>
        public int Radius
        {
            get { return radius; }
            set { radius = value;
                Invalidate();
            }
        }

        private LinearGradientMode gradientMode = LinearGradientMode.Vertical;
        /// <summary>
        /// 渐变模式
        /// </summary>
       public LinearGradientMode GradientMode
        {
            get { return gradientMode; }
            set { 
                gradientMode = value;
                Invalidate();
            }
        }
        //鼠标是否按下
        bool isMouseDown = false;
        protected override void OnMouseDown(MouseEventArgs mevent)
        {
            base.OnMouseDown(mevent);
            isMouseDown = true;
     
        }

        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            isMouseDown = false;
        }

        protected override void OnSizeChanged(EventArgs e)
        {
            rect = ClientRectangle;
            this.Region = new Region(rect);
            rect.Width -= 1;
            rect.Height -= 1;
        }


        /// <summary>
        /// 控件重绘
        /// </summary>
        /// <param name="pevent"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;

            //边框   背景
            Rectangle rectBg;
            //路径 path  pathbg
            GraphicsPath path = new GraphicsPath();//边框的路径
            GraphicsPath pathBg = new GraphicsPath();//背景的路径 
            if(radius>0)
            {
                //边框的路径 
                path = PaintHelper.GetRoundRect(rect, radius);
                if(borderWidth>0)
                {
                    g.FillPath(new SolidBrush(borderColor), path);//填充边框路径
                    //背景区域
                    rectBg=new Rectangle(rect.X+borderWidth,rect.Y+borderWidth,rect.Width-2*borderWidth,rect.Height-2*borderWidth);
                    //背景路径 
                    pathBg=PaintHelper.GetRoundRect(rectBg, radius);
                }
                else
                {
                    pathBg = path;
                    rectBg = rect;
                }
                if(bgColor2!=Color.Transparent)//渐变填充
                {
                    LinearGradientBrush bgBrush = new LinearGradientBrush(rectBg, bgColor, bgColor2, gradientMode);
                    if(isMouseDown)
                    {
                        bgBrush=  new LinearGradientBrush(rectBg, mouseDownBgColor, bgColor2, gradientMode);
                    }
                    g.FillPath(bgBrush, pathBg);//背景填充
                }
                else
                {
                    SolidBrush bgBrush = new SolidBrush(bgColor);
                    if (isMouseDown)
                    {
                        bgBrush= new  SolidBrush(mouseDownBgColor);
                    }
                    g.FillPath(bgBrush, pathBg);
                }
            }
            else
            {
                if(borderWidth>0)
                {
                    g.FillRectangle(new SolidBrush(borderColor), rect);
                    rectBg = new Rectangle(rect.X + borderWidth, rect.Y + borderWidth, rect.Width - 2 * borderWidth, rect.Height - 2 * borderWidth);
                }
                else
                {
                    rectBg=rect;
                }
                if (bgColor2 != Color.Transparent)//渐变填充
                {
                    LinearGradientBrush bgBrush = new LinearGradientBrush(rectBg, bgColor, bgColor2, gradientMode);
                    if (isMouseDown)
                    {
                        bgBrush= new LinearGradientBrush(rectBg, mouseDownBgColor, bgColor2, gradientMode);
                    }
                    g.FillRectangle(bgBrush, rectBg);//背景填充
                }
                else
                {
                    SolidBrush bgBrush = new SolidBrush(bgColor);
                    if (isMouseDown)
                    {
                        bgBrush=new SolidBrush(mouseDownBgColor);
                    }
                    g.FillRectangle(bgBrush, rectBg);
                }
            }

            //文本绘制
            StringFormat format = new StringFormat();
            format.LineAlignment = StringAlignment.Center;
            format.Alignment = StringAlignment.Center;
            SolidBrush fontBrush = new SolidBrush(this.ForeColor);
            if(isMouseDown)
            {
                fontBrush = new SolidBrush(this.mouseDownFColor);
            }
            g.DrawString(this.Text, this.Font, fontBrush, rect, format);
        }
    }
}

UPanel.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinGraphics.UControls
{
    public class UPanel:Panel
    {
        public UPanel() {

            //ControlStyles设置
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.Size = new Size(100, 50);
            BackColor = Color.Transparent;//背景透明
            rect = this.ClientRectangle;
        }
        Rectangle rect;//工作区

        private Color bgColor = Color.LightGray;
        /// <summary>
        /// 背景色1
        /// </summary>
        [DefaultValue(typeof(Color), "LightGray"), Description("按钮的背景颜色1"), Category("自定义")]
        public Color BgColor
        {
            get { return bgColor; }
            set
            {
                bgColor = value;
                Invalidate();
            }
        }

        private Color bgColor2 = Color.White;
        /// <summary>
        /// 背景色2
        /// </summary>
        public Color BgColor2
        {
            get { return bgColor2; }
            set
            {
                bgColor2 = value;
                Invalidate();
            }
        }

        private Color borderColor = Color.Gray;
        /// <summary>
        /// 边框色
        /// </summary>
        public Color BorderColor
        {
            get { return borderColor; }
            set
            {
                borderColor = value;
                Invalidate();
            }
        }

        private int borderWidth = 0;
        /// <summary>
        /// 边框粗细
        /// </summary>
        public int BorderWidth
        {
            get { return borderWidth; }
            set
            {
                borderWidth = value;
                Invalidate();
            }
        }

        private int radius = 5;
        /// <summary>
        /// 边框圆角半径
        /// </summary>
        public int Radius
        {
            get { return radius; }
            set
            {
                radius = value;
                Invalidate();
            }
        }

        private LinearGradientMode gradientMode = LinearGradientMode.Vertical;
        /// <summary>
        /// 渐变模式
        /// </summary>
        public LinearGradientMode GradientMode
        {
            get { return gradientMode; }
            set
            {
                gradientMode = value;
                Invalidate();
            }
        }


        protected override void OnSizeChanged(EventArgs e)
        {
            rect = ClientRectangle;
            this.Region = new Region(rect);
            rect.Width -= 1;
            rect.Height -= 1;
        }


        /// <summary>
        /// 控件重绘
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;

            //边框   背景
            Rectangle rectBg;
            //路径 path  pathbg
            GraphicsPath path = new GraphicsPath();//边框的路径
            GraphicsPath pathBg = new GraphicsPath();//背景的路径 
            if (radius > 0)
            {
                //边框的路径 
                path = PaintHelper.GetRoundRect(rect, radius);
                if (borderWidth > 0)
                {
                    g.FillPath(new SolidBrush(borderColor), path);//填充边框路径
                    //背景区域
                    rectBg = new Rectangle(rect.X + borderWidth, rect.Y + borderWidth, rect.Width - 2 * borderWidth, rect.Height - 2 * borderWidth);
                    //背景路径 
                    pathBg = PaintHelper.GetRoundRect(rectBg, radius);
                }
                else
                {
                    pathBg = path;
                    rectBg = rect;
                }
                if (bgColor2 != Color.Transparent)//渐变填充
                {
                    LinearGradientBrush bgBrush = new LinearGradientBrush(rectBg, bgColor, bgColor2, gradientMode);
                    g.FillPath(bgBrush, pathBg);//背景填充
                }
                else
                {
                    SolidBrush bgBrush = new SolidBrush(bgColor);
                    g.FillPath(bgBrush, pathBg);
                }
            }
            else
            {
                if (borderWidth > 0)
                {
                    g.FillRectangle(new SolidBrush(borderColor), rect);
                    rectBg = new Rectangle(rect.X + borderWidth, rect.Y + borderWidth, rect.Width - 2 * borderWidth, rect.Height - 2 * borderWidth);
                }
                else
                {
                    rectBg = rect;
                }
                if (bgColor2 != Color.Transparent)//渐变填充
                {
                    LinearGradientBrush bgBrush = new LinearGradientBrush(rectBg, bgColor, bgColor2, gradientMode);
                    g.FillRectangle(bgBrush, rectBg);//背景填充
                }
                else
                {
                    SolidBrush bgBrush = new SolidBrush(bgColor);
                    g.FillRectangle(bgBrush, rectBg);
                }
            }
        }
    }
}

USwitch.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinGraphics.UControls
{
    [DefaultEvent("CheckedChanged")]
    public class USwitch : Control
    {
      
        public USwitch()
        {
            //ControlStyles设置
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.Selectable, true);
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.Size = new Size(100, 30);
            this.Click += USwitch_Click;
        }

        private void USwitch_Click(object sender, EventArgs e)
        {
            CheckedChanged?.Invoke(this, new EventArgs());
        }

        public event EventHandler CheckedChanged;//开关状态改变后触发

        private Color trueColor = Color.FromArgb(34, 163, 169);
        [Description("打开时的颜色"), Category("自定义")]
        public Color TrueColor
        {
            get { return trueColor; }
            set
            {
                trueColor = value;
                Invalidate();
            }
        }

        private Color falseColor = Color.FromArgb(111, 122, 126);
        [Description("关闭时的颜色"), Category("自定义")]
        public Color FalseColor
        {
            get { return falseColor; }
            set
            {
                falseColor = value;
                Invalidate();
            }
        }

        private bool swChecked;
        [Description("当前开关的状态"), Category("自定义")]
        public bool Checked
        {
            get { return swChecked; }
            set
            {
                swChecked = value;
                Invalidate();
            }
        }

        private string[] texts = new string[] { "On", "Off" };
        [Description("开关文本值,两个值,一个是开的文本,一个是关的文本"), Category("自定义")]
        public string[] Texts
        {
            get { return texts; }
            set
            {
                texts = value;
                Invalidate();
            }
        }

        public override Font Font {
            get => base.Font;
            set
            {
                base.Font = value;
                Invalidate();
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;
           //背景填充色
           var fillColor=swChecked?trueColor: falseColor;
            //路径
            GraphicsPath path = new GraphicsPath();
            //上边线    x:height/2,y:1      x:width-height/2,y:1
            path.AddLine(this.Height / 2, 1, this.Width - this.Height / 2, 1);
            //右边半圆弧
            path.AddArc(new Rectangle(Width - Height - 1, 1, this.Height - 2, Height - 2), 270, 180);
            //下边线    x:width-height/2,y:height-1      x:height/2,y:height-1 
            path.AddLine(this.Width - this.Height / 2, Height - 1, this.Height / 2, Height - 1);
            //左边半圆弧
            path.AddArc(new Rectangle(1, 1, this.Height - 2, Height - 2), 90, 180);
            //路径填充
            g.FillPath(new SolidBrush(fillColor), path);
            string text = "";//要画的文字
            if(texts!=null&&texts.Length==2)
            {
                if(swChecked)
                    text= texts[0];
                else 
                    text= texts[1];
            }

            if(swChecked)
            {
                //右边画圆,左边画文本
                //圆的直径:Height-2-4
                g.FillEllipse(Brushes.White, new Rectangle(Width - Height - 1 + 2, 1 + 2, Height - 2 - 4, Height - 2 - 4));
                //画文本
                SizeF sizeFont = g.MeasureString(text.Replace(" ", "A"), Font);
                //计算文本左上角的y坐标
                int fPointY=  (this.Height - (int)sizeFont.Height) / 2 + 2;
                int fPointX = (Height - 2 - 4) / 2;
                g.DrawString(text,Font,Brushes.White,fPointX, fPointY);
            }
            else
            {
                //左边画圆,右边画文本
                g.FillEllipse(Brushes.White, new Rectangle( 1 + 2, 1 + 2, Height - 2 - 4, Height - 2 - 4));
                //画文本
                SizeF sizeFont = g.MeasureString(text.Replace(" ", "A"), Font);
                //计算文本左上角的y坐标
                int fPointY=(this.Height -(int)sizeFont.Height) / 2 + 2;
                int fPointX = Width - 2 - Height / 2 - ((int)sizeFont.Width) + 10;
                g.DrawString(text, Font, Brushes.White, fPointX, fPointY);
            }
        }


    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinGraphics
{
    public partial class FrmPrint : Form
    {
        public FrmPrint()
        {
            InitializeComponent();
        }

        string[] colNames = { "编号", "编码", "站点", "类型", "取件方式", "快递状态" };
        List<string[]> dataList = new List<string[]>(); 
       

        /// <summary>
        /// 打印设置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPrintSetting_Click(object sender, EventArgs e)
        {
            pageSetupDialog1.ShowDialog();//显示打印设置对话框
        }

        /// <summary>
        /// 打印机---选择打印机,点击打印,开始打印
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPrint_Click(object sender, EventArgs e)
        {
             if(printDialog1.ShowDialog()==DialogResult.OK)
            {
                printDocument1.Print();//引发PrintPage事件
            }
        }

        /// <summary>
        /// 打开打印预览
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPreview_Click(object sender, EventArgs e)
        {
            printPreviewDialog1.ShowDialog();//显示打印预览对话框
        }


        int pageIndex = 1;//当前页索引
        int rowIndex = 0;//当前行索引

        /// <summary>
        /// 打印每一页时引发
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;
            //g.DrawString("欢迎来到GDI+", new Font("微软雅黑", 10.8f, FontStyle.Bold), new SolidBrush(Color.Orange), 40, 20);

            Pen pen = new Pen(Color.DarkGray, 1);//画线
            int start = 40, top = 20;
            int width = e.PageBounds.Width - 2 * start;
            //标题矩形
            Rectangle rectTitle = new Rectangle(start, top, width, 40);
            g.DrawRectangle(pen, rectTitle);
            //标题文本
            StringFormat format = new StringFormat();
            format.LineAlignment = StringAlignment.Center;
            format.Alignment = StringAlignment.Center;
            g.DrawString("快递信息列表", new Font("微软雅黑", 10.8f, FontStyle.Bold), new SolidBrush(Color.Purple), rectTitle, format);

            pen = new Pen(Color.Black, 1);
            //列标题栏的矩形
            Rectangle rectColHeader = new Rectangle(start, top + rectTitle.Height + 20, width, 30);
            g.DrawRectangle(pen, rectColHeader);
            int ycol = top + rectTitle.Height + 20;//列表标题栏矩形左上角y
            int colWidth = 100;
            int[] colWidths = { 100, 200, 240, 150, 100, 100 };//各列的宽
            int colWidth1=start+colWidth;//第二列x
            g.DrawLine(pen, colWidth1, ycol, colWidth1, ycol + 30);//第一列右侧竖线
            g.DrawLine(pen, start, ycol, colWidth1, ycol + 30);//第一列中的斜线
            g.DrawString("标题", new Font("微软雅黑", 9f, FontStyle.Regular), new SolidBrush(Color.Black), start+60,ycol+3);
            g.DrawString("数据", new Font("微软雅黑", 9f, FontStyle.Regular), new SolidBrush(Color.Red), start + 20, ycol + 12);

            //画列标题栏
            for (int i = 0; i < colNames.Length; i++)
            {
                g.DrawString(colNames[i], new Font("微软雅黑", 10.8f, FontStyle.Bold), new SolidBrush(Color.Green), colWidth1 + 20, ycol + 7);
                colWidth1 += colWidths[i];//当前列右侧的x
                if (i < colNames.Length - 1)
                    g.DrawLine(pen, colWidth1, ycol, colWidth1, ycol + 30);//如果不是最后一列,画右侧竖线
            }

            //画数据行  分页
            while(rowIndex<dataList.Count)
            {
                ycol += 30;//下一行的左上角y 
                g.DrawLine(pen, start, ycol, start, ycol + 30);//左边竖线
               //画行号
                g.DrawString((rowIndex+1).ToString("00"), new Font("微软雅黑", 10.8f, FontStyle.Regular), new SolidBrush(Color.Brown), start + 20, ycol + 7);
                colWidth1 = start + colWidth;
                //第一列右侧竖线
                g.DrawLine(pen, colWidth1, ycol, colWidth1, ycol + 30);
                //数据行的信息  第rowIndex行的数据
                for (int j = 0; j < dataList[rowIndex].Length; j++)
                {
                    g.DrawString(dataList[rowIndex][j], new Font("微软雅黑", 10.8f, FontStyle.Regular), new SolidBrush(Color.DimGray), colWidth1 + 20, ycol + 7);
                    colWidth1+= colWidths[j];
                    if (j < dataList[rowIndex].Length-1)//不是最后一列
                        g.DrawLine(pen, colWidth1, ycol, colWidth1, ycol + 30);//如果不是最后一列,画右侧竖线
                }
                //当前行下边线
                g.DrawLine(pen, start, ycol+30, e.PageBounds.Width-start, ycol + 30);
                //当前行的右边竖线
                g.DrawLine(pen, e.PageBounds.Width - start, ycol, e.PageBounds.Width - start, ycol + 30);

                rowIndex++;
                if(ycol+30+30>e.PageBounds.Bottom)//下一行的高度超过页的底部
                {
                    e.HasMorePages= true;//添加下一页
                    break;
                }
            }
            pageIndex++;
        }

        private void FrmPrint_Load(object sender, EventArgs e)
        {
            dataList.Add(new string[] { "101", "20230223114800001", "游仙区仙人路菜鸟驿站", "省外/小体积", "自提", "未取件" });
            dataList.Add(new string[] { "102", "20230223114800002", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "103", "20230223114800003", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "104", "20230223114800004", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "105", "20230223114800005", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "106", "20230223114800006", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "107", "20230223114800007", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "108", "20230223114800008", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "109", "20230223114800009", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "110", "20230223114800010", "游仙区仙人路菜鸟驿站1", "省外/大体积", "派送", "已签收" });
            dataList.Add(new string[] { "102", "20230223114800002", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "103", "20230223114800003", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "104", "20230223114800004", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "105", "20230223114800005", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "106", "20230223114800006", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "107", "20230223114800007", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "108", "20230223114800008", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "109", "20230223114800009", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "110", "20230223114800010", "游仙区仙人路菜鸟驿站1", "省外/大体积", "派送", "已签收" });
            dataList.Add(new string[] { "101", "20230223114800001", "游仙区仙人路菜鸟驿站", "省外/小体积", "自提", "未取件" });
            dataList.Add(new string[] { "102", "20230223114800002", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "103", "20230223114800003", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "104", "20230223114800004", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "105", "20230223114800005", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "106", "20230223114800006", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "107", "20230223114800007", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "108", "20230223114800008", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "109", "20230223114800009", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "110", "20230223114800010", "游仙区仙人路菜鸟驿站1", "省外/大体积", "派送", "已签收" });
            dataList.Add(new string[] { "112", "20230223114800002", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "113", "20230223114800003", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "114", "20230223114800004", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "115", "20230223114800005", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "116", "20230223114800006", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "117", "20230223114800007", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "118", "20230223114800008", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "119", "20230223114800009", "游仙区仙人路菜鸟驿站1", "省外/小体积1", "自提", "未取件" });
            dataList.Add(new string[] { "120", "20230223114800010", "游仙区仙人路菜鸟驿站1", "省外/大体积", "派送", "已签收" });
        }
    }
}

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
06-02
好的,以下是一些关于 C# GDI+ 的面试题: 1. 什么是 GDI+?它有什么作用? GDI+ 是 .NET Framework 中的图形设备界面,它提供了一组开发人员可以用来创建高质量图形和图像的类和方法。通过 GDI+,我们可以创建各种各样的图形和图像,包括线条、矩形、圆形、多边形、文本、图片等,还可以进行图像处理、图形绘制等操作。 2. GDI+GDI 的区别是什么? GDI+GDI 的升级版,在功能上比 GDI 更加强大,它提供了更多的绘图方法和更高级的对象模型,同时还支持 alpha 通道、图像处理等高级功能。此外,GDI+ 还支持更多的图像格式,包括 BMP、JPEG、PNG、GIF、TIFF 等。 3. 如何使用 GDI+ 绘制一条直线? 在 C# 中,我们可以使用 System.Drawing 命名空间中的 Pen 和 Graphics 对象来绘制直线,具体的代码示例如下: ``` // 创建 Pen 对象 Pen pen = new Pen(Color.Black); // 创建 Graphics 对象 Graphics g = this.CreateGraphics(); // 绘制直线 g.DrawLine(pen, 0, 0, 100, 100); ``` 4. 如何使用 GDI+ 绘制一个矩形? 和绘制直线类似,我们可以使用 System.Drawing 命名空间中的 Pen 和 Graphics 对象来绘制矩形,具体的代码示例如下: ``` // 创建 Pen 对象 Pen pen = new Pen(Color.Black); // 创建 Graphics 对象 Graphics g = this.CreateGraphics(); // 创建 Rectangle 对象 Rectangle rect = new Rectangle(0, 0, 100, 100); // 绘制矩形 g.DrawRectangle(pen, rect); ``` 5. 如何使用 GDI+ 绘制一个圆形? 和绘制直线、矩形类似,我们可以使用 System.Drawing 命名空间中的 Pen 和 Graphics 对象来绘制圆形,具体的代码示例如下: ``` // 创建 Pen 对象 Pen pen = new Pen(Color.Black); // 创建 Graphics 对象 Graphics g = this.CreateGraphics(); // 创建 Rectangle 对象 Rectangle rect = new Rectangle(0, 0, 100, 100); // 绘制圆形 g.DrawEllipse(pen, rect); ``` 以上是几个常见的关于 C# GDI+ 的面试题和答案,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值