zoukankan      html  css  js  c++  java
  • GDI+学习---2.GDI+编程模式及组成类

      在使用GDI+的时候,您不必像在GDI中那样关心设备场景句柄,只需简单地创建一个Graphics对象,然后以您熟悉的面向对象的方式(如myGraphicsObject.DrawLine(parameters))调用它的方法即可。

      Graphics对象是GDI+的核心,与屏幕上的特定窗体有关,他不与Pen、Brush、Image、Path、Font等绑定,只需将这些对象作为参数,传给Graphics类的方法即可。

    如画线:

    Graphics graphics(*pDC);
     Pen pen(Color(255, 255, 0, 0));
     graphics.DrawLine(&pen, 0, 0, 100, 100);

    GDI+不再拥有当前位置

    GDI+绘图与填充方法分离

      在GDI+中,绘制矩形边框和填充其内部区域的方法是独立开来的。Graphics 类的DrawRectangle方法有一个参数,用于传入Pen对象的地址。而FillRectangle方法有一个参数,用于传入Brush对象的地址。

    GDI+的组成

      GDI+ API包含54个类、12个函数、6类(226个)图像常量、55种枚举和19种结构。

    1.核心类 Graphics

    Graphics(Image* image); // 用于绘制图像

    Graphics(HDC hdc); // 用于在当前窗口中绘图(常用)

    Graphics(HDC hdc, HANDLE hdevice); // 用于在指定设备上绘制图形

    Graphics(HWND hwnd, BOOL icm = FALSE); // 用于在指定窗口中绘图可以进行颜色调整

      DrawLine     ----    Pen  Color PointF 

      DrawRectangle ---- Pen Rect RectF

      DrawEllipse

      DrawArc

      DrawCurve  基数样条曲线(cardinal spline curve)平滑地通过每个点二没有尖角

      DrawBezier

      DrawString          ----   Font

      FillRectangle       ----    Brush Rect RectF

      清屏

      graph.Clear(Color::White);

    2.Point、PointF 

     Size、SizeF 

        Rect、RectF

    3.Color

    Color(BYTE a,BYTE r,BYTE g,BYTE b); a:色彩的透明度(0~255)

    Color(BYTE r,BYTE g,BYTE b);

    4.Pen

    5.Brush  GdiplusBrush.h

    派生类

    SolidBrush实心刷

    HatchBrush 条纹刷

    TextureBrush 纹理刷

    LinearGradientBrush 线性渐变刷   // gradient倾斜的,梯度

    PathGradientBrush 路径渐变刷

    6.文字

      Font等

      DrawString

    7.路径path

    8.区域(region) 

    Region(VOID); // 创建一个空区域

    Region(const Rect &rect); // 创建一个整数型矩形区域

    Region(const RectF &rect); // 创建一个浮点数型矩形区域

    Region(const GraphicsPath *path); // 由图形路径来创建区域

    Region(const BYTE *regionData, INT size);// 由(另一)区域的数据构造区域

    Region(HRGN hRgn); // 由GDI的区域句柄构造区域

    其中,创建矩形区域最简单,由路径创建区域最常用。

    9.变换(transform)

    Graphics类的3个成员函数

    TranslateTransform(REAL dx, REAL dy, MatrixOrder order = MatrixOrderPrepend);

    RotateTransform(REAL angle, MatrixOrder order = MatrixOrderPrepend);

    ScaleTransform(REAL sx, REAL sy, MatrixOrder order = MatrixOrderPrepend);

    其中的最后一个输入参数为矩阵相乘的顺序,取值为矩阵顺序枚举类型MatrixOrder中的符号常量,缺省值都为MatrixOrderAppend(左乘):

    typedef enum {

        MatrixOrderPrepend = 0, // 矩阵左乘(预先序,前置)

        MatrixOrderAppend = 1 // 矩阵右乘(追加序,后缀)

    } MatrixOrder;

     

    10.图像

    Image类

    派生类Bitmap、Metafile

     

    11.图元文件

    Metafile类

    图元文件中所包含的就是一系列绘图(包括绘制图像)指令及参数,属于矢量图形文件。它所占空间小、可以任意缩放(不会产生马赛克效应),但是绘制图形需要一定的时间。

    // 文件型

    Metafile(const WCHAR *filename);等

    // 流型

    Metafile(IStream *stream);等

    // DC句柄型

    Metafile(HDC referenceHdc, EmfType type = EmfTypeEmfPlusDual, const WCHAR *description = NULL);等

    // WMF/EMF句柄型

    Metafile(HENHMETAFILE hEmf, BOOL deleteEmf = FALSE);等

    其中最简单常用的是:Metafile(const WCHAR *filename);

    // 不带DC参数,只能用于打开已经存在的元文件

    Metafile mf(L"1.emf");

    常用且完整的构造函数是:

    Metafile(const WCHAR *fileName, HDC referenceHdc, EmfType type = EmfTypeEmfPlusDual, const WCHAR *description = NULL);

    // 带DC参数,只用于创建新图元文件

    Metafile mf(L"1.emf", GetDC()->m_hDC, MetafileTypeEmf, L"阴阳鱼");

    另一个较为常用的构造函数是:

    Metafile(HDC referenceHdc, EmfType type = EmfTypeEmfPlusDual, const WCHAR *description = NULL);

    它用于构造内存元文件。这些内存元文件构造函数还有对应的流构造函数版本。

    Metafile类的其他成员函数:

    // 显示元文件记录,需要与Graphics类的EnumerateMetafile函数及用户自定义的回调函数配套使用(似GDI的)

    Status PlayRecord(EmfPlusRecordType recordType, UINT flags, UINT dataSize, const BYTE *data);

    // 用于EMF到WMF的转换

    static UINT EmfToWmfBits(HENHMETAFILE hemf, UINT cbData16, LPBYTE pData16, INT iMapMode, EmfToWmfBitsFlags eFlags);

    // 可用于EMF的SDK函数

    HENHMETAFILE GetHENHMETAFILE(VOID);

    // 获取元文件头

    Status GetMetafileHeader(MetafileHeader *header) const;

    static Status GetMetafileHeader(const WCHAR *filename, MetafileHeader *header);

    static Status GetMetafileHeader(IStream *stream, MetafileHeader *header);

    static Status GetMetafileHeader(HENHMETAFILE *hEmf, MetafileHeader *header);

    static Status GetMetafileHeader(HMETAFILE hWmf, const WmfPlaceableFileHeader *wmfPlaceableFileHeader, MetafileHeader *header);

     

    为了将绘图记录保存到图元文件中,需要先创建元文件对象,然后用该图元文件对象再来创建图形对象,最后调用图形类的各种绘图函数来向图元文件中添加绘图记录

     

    具体方法如下:

    1.创建元文件对象

    Metafile mf(L"1.emf", GetDC()->m_hDC);//, MetafileTypeEmf, NULL);//带DC创建新的,会清空原图元文件,不能用于图元文件的播放。

    2.创建图形对象

    //Graphics(Image* image);//Metafile是Image的派生类

    Graphics myGraphics(myMetafile);

    3.调用各种函数对图元文件添加绘图记录

     Pen pen(Color(255, 255, 0, 0));
     myGraphics.DrawLine(&pen, 0, 0, 100, 100);

     

    也可以打开已有的图元文件(不带DC参数的构造)Metafile(const WCHAR *filename);再进行绘制

    利用Metafile类的成员函数

    Status PlayRecord(EmfPlusRecordType recordType, UINT flags,UINT dataSize, const BYTE *data);

    来重画图元文件中指定记录

     

    获取当前图元文件的边界矩形:

    调用Metafile类的成员函数

    Status GetMetafileHeader(MetafileHeader *header) const;

    来获取MetafileHeader对象,然后再用MetafileHeader类的成员函数:

    void GetBounds(Rect *rect);

    得到边界矩形。

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    python3--函数(函数,全局变量和局部变量,递归函数)
    Acunetix Web Vulnarability Scanner V10.5 详细中文手册
    Splunk学习与实践
    Visual studio code离线安装插件
    calling c++ from golang with swig--windows dll(一)
    Golang版protobuf编译
    大型网站架构系列:负载均衡详解(3)
    大型网站架构系列:负载均衡详解(2)
    大型网站架构系列:负载均衡详解(1)
    大型网站架构系列:分布式消息队列(二)
  • 原文地址:https://www.cnblogs.com/xslwm/p/9459549.html
Copyright © 2011-2022 走看看