第八周笔记

这篇博客介绍了C#中使用GDI+进行图形绘制的相关知识,包括Graphics对象的获取、何时需要调用Dispose()方法以释放资源。还详细讲解了GDI+的坐标系,如原点位置、世界坐标、页面坐标和设备坐标的概念,并展示了DrawLine、FillEllipse和FillRectangle等基本图形的绘制方法。此外,文中还提及了面向对象的应用,如何在不同类之间实现图形绘制功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值