• C# GDI+代码收集1


     1.绘制带立体感的圆柱

    View Code
       public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                // ControlStyles 指定控件的样式和行为。
                // SetStyle将指定的 ControlStyles 标志设置为 true 或 false。
                this.SetStyle(ControlStyles.OptimizedDoubleBuffer |//OptimizedDoubleBuffer如果为 true,则该控件首先在缓冲区中绘制,而不是直接绘制到屏幕上,这样可以减少闪烁。 如果将此属性设置为 true,则还应当将 AllPaintingInWmPaint 设置为 true。
                         ControlStyles.ResizeRedraw |//ResizeRedraw如果为 true,则在调整控件大小时重绘控件。
                         ControlStyles.AllPaintingInWmPaint, true);//AllPaintingInWmPaint如果为 true,控件将忽略 WM_ERASEBKGND 窗口消息以减少闪烁。 仅当 UserPaint 位设置为 true 时,才应当应用该样式
            }
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                DrawVertPipe(e.Graphics);
                //Graphics g = pictureBox1.CreateGraphics();
            }
            //GraphicsContainer表示图形容器的内部数据。 当使用 BeginContainer 和 EndContainer 方法保存 Graphics 对象的状态时使用此类。 此类不能被继承。
            //BeginContainer保存具有此 Graphics 的当前状态的图形容器,然后打开并使用新的图形容器。
            //EndContainer关闭当前图形容器,并将此 Graphics 的状态还原到通过调用 BeginContainer 方法保存的状态。
            private void DrawVertPipe(System.Drawing.Graphics g)
            {
                System.Drawing.Drawing2D.GraphicsContainer gCon;
                gCon = g.BeginContainer();
                Rectangle bound = new Rectangle(150, 50, 250, 250);
                GraphicsPath gp = new GraphicsPath();
                //指定是否将平滑处理(抗锯齿)应用于直线、曲线和已填充区域的边缘。AntiAlias指定抗锯齿的呈现。
                g.SmoothingMode = SmoothingMode.AntiAlias;
                gp.AddRectangle(bound);
                g.FillPath(new SolidBrush(Color.Violet), gp);
                FillCylinderShadow(g, gp, 0.5f, Color.FromArgb(100, 0, 0, 0), Color.FromArgb(100, Color.White));
                gp.Dispose();
                g.EndContainer(gCon);
            }
            public void FillCylinderShadow(Graphics g, GraphicsPath gp, float focus, Color BeginColor, Color EndColor)
            {
                LinearGradientBrush linGrBrush = new LinearGradientBrush(
                gp.PathPoints[0], gp.PathPoints[1],
                BeginColor,
                EndColor
                );
                //创建基于钟形曲线的渐变过渡过程。
                linGrBrush.SetSigmaBellShape(focus);//介于 0 到 1 之间的一个值,它指定渐变中心(起始色和结束色均匀混合的点)。
                g.FillPath(linGrBrush, gp);
                linGrBrush.Dispose();
            }
        }

    注:

    Graphics.BeginContainer 方法与 Graphics.EndContainer 方法

    将此方法与 EndContainer 方法一起使用以创建嵌套的图形容器。 图形容器保留图形状态(如变形、剪辑区域和呈现属性)。

    当调用 Graphics 的 BeginContainer 方法时,一个保存 Graphics 状态的信息块将被放在堆栈上。 BeginContainer 方法返回一个标识该信息块的 GraphicsContainer 当您将此标识对象传递给 EndContainer 方法时,该信息块会从堆栈中移除并用于将 Graphics 还原到它在 BeginContainer 方法调用时的状态。

    容器可以嵌套;即,在调用 EndContainer 方法之前可以多次调用 BeginContainer 方法。 您每次调用 BeginContainer 方法时,都有一个信息块被放在堆栈上,同时您将接收到该信息块的一个 GraphicsContainer 当将其中某个对象传递给 EndContainer 方法时,Graphics 返回到它在 BeginContainer 方法调用时所处的状态,该方法调用返回了该特定的 GraphicsContainer 由该 BeginContainer 方法调用放在堆栈上的信息块会从堆栈中移除,而且在该 BeginContainer 方法调用之后放在该堆栈上的所有信息块也会被移除。

    Save 方法调用与 BeginContainer 方法调用将信息块放在同一堆栈上。 正如 EndContainer 方法调用与 BeginContainer 方法调用成对出现一样,Restore 方法调用与 Save 方法调用也成对出现。

    当调用 EndContainer 方法时,在相应的 Save 方法调用(由 BeginContainer 方法或 BeginContainer 方法)之后放在堆栈上的所有信息块都从堆栈中被移除。 同样,当您调用Restore 方法时,在相应的 Save 方法调用之后(由 Save 方法或 BeginContainer 方法)放在堆栈上的所有信息块都从堆栈中被移除。

    由 BeginContainer 方法建立的图形状态包括默认图形状态的呈现质量;调用方法时存在的任何呈现质量状态更改都会重置为默认值。

    2.窗体绘制网格

    View Code
     public partial class Form3 : Form
        {
    
            Bitmap bit;
            TextureBrush textureBrush;
            int x = 0;
            int y = 0;
            bool showRec = false;
            public Form3()
            {
                InitializeComponent();
                bit = new Bitmap(10, 10);
                Graphics g = Graphics.FromImage(bit);
                g.Clear(this.BackColor);
                g.DrawRectangle(Pens.Black, new Rectangle(0, 0, 10, 10));
                g.Dispose();
                textureBrush = new TextureBrush(bit);//使用TextureBrush可以有效减少窗体拉伸时的闪烁
            }
    
            private void Form3_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.FillRectangle(textureBrush, this.ClientRectangle);
                if (showRec)
                {
                    e.Graphics.DrawRectangle(Pens.White, new Rectangle(x * 10, y * 10, 10, 10));
                }
            }
    
            private void Form3_MouseClick(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Right)//鼠标右键
                {
                    x = e.X / 10;
                    y = e.Y / 10;
                    showRec = true;
                    this.Invalidate();
                    MessageBox.Show("" + x + "×" + y + "个矩形 " + "坐标为:(" + e.X + "," + e.Y + ")");
                    showRec = false;
                    this.Invalidate();
                }
    
            }
    
        }

    3.把窗体转成图像文件

    View Code
     //Screen.AllScreens获取系统上所有显示器的数组。
                //Screen.Bounds获取显示的边界。
                Rectangle rect = Screen.AllScreens[0].Bounds;
                Image image = new Bitmap(rect.Width, rect.Height);
                Graphics g = Graphics.FromImage(image);
                g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(rect.Width, rect.Height));
                Rectangle rect2 = this.Bounds;
                Image image2 = new Bitmap(rect2.Width, rect2.Height);
                Graphics g2 = Graphics.FromImage(image2);
                g2.DrawImage(image, new Rectangle(0, 0, rect2.Width, rect2.Height), rect2, GraphicsUnit.Pixel);
                image2.Save(@"C:\form.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

    4.绘制条形图

    View Code
    private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Graphics g = this.CreateGraphics();
                //绘制X轴
                g.DrawLine(new Pen(Color.Black), 50, 50, 50, 500);
                g.DrawString("(年份)", new Font("宋体", 10), new SolidBrush(Color.Black), new Point(50, 30));
                //绘制Y轴
                g.DrawLine(new Pen(Color.Black), 50, 50, 700, 50);
                g.DrawString("(产量)", new Font("宋体", 10), new SolidBrush(Color.Black), new Point(10, 50));
                //绘制年份
                int startYear = 2002;
                int posNum = 100;
                for (int i = 0; i < 6; i++)
                {
                    string strYear = startYear.ToString();
                    g.DrawString(strYear, new Font("宋体", 12), new SolidBrush(Color.Black), new Point(posNum * (i + 1), 30));
                    startYear = startYear + 1;
                }
                //绘制产量
                float startNum = 1000;
                for (int i = 0; i < 4; i++)
                {
                    string strNum = startNum.ToString();
                    g.DrawString(strNum, new Font("宋体", 12), new SolidBrush(Color.Black), new Point(10, posNum * (i + 1)));
                    startNum = startNum + 1000;
                }
                //绘制矩形以表示产量
                int drawPosNum = 80;
                for (int i = 0; i < 6; i++)
                {
                    Random rd = new Random();
                    //绘制红色矩形
                    float flNumber1 = rd.Next(0, 400);
                    g.DrawRectangle(new Pen(Color.Red), drawPosNum, 50, 20, flNumber1);
                    SolidBrush sb1 = new SolidBrush(Color.Red);
                    g.FillRectangle(sb1, drawPosNum, 50, 20, flNumber1);
                    //绘制蓝色矩形
                    float flNumber2 = rd.Next(0, 400);
                    g.DrawRectangle(new Pen(Color.Blue), (drawPosNum + 25), 50, 20, flNumber2);
                    SolidBrush sb2 = new SolidBrush(Color.Blue);
                    g.FillRectangle(sb2, (drawPosNum + 25), 50, 20, flNumber2);
                    //绘制绿色矩形
                    float flNumber3 = rd.Next(0, 400);
                    g.DrawRectangle(new Pen(Color.Pink), (drawPosNum + 50), 50, 20, flNumber3);
                    SolidBrush sb3 = new SolidBrush(Color.Green);
                    g.FillRectangle(sb3, (drawPosNum + 50), 50, 20, flNumber3);
                    drawPosNum = drawPosNum + 100;
                }
    
            }

     5.绘制饼形图

    View Code
    private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Graphics g = this.CreateGraphics();
                int x = 100, y = 30, width = 200, height = 200, sum = 0 ;
                float sweepAngle = 0.0f,startAngle = 0.0f;
                Pen p = null;
                SolidBrush sb = null;
                int[,] strYearInfo = new int[,] { { 2006, 1500 }, { 2007, 2000 }, { 2008, 1200 } };
                for (int i = 0; i < strYearInfo.Length / 2; i++)
                {
                    sum += strYearInfo[i, 1];
                }
                for (int i = 0; i < strYearInfo.Length / 2; i++)
                {
                    //定义组成饼形图的各个扇形的颜色
                    if (i == 0)
                    {
                        p = new Pen(Color.Red);
                        sb = new SolidBrush(Color.Red);
                    }
                    else if (i == 1)
                    {
                        p = new Pen(Color.Blue);
                        sb = new SolidBrush(Color.Blue);
                    }
                    else if (i == 2)
                    {
                        p = new Pen(Color.Green);
                        sb = new SolidBrush(Color.Green);
                    }
                    //根据值绘制各个饼形
                    float flYearNumber = float.Parse(strYearInfo[i, 1].ToString());
                    sweepAngle = 360 * (flYearNumber / sum);
                    Rectangle rtl = new Rectangle(x, y, width, height);
                    g.DrawPie(p, rtl, startAngle, sweepAngle);
                    g.FillPie(sb, rtl, startAngle, sweepAngle);
                    startAngle += sweepAngle;
                    //绘制饼形图的说明
                    string strYear = strYearInfo[i, 0].ToString() + "所占比例:" + (flYearNumber / sum) * 100 + "%";
                    Font font = new Font("宋体", 12, FontStyle.Bold);
                    Point point = new Point(350, (40 + i * 30));
                    g.DrawString(strYear, font, sb, point);
                }
    
            }

     6.颜色对话框

    View Code
    private void button1_Click(object sender, EventArgs e)
            {
                using (System.Windows.Forms.ColorDialog cdlg = new ColorDialog())
                {
                    cdlg.Color = Color.Blue;
                    if (cdlg.ShowDialog() == DialogResult.OK)
                    {
                        this.BackColor = cdlg.Color;
                    }
                }
            }

    7.字体选择

    View Code
    FontDialog fd1 = new FontDialog();
     fd1.ShowDialog();
    //this.richTextBox1.SelectionFont = fd1.Font;
     this.richTextBox1.Font = fd1.Font;

    注:以上代码收集自网络!!!

     

  • 相关阅读:
    Linux系统下安装rz/sz命令及使用说明(文件上传下载)
    html 手机端click 事件延迟问题(fastclick.js使用方法)
    html 手机端click 事件去掉黑色阴影效果
    页面在Native端滚动时模拟原生的弹性滚动效果
    在 2016 年学 JavaScript 是一种什么样的体验?
    凸包---(简单概念)
    .NET框架
    项目使用技术-张子阳推荐
    MessageBox页面消息弹出框类
    c# DES 加密解密方法
  • 原文地址:https://www.cnblogs.com/YuanSong/p/2611826.html
Copyright © 2020-2023  润新知