我是靠谱客的博主 幸福小丸子,最近开发中收集的这篇文章主要介绍Graphics类及相关类详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如果发现有什么错误地方,请指正,本文章仅仅是个人的了解和学习结果。
本文章介绍Graphics类的使用并通过demo进行了解,至于User32.Dll的使用在其他文章进行详细介绍。

1.相关介绍。
2.属性。
3.函数。
4.创建Graphics。
5.注意事项
6.Demo。

个人理解:Graphics是一个画家,而创建Graphics的参数Handle或者Image等为画板,当Graphics进行绘制时需要的Brush,Pen等则为工具,Graphics的函数则为行为。

1.介绍Graphics类和相关知识。
    1.1Graphics
        Graphics类包含在System.Drawing名称空间下,是密封类(Sealed)无法被继承,封装一个 GDI+ 绘图图面。
        Graphics对象表示GDI+绘图表面,是用于创建图形图像的对象。
    1.2GDI和GDI+:
        GDI图形设备接口(Graphics Device Interface)。
        GDI+是微软在操作系统中提供的新的图形设备接口,其通过一套部署为托管代码(由CLR执行的代码)的类来展示,这套类被称为GDI+的托管类接口。
    1.3System.Drawing命名空间
        GDI+相关的类全部在此命名空间下。
        Graphics 类提供了绘制到显示设备的方法。诸如 Rectangle 和 Point 等类可封装 GDI+ 基元。Pen 类用于绘制直线和曲线,而从抽象类 Brush 派生出的类则用于填充形状的内部。
        不支持在 Windows 或 ASP.NET 服务中使用 System.Drawing 命名空间中的类。

2.Graphics属性介绍:
    2.1Clip
        获取或设置Region,该对象限定此Graphics的绘图区域(此属性在不保证范围的情况下,请勿进行修改,否则会导致绘图结果只显示部分,因为绘图相关坐标不在此区域内)
    2.2ClipBounds
        获取一个 RectangleF 结构,该结构限定Graphics 的剪辑区域。
    2.3CompositingMode
        获取一个值,该值指定如何将合成图像绘制到此Graphics。
    2.4CompositingQuality
        获取或设置绘制到此Graphics 的合成图像的呈现质量。
    2.5InterpolationMode
        获取或设置与此 System.Drawing.Graphics 关联的插补模式
    2.6IsClipEmpty
        获取一个值,该值指示此Graphics 的剪辑区域是否为空。
    2.7IsVisibleClipEmpty
        获取一个值,该值指示此Graphics 的可见剪辑区域是否为空。
    2.8PageScale
         获取或设置此Graphics 的世界单位和页单位之间的比例。
    2.9PageUnit
         获取或设置用于此Graphics 中的页坐标的度量单位。
    2.10PixelOffsetMode
        获取或设置一个值,该值指定在呈现此Graphics 的过程中像素如何偏移。
    2.11RenderingOrigin
        为抵色处理和阴影画笔获取或设置此Graphics 的呈现原点
    2.12RenderingOrigin
        为抵色处理和阴影画笔获取或设置此Graphics 的呈现原点。
    2.13TextRenderingHint
        获取或设置与此Graphics 关联的文本的呈现模式。
    2.14Transform
        获取或设置此Graphics 的几何世界变换的副本。
    2.15VisibleClipBounds
        获取此Graphics 的可见剪辑区域的边框。

3.函数
    3.1AddMetafileComment(byte[] data)
    向当前 System.Drawing.Imaging.Metafile 添加注释。
3.2BeginContainer()
    重载overload
    保存具有此 System.Drawing.Graphics 的当前状态的图形容器,然后打开并使用新的图形容器。
3.3Clear(Color color)
    清除整个绘图面并以指定背景色填充。
3.4 CopyFromScreen
    重载overload
    执行颜色数据(对应于由像素组成的矩形)从屏幕到 System.Drawing.Graphics 的绘图图面的位块传输。
3.5 Dispose
    释放由 System.Drawing.Graphics 使用的所有资源。

3.6 DrawArc
    overload
     绘制一段弧线,它表示 System.Drawing.Rectangle 结构指定的椭圆的一部分。
3.7 DrawBezier
    overload
    绘制贝塞尔样条。
3.8 DrawClosedCurve
    overload
    绘制闭合基数样条。
3.9 DrawCurve
    overload
    绘制基数样条。
3.10 DrawEllipse
    overload
    绘制椭圆。
3.11 DrawIcon
    overload
     绘制指定的 System.Drawing.Icon 表示的图像。
3.12DrawIconUnstretched
    绘制指定的 System.Drawing.Icon 表示的图像,而不缩放该图像。
3.13DrawImage
    overload
    绘制指定的 System.Drawing.Image。
3.14DrawImageUnscaled
    overload
    使用图像的原始物理大小绘制指定的图像。
3.15DrawLine
    overload
    绘制一条线
3.16DrawPath
    绘制相互连接的直线和曲线
3.17DrawPie
    overload
    绘制扇形
3.18DrawPolygon
    overload
    绘制多边形
3.20 DrawRectangle
    overload
    绘制指定的矩形
3.21 DrawString
    overload
    绘制指定字符串
3.22EndContainer(GraphicsContainer container)
    关闭当前图形容器,并将此 System.Drawing.Graphics 的状态还原到通过调用 System.Drawing.Graphics.BeginContainer()方法保存的状态。
3.23 EnumerateMetafile
    overload
    将指定 System.Drawing.Imaging.Metafile 中的记录逐个发送到回调方法以在指定的位置显示。
3.24 ExcludeClip
    overload
    更新此 System.Drawing.Graphics 的剪辑区域,以排除 System.Drawing.Rectangle 结构所指定的区域。
3.25 FillClosedCurve
    overload
     填充由 System.Drawing.Point 结构数组定义的闭合基数样条曲线的内部。
3.26 FillEllipse
    填充 System.Drawing.Rectangle 结构指定的边框所定义的椭圆的内部。
3.27FillPath
    填充 System.Drawing.Drawing2D.GraphicsPath 的内部。
3.28 FillPie
    填充椭圆所定义的扇形区的内部,该椭圆由 System.Drawing.RectangleF 结构和两条射线指定。
3.29FillPolygon
    填充 System.Drawing.Point 结构指定的点数组所定义的多边形的内部。
3.30FillRectangle
    填充 System.Drawing.Rectangle 结构指定的矩形的内部。
3.31 FillRegion
    填充 System.Drawing.Region 的内部。
3.32 Flush
    overload
    强制执行所有挂起的图形操作并立即返回而不等待操作完成。
3.33 GetContextInfo
     获取累积的图形上下文。
3.34 GetHalftonePalette 
    获取当前 Windows 的半色调调色板的句柄。
3.35GetHdc
    获取与此 System.Drawing.Graphics 关联的设备上下文的句柄。
3.36 GetNearestColor
    获取与指定的 System.Drawing.Color 结构最接近的颜色。
3.37 MeasureCharacterRanges
    获取 System.Drawing.Region 对象的数组,其中每个对象将字符位置的范围限定在指定字符串内。
3.38 MeasureString
     测量用指定的 System.Drawing.Font 绘制的指定字符串。
3.39 Save
    保存此 System.Drawing.Graphics 的当前状态,并用 System.Drawing.Drawing2D.GraphicsState.

4.构造函数
    Graphics的构造函数无法访问,没办法new出来。
    4.1Graphics提供五中静态方法可以创建Graphics对象。
        1) Graphics.FromImage(Image);
        2)Graphics.FromHdcInternal(IntPtr hdc);
        3)Graphics. FromHwnd(IntPtr hwnd);
        4)Graphics.FromHdc(IntPtr hdc);
        5)Graphics.FromHdc(IntPtr hdc, IntPtr hdevice);
    4.2很多派生自事件参数EventArgs(包含事件数据的类的基类)的类中都有Graphics属性,例如PrintPageEventArgs、PaintEventArgs等。
    e.Graphics.

5.注意事项:
    1.在哪个控件上进行绘制,那么必须通过这个控件进行实例化Graphics对象。
    2.注意控件的层次问题,防止由于层次问题导致的绘图效果无法看到,例如在Form进行绘制,而Form中有Panel。
    3.由于窗体拖动问题,或者最小化等操作,会导致窗体和控件的重新绘制,也就是触发Paint事件,导致绘制内容丢失,所以,我个人在进行绘画的操作都是在控件Paint事件中重新绘制图画或者是在图片上绘制内容,通过窗体中的Picture进行显示绘制内容。

6.Demo进行举例讲解
    Code:
//panel的绘制事件
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            //我们能看到事件数据的对象e,包含属性Graphics
            Graphics graphicsOfE = e.Graphics;
            //Brush是个抽象类,无法被实现,派生类SolidBrush等。
            graphicsOfE.DrawString("有事件数据对象进行绘制而成", new Font("楷体",10, FontStyle.Bold), new SolidBrush(Color.Green), new Point(200, 100));

            //使用Handle进行绘制对比
            _graphicsOfPanel.DrawPie(new Pen(Color.Red) { Width = 4 }, new Rectangle(0, 200, 200, 200), 30, 30);
        }

        //此处无任何效果
        private void Form1_Load(object sender, EventArgs e)
        {
            //创建Graphics对象
            _graphicsOfPanel = Graphics.FromHwnd(this.panel1.Handle);
            //绘制线,Pens类,快速获取pen对象
            _graphicsOfPanel.DrawLine(Pens.Blue, new Point(0, 0), new Point(200, 200));

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //此处绘制没问题,在窗体最小化,或者将窗体放置到屏幕不可见部分后,绘图内容会丢失。
            //因为最小化后再次显示窗体会进行重新绘制
            _graphicsOfPanel.DrawRectangle(Pens.Blue, new Rectangle(200, 200, 200, 200));
        }
Effect Pictrue:
![这里写图片描述](https://img-blog.csdn.net/20170726070824812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ194dWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

After Moving Pictrue:
    ![这里写图片描述](https://img-blog.csdn.net/20170726070527613?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ194dWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

最后

以上就是幸福小丸子为你收集整理的Graphics类及相关类详解的全部内容,希望文章能够帮你解决Graphics类及相关类详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部