C#画图的一些介绍1(GDI+)
namespace _111GDI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//得?到?了?窗洹?体?的?“°画-笔括?”±对?象ó,?其?实害?就í是?窗洹?体?的?表括?面?
Graphics g = this.CreateGraphics();
//g.DrawString("大洙?几?把?", this.Font, Brushes.Black, 200, 400);
g.DrawEllipse(Pens.Blue, 20, 40, 50, 50);//椭圆形
g.DrawRectangle(Pens.Yellow, 20, 40, 50, 50);//长方形
g.Dispose();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics g = this.panel1.CreateGraphics();
g.FillEllipse(Brushes.Brown, 50,50,100,100);
g.Dispose();
}
private void Forml_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
//g.Dispose();这里不需要销毁
Pen pen = new Pen(Color.Yellow, 10);//太细,我们重新new个,这里需要销毁
g.DrawLine(pen, 20, 30, 50, 80);//没?需è要癮点?按恪?钮¥就í会á出?来ぁ?这a条?线?,?状痢?体?在ú自?动ˉ绘?制?窗洹?口ú的?时骸?候ò
g.Dispose();
}
private void Form_MouseMove(object sender, MouseEventArgs e)//每?次?移?动ˉ鼠酣?标括?,?其?坐?标括?显?示?到?窗洹?体?拦?上?
{
this.Text=string.Format("x={0},y={1}",e.X,e.Y);
}
}
}
命名空间:System.Drawing;(基本绘图操作)
Graphics对象,可以理解为一只画笔,要在哪个控件上绘图,就要得到对应控件的Graphics对象(就是获得对应控件的绘图表面)。获得Graphics对象一般有两种方式:1.控件.CreateGraphics()//通过该方式创建后要调用g.Dispose()方法释放资源。2.在重写OnPaint()方法中通过参数PaintEventArgs e.Graphics;来获得,一般使用为Paint事件中。//通过这种方式一般不需要手动调用Dispose();区别OnPaint()与窗体的Paint事件。(画一些简单图形)
什么样类型的对象需要使用完成后Dispose()?
答:Pen,Brush,Font,Image,Ico,FileStream(文件操作),网络操作等。 (在这些类中封装了一些操作系统的资源)//Pens.XXX或Brushes.XXX等不需要,手动创建的才需要。强行释放资源会出错.
关于C#画图的一些介绍2
一.GDI+中的坐标系。
1.原点在左上角。X水平向右为正,Y垂直向下为正。
//(Demo,鼠标移动,显示坐标)
//定义一个图形的坐标,即指定了该图形离顶部与左边的距离。
//每个控件的左上角都是(0,0)
2.问题:完成一篇word文档,在电脑上和打印机上显示效果一样,为什么?
3.世界坐标(逻辑坐标)、页面坐标、设备坐标。
4.从使用的角度看,GDI+坐标系是一种转换规则,把你所制定的逻辑数据转换成最终设备驱动所能使用的数据。
5.Point、Size、Rectangle//封装,对”坐标”的封装
Point point1 = new Point(50, 50);
Point point2= new Point(100,100);
g.DrawLine(Pens.Tomato, point1, point2);
g.Dispose();
Point point1 = new Point(50, 50);
Point point2= new Point(100,100);
Size size=new Size(100,20); //封装一个size,宽度 高度,方遍。
g.FillEllipse(Brushes.Brown, point1.X, point2.Y,size.Width,size.Height);
g.Dispose();
Point point1 = new Point(50, 50);
Point point2= new Point(100,100);
Size size=new Size(100,20);
Rectangle rec = new Rectangle(point2, size);
g.FillRectangle(Brushes.Blue, rec);
g.Dispose();
二.DrawXXX(),画各种图形,Pen。空心
三.FillXXX(),填充,画实心的,Brush。实心
GDI实例练习
直线 字符串 箭头 小矩形点(小四方块儿) 鼠标移动显示坐标
新建窗体项目**
Form1右键属性
代码:
namespace 回来瞅瞅
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void FrmReport_MouseMove(object sender, MouseEventArgs e)
{
this.Text = string.Format("x={0},y={1}", e.X, e.Y);
}
//12个?点?的?数簓组哩?,?长¤度è12
public double[] data = { 34.3, 65.7, 33.1, 87, 57.3, 56, 99, 56.3, 41.6, 48.1, 57.3, 35.8 };
public PointF[] dataPoint = new PointF[12];
private void Form1_Paint(object sender, PaintEventArgs e)
{
//首骸?先è确ā?定¨x轴á和íy轴á的?交?点?,?原-点?
Point centerPoint = new Point(100, 350);
//得?到?当獭?前°窗洹?体?的?graphics对?象ó
Graphics g = e.Graphics;
Pen pen = new Pen(Color.Black, 1);//颜?色?,?宽í度è,重?新?new一?支§笔括?可é以?自?己o设Θ?置?一?些?更ü详ê细?的?属?性?,?供?我ò们?自?己o用?。£化ˉ小?箭y头?
pen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
//画-x轴á
//g.DrawLine(Pens.Black,centerPoint,new Point(centerPoint.X+300, centerPoint.Y));//起e点?是?交?点?,?终?点?new了?个?新?的?
g.DrawLine(pen, centerPoint, new Point(centerPoint.X + 400, centerPoint.Y));
//画-x轴á的?刻ì度è
for (int i = 0; i < 12; i++)
{
g.DrawLine(Pens.Black, new Point(centerPoint.X + (i + 1) * 30, centerPoint.Y), new Point(centerPoint.X + (i + 1) * 30, centerPoint.Y - 5));
//绘?制?x轴á显?示?的?汉o字?“°月?份”±
g.DrawString((i + 1).ToString() + "月?", this.Font, Brushes.Black, new PointF((centerPoint.X + (i + 1) * 30) - 5, centerPoint.Y + 3));
}
g.DrawString("月?份", this.Font, Brushes.Black, new PointF(532, 361));
//画-y轴á
g.DrawLine(pen, centerPoint, new Point(centerPoint.X, centerPoint.Y - 300));//
//画-y轴á刻ì度è
for (int i = 0; i < 10; i++)
{
g.DrawLine(Pens.Black, new Point(centerPoint.X, centerPoint.Y - (i + 1) * 25), new Point(centerPoint.X + 5, centerPoint.Y - (i + 1) * 25));
//绘?制?y轴á显?示?的?数簓字?10/20/30…-…-
g.DrawString(string.Format("{0}", (i + 1) * 10), this.Font, Brushes.Black, new PointF((centerPoint.X - 30), centerPoint.Y - (i + 1) * 25 - 5));
}
pen.Dispose();//new了?一?个?pen,?用?完?要癮释酣?放?
//计?算?12个?月?的?销ú售?额?对?应畖的?坐?标括?点?
for (int i = 0; i < data.Length; i++)
{
float y = centerPoint.Y - (float)(data[i] * 2.5);
float x = centerPoint.X + (i + 1) * 30;
PointF point = new PointF(x, y);
dataPoint[i] = point;//????????????????
}
//绘?制?图?表括?上?的?12个?点?,?并¢且ò用?直±线?链ⅰ?接ó,?方?法ぁ?一?
for (int i = 0; i < dataPoint.Length; i++)
{
g.DrawRectangle(Pens.Black, (int)dataPoint[i].X, (int)dataPoint[i].Y, 2, 2);
}
g.DrawLines(Pens.Black, dataPoint);//直±线?连?点?,?方?法ぁ?一?
}
}
}
这样成功绘制,但是咱们是为了应用面对对象的的类,比如在form2点击按钮在panel上直接显示。实例化一个类,new对象.
namespace GDI实际小例子
{
class Class1
{
//原-点?坐?标括?
public Point CenterPoint
{
get;
set;
}
//画-笔括? 声Θ?明÷属?性?
public Graphics g
{
get;
set;
}
public double[] data = { 34.3, 65.7, 33.1, 87, 57.3, 56, 99, 56.3, 41.6, 48.1, 57.3, 35.8 };
PointF[] dataPoint = new PointF[12];//坐?标括?点?
public void Draw()
{
Font font = new Font("宋?体?", 12);//刚?才?是?在ú窗洹?体?,?现?在ú自?己onew一?个?font了?,?急±着?要癮之?后ó销ú毁ù++++++++++++
Pen pen = new Pen(Color.Black, 1);//颜?色?,?宽í度è,重?新?new一?支§笔括?可é以?自?己o设Θ?置?一?些?更ü详ê细?的?属?性?,?供?我ò们?自?己o用?。£化ˉ小?箭y头?
pen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
//画-x轴á
//g.DrawLine(Pens.Black,CenterPoint,new Point(CenterPoint.X+300, CenterPoint.Y));//起e点?是?交?点?,?终?点?new了?个?新?的?
g.DrawLine(pen, CenterPoint, new Point(CenterPoint.X + 400, CenterPoint.Y));
//画-x轴á的?刻ì度è
for (int i = 0; i < 12; i++)
{
g.DrawLine(Pens.Black, new Point(CenterPoint.X + (i + 1) * 30, CenterPoint.Y), new Point(CenterPoint.X + (i + 1) * 30, CenterPoint.Y - 5));
//绘?制?x轴á显?示?的?汉o字?“°月?份”±
g.DrawString((i + 1).ToString() + "月?", font, Brushes.Black, new PointF((CenterPoint.X + (i + 1) * 30) - 5, CenterPoint.Y + 3));
}
g.DrawString("月?份", font, Brushes.Black, new PointF(532, 361));
//画-y轴á
g.DrawLine(pen, CenterPoint, new Point(CenterPoint.X, CenterPoint.Y - 300));//
//画-y轴á刻ì度è
for (int i = 0; i < 10; i++)
{
g.DrawLine(Pens.Black, new Point(CenterPoint.X, CenterPoint.Y - (i + 1) * 25), new Point(CenterPoint.X + 5, CenterPoint.Y - (i + 1) * 25));
//绘?制?y轴á显?示?的?数簓字?10/20/30…-…-
g.DrawString(string.Format("{0}", (i + 1) * 10), font, Brushes.Black, new PointF((CenterPoint.X - 30), CenterPoint.Y - (i + 1) * 25 - 5));
}
pen.Dispose();//new了?一?个?pen,?用?完?要癮释酣?放?
//计?算?12个?月?的?销ú售?额?对?应畖的?坐?标括?点?
for (int i = 0; i < data.Length; i++)
{
float y = CenterPoint.Y - (float)(data[i] * 2.5);
float x = CenterPoint.X + (i + 1) * 30;
PointF point = new PointF(x, y);
dataPoint[i] = point;//????????????????
}
//绘?制?图?表括?上?的?12个?点?,?并¢且ò用?直±线?链ⅰ?接ó,?方?法ぁ?一?
for (int i = 0; i < dataPoint.Length; i++)
{
g.DrawRectangle(Pens.Black, (int)dataPoint[i].X, (int)dataPoint[i].Y, 2, 2);
}
g.DrawLines(Pens.Black, dataPoint);//直±线?连?点?,?方?法ぁ?一?
font.Dispose();
}
}
}
namespace GDI实际小例子
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
//Class1 report = new Class1();
//report.CenterPoint = new Point(100, 300);
//report.g = this.panel1.CreateGraphics();
//report.Draw();
//report.g.Dispose();
}
private void button1_Click(object sender, EventArgs e)
{
Class1 report = new Class1();
report.CenterPoint = new Point(100, 300);
report.g = this.panel1.CreateGraphics();
report.Draw();
report.g.Dispose();
//report.
}
}
}