GDI+画图类Graphics的使用

一:基础定义

 #region 定义线尾、线头为箭头、字体和笔刷
                Pen p = new Pen(Color.Black, 1);//定义画笔 蓝色,宽度为1(坐标显示颜色)
                p.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头

                Pen pk = new Pen(Color.Black, 1);//定义画笔 黑色,宽度为1(坐标显示颜色)
                Pen pbl = new Pen(Color.Red,1);
                pbl.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头

                StringFormat strF = new StringFormat(StringFormatFlags.DirectionVertical);//定义格式
                Font f = new System.Drawing.Font("宋体", 10);//定义字体
                SolidBrush bB = new SolidBrush(Color.Black);//定义单色画刷
                SolidBrush bl = new SolidBrush(Color.Red);//定义单色画刷
            #endregion

二:使用前准备,新建一个picturebox,实例化一个 Graphics类,关联它们

 Graphics gph;//绘画区域 Bitmap bmp = new Bitmap(pic_Img.Width, pic_Img.Height);//600, 512
                gph = Graphics.FromImage(bmp);

三:实例

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

namespace DrawLine
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            #region 定义线尾、线头为箭头、字体和笔刷
            Pen p = new Pen(Color.Blue, 1);//定义画笔 蓝色,宽度为1(坐标显示颜色)
            p.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头
            p.StartCap = LineCap.ArrowAnchor;//定义线首的样式为箭头

            Font f = new System.Drawing.Font("宋体", 10);//定义字体
            SolidBrush bB = new SolidBrush(Color.Black);//定义单色画刷
            //SolidBrush bB = new SolidBrush(Color.Blue);
            #endregion
            string[] month = new string[12] { "一月", "二月", "三月", "四月", "五月", "六月",
"七月", "八月", "九月", "十月", "十一月", "十二月" };
            float[] d = new float[12] { 20.5F, 60, 10.8F, 15.6F, 30, 70.9F, 50.3F, 30.7F, 70, 50.4F, 30.8F, 20 };
            //画图初始化
            Bitmap bMap = new Bitmap(526, 500);
            Graphics gph = Graphics.FromImage(bMap);
            //gph.Clear(Color.White);
            PointF cPt = new PointF(40, 420);//中心点
            PointF[] xPt = new PointF[3]{new PointF(cPt.Y+15,cPt.Y),
new PointF(cPt.Y,cPt.Y-8),new PointF(cPt.Y,cPt.Y+8)};//X轴三角形
            PointF[] yPt = new PointF[3]{new PointF(cPt.X,cPt.X-15),
new PointF(cPt.X-8,cPt.X),new PointF(cPt.X+8,cPt.X)};//Y轴三角形
            gph.DrawString("红马車公司月生产量图表", new Font("宋体", 14)
            , Brushes.Black, new PointF(cPt.X + 60, cPt.X));//图标标题
            //画X轴
            gph.DrawLine(Pens.Black, cPt.X, cPt.Y, cPt.Y, cPt.Y);
            gph.DrawPolygon(Pens.Black, xPt);
            gph.FillPolygon(new SolidBrush(Color.Black), xPt);
            gph.DrawString("月份", new Font("宋体", 12), Brushes.Black, new PointF(cPt.Y + 10, cPt.Y + 10));
            //画Y轴
            gph.DrawLine(Pens.Black, cPt.X, cPt.Y, cPt.X, cPt.X);
            gph.DrawPolygon(Pens.Black, yPt);
            gph.FillPolygon(new SolidBrush(Color.Black), yPt);
            gph.DrawString("单位(万)", new Font("宋体", 12), Brushes.Black, new PointF(0, 7));
            for (int i = 1; i <= 12; i++)
            {
                //画Y轴刻度
                if (i < 11)
                {
                    gph.DrawString((i * 10).ToString(), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X - 30, cPt.Y - i * 30 - 6));
                    gph.DrawLine(Pens.Black, cPt.X - 3, cPt.Y - i * 30, cPt.X, cPt.Y - i * 30);
                }
                //画X轴项目
                gph.DrawString(month[i - 1].Substring(0, 1), new Font("宋体", 11), Brushes.Black,
                new PointF(cPt.X + i * 30 - 5, cPt.Y + 5));
                gph.DrawString(month[i - 1].Substring(1, 1), new Font("宋体", 11), Brushes.Black,
                new PointF(cPt.X + i * 30 - 5, cPt.Y + 20));
                if (month[i - 1].Length > 2) gph.DrawString(month[i - 1].Substring(2, 1), new Font("宋体", 11),
                Brushes.Black,
                new PointF(cPt.X + i * 30 - 5, cPt.Y + 35));
                gph.DrawLine(Pens.Black, cPt.X + i * 30, cPt.Y, cPt.X + i * 30, cPt.Y + 3);
                //画点
                gph.DrawEllipse(Pens.Black, cPt.X + i * 30, cPt.Y - d[i - 1] * 3 - 1.5F, 3, 3);
                gph.FillEllipse(new SolidBrush(Color.Black), cPt.X + i * 30, cPt.Y - d[i - 1] * 3 - 1.5F,
                3, 3);
                //画数值
                gph.DrawString(d[i - 1].ToString(), new Font("宋体", 11), Brushes.Black,
                new PointF(cPt.X + i * 30, cPt.Y - d[i - 1] * 3));
                //画折线
                if (i > 1)
                    gph.DrawLine(Pens.Red, cPt.X + (i - 1) * 30, cPt.Y - d[i - 2] * 3, cPt.X + i * 30, cPt.Y - d[i - 1] * 3);
            }
            pictureBox1.Image = bMap;
        }

    }
}

四:注意事项

如何建立一个有比例关系的坐标系,主要是确定实际距离和像素的关系,一个像素代表多少米的距离

如何生成一个动态比例尺、动态刻度值的坐标系,这就需要确立一个参照点,将这个参照点作为零点,再计算刻度值,从零点的左右两边分别标刻度值。标点时,需要确立动态的像素和距离的关系来确定位置

时间: 2024-10-14 10:06:56

GDI+画图类Graphics的使用的相关文章

C#-gdi画图,双缓冲画图,Paint事件的触发---ShinePans

在使用gdi技术画图时,有时会发现图形线条不够流畅,或者在改变窗口大小时会闪烁不断的现象.(Use DoubleBuffer to solve it!)                                                                                                                                                                              

c# GDI画图 双缓存画图分析

双缓冲绘图分析  1.Windows 绘图原理  我们在 Windows 环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是“画”出来的.这时的屏幕,就相当于一块黑板,而 Windows 下的各种 GDI 要素,如画笔.画刷等,就相当于彩色粉笔了.我们在黑板上手工画图时,是一笔一划的,电脑亦然.只不过电脑的速度比手工快的太多,所以在我们看起来好像所有的图形文字都是同时出现的. 2.普通绘图方式的局限  上述绘图方式我们暂且称之为普通绘图方式吧.虽然这种方式能满足相当一部分的绘图需要,

Delphi GDI 图形设备接口Graphics Device Interface

GDI (图形设备接口(Graphics Device Interface))GDI是图形设备接口的英文缩写,主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形和图像输出.GDI的出现使程序员无需要关心硬件设备及设备正常驱动,就可以将应用程序的输出转化为硬件设备上的输出和构成,实现了程序开发者与硬件设备的隔离,大大方便了开发工作. 在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕.打印机及其它输出

GDI+画图技术

private void button1_Click(object sender, EventArgs e) { //this代表当前窗体,在当前窗体上创建Graphics //第一步:创建GDI对象 Graphics g = this.CreateGraphics(); //创建一个画笔 Pen p=new Pen (Color.Red,2); //确定两个点 Point p1 = new Point(20, 20); Point p2 = new Point(30, 40); //调用GDI

Html5游戏框架createJs组件--EaselJS(二)绘图类graphics

有端友问我是否有文档,有确实有,但没有中文的,只有英文的,先提供浏览地址供大家参考学习createJs英文文档.                        EaselJS其实主要就是createJs组件中控制canvas绘图的,那么就会涉及密切相关的绘图操作,绘图操作利用Graphics类实现,我们来仔细的研究研究Graphics类. 先回顾一下EaselJS(一里面的那个圆形绘图): <!DOCTYPE HTML> <html lang="en-US">

GDI+重点类

程序集 System.Drawing.dll System.DrawingSystem.Drawing.ImagingSystem.Drawing.Drawing2D SystemPens 系统内部标准部画笔. SystemIcons  系统内部标准部图标. SystemFonts  系统内部标准部字体. SystemColors  系统内部标准部颜色. SystemBrushes  系统内部标准部笔刷.   Brushes  所有标准颜色的笔刷. Brush  定义用来填充的如矩形.椭圆.饼.

android中画图类的介绍Path

Paint类相关属性: /** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关. * * 1.图形绘制 * setARGB(int a,int r,int g,int b); * 设置绘制的颜色,a代表透明度,r,g,b代表颜色值. * * setAlpha(int a); * 设置绘制图形的透明度. *

NPlot开源画图类

一.net下的图表控件­­­NPlot的基本用法 NPlot的基本用法 图表控件一直是很难找的,特别是免费又强大的.NPlot是一款非常难得的.Net平台下的图表控件,能做各种曲线图,柱状图,饼图,散点图,股票图等,而且它免费又开源,使用起来也非常符合程序员的习惯.唯一的缺点就是文档特别难找,难读.通过对其文档的阅读和对示例程序源代码的分析,现在将NPlot的基 本概念整理如下:NPlot的命名空间包括NPlot,NPlot.Bitmap,NPlot.Web,NPlot.Web.Design,N

画图类

1 package cativity.cyq.layoutanimation; 2 3 import android.support.v7.app.ActionBarActivity; 4 import android.support.v4.app.Fragment; 5 import android.os.Bundle; 6 import android.view.LayoutInflater; 7 import android.view.Menu; 8 import android.view