GDI+画图类Graphics的使用

时间:2023-03-09 17:37:32
GDI+画图类Graphics的使用

一:基础定义

 #region 定义线尾、线头为箭头、字体和笔刷
Pen p = new Pen(Color.Black, );//定义画笔 蓝色,宽度为1(坐标显示颜色)
p.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头 Pen pk = new Pen(Color.Black, );//定义画笔 黑色,宽度为1(坐标显示颜色)
Pen pbl = new Pen(Color.Red,);
pbl.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头 StringFormat strF = new StringFormat(StringFormatFlags.DirectionVertical);//定义格式
Font f = new System.Drawing.Font("宋体", );//定义字体
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);

三:实例

GDI+画图类Graphics的使用

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(坐标显示颜色)
p.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头
p.StartCap = LineCap.ArrowAnchor;//定义线首的样式为箭头 Font f = new System.Drawing.Font("宋体", );//定义字体
SolidBrush bB = new SolidBrush(Color.Black);//定义单色画刷
//SolidBrush bB = new SolidBrush(Color.Blue);
#endregion
string[] month = new string[] { "一月", "二月", "三月", "四月", "五月", "六月",
"七月", "八月", "九月", "十月", "十一月", "十二月" };
float[] d = new float[] { 20.5F, , 10.8F, 15.6F, , 70.9F, 50.3F, 30.7F, , 50.4F, 30.8F, };
//画图初始化
Bitmap bMap = new Bitmap(, );
Graphics gph = Graphics.FromImage(bMap);
//gph.Clear(Color.White);
PointF cPt = new PointF(, );//中心点
PointF[] xPt = new PointF[]{new PointF(cPt.Y+,cPt.Y),
new PointF(cPt.Y,cPt.Y-),new PointF(cPt.Y,cPt.Y+)};//X轴三角形
PointF[] yPt = new PointF[]{new PointF(cPt.X,cPt.X-),
new PointF(cPt.X-,cPt.X),new PointF(cPt.X+,cPt.X)};//Y轴三角形
gph.DrawString("红马車公司月生产量图表", new Font("宋体", )
, Brushes.Black, new PointF(cPt.X + , 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("宋体", ), Brushes.Black, new PointF(cPt.Y + , cPt.Y + ));
//画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("宋体", ), Brushes.Black, new PointF(, ));
for (int i = ; i <= ; i++)
{
//画Y轴刻度
if (i < )
{
gph.DrawString((i * ).ToString(), new Font("宋体", ), Brushes.Black, new PointF(cPt.X - , cPt.Y - i * - ));
gph.DrawLine(Pens.Black, cPt.X - , cPt.Y - i * , cPt.X, cPt.Y - i * );
}
//画X轴项目
gph.DrawString(month[i - ].Substring(, ), new Font("宋体", ), Brushes.Black,
new PointF(cPt.X + i * - , cPt.Y + ));
gph.DrawString(month[i - ].Substring(, ), new Font("宋体", ), Brushes.Black,
new PointF(cPt.X + i * - , cPt.Y + ));
if (month[i - ].Length > ) gph.DrawString(month[i - ].Substring(, ), new Font("宋体", ),
Brushes.Black,
new PointF(cPt.X + i * - , cPt.Y + ));
gph.DrawLine(Pens.Black, cPt.X + i * , cPt.Y, cPt.X + i * , cPt.Y + );
//画点
gph.DrawEllipse(Pens.Black, cPt.X + i * , cPt.Y - d[i - ] * - 1.5F, , );
gph.FillEllipse(new SolidBrush(Color.Black), cPt.X + i * , cPt.Y - d[i - ] * - 1.5F,
, );
//画数值
gph.DrawString(d[i - ].ToString(), new Font("宋体", ), Brushes.Black,
new PointF(cPt.X + i * , cPt.Y - d[i - ] * ));
//画折线
if (i > )
gph.DrawLine(Pens.Red, cPt.X + (i - ) * , cPt.Y - d[i - ] * , cPt.X + i * , cPt.Y - d[i - ] * );
}
pictureBox1.Image = bMap;
} }
}

四:注意事项

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

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

GDI+画图类Graphics的使用