• Windows GDI和GDI+区别(实例剖析)


    1、概述

            GDI在全称是Graphics Device Interface,即图形设备接口。是图形显示与实际物理设备之间的桥梁。GDI接口是基于函数,虽然使程序员省力不少,但是编程方式依然显得麻烦。例如显示一张位图,我们需要进行“创建位图,读取位图文件信息,启用场景设备,调色板变化“等一系列操作。然而有了GDI+,繁琐的步骤再次被简化。顾名思义,GDI+就是GDI的增强版,它是微软在Windows 2000以后操作系统中提供的新接口。

    2、GDI+主要功能         GDI+主要提供以下三种功能:         (1) 二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类;

            (2) 图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。因此,GDI+为我们提供了Bitmap、Image等类,它们可用于显示、操作和保存BMP、JPG、GIF等图像格式。

            (3) 文字显示:GDI+支持使用各种字体、字号和样式来显示文本。         相比于GDI,GDI+是基于C++类的对象化的应用程序接口,因此用起来更为简单。GDI的核心是设备上下文,GDI函数都依赖于设备上下文句柄,其编程方式是基于句柄的;GDI+无需时刻依赖于句柄或设备上下文,用户只需创建一个Graphics 对象,就可以用面向对象的方式调用其成员函数进行图形操作,编程方式是基于对象的。

    3、GDI绘制实例         GDI在使用设备上下文绘制线条之前,必须先调用SelectObject 以使笔对象和设备上下文关联。其后,在设备上下文中绘制的所有线条均使用该笔,直到选择另一支不同的笔为止。         使用GDI画线代码如下

    // TODO: Add your command handler code here
       CClientDC clientDC;  //目标DC     
       CPen pen (PS_SOLID, 1, RGB(0, 0, 255));
       clientDC.SelectObject(pen.GetSafeHandle());
        //开始绘制
       clientDC.MoveTo(0, 0)
       clientDC.LineTo(rect.right, 0);
       clientDC.SelectObject(oldObject);

            从上述代码可以看出:在GDI编程中,几乎所有的操作都围绕设备上下文dc展开。的确,这正是GDI编程的特点!设备上下文是 Windows 使用的一种结构,所有GDI操作前都需取得特定设备的上下文,函数中的CClientDC dc (this) 语句完成这一功能。 利用GDI进行图形、图像处理的一般操作步骤为:1. 取得指定窗口的DC。2. 确定使用的坐标系及映射方式。3. 进行图形、图像或文字处理。4. 释放所使用的DC。但是,在GDI+中,只需将Pen对象直接作为参数传递给Graphics类的DrawLine等方法即可,而不必使Pen对象与 Graphics对象关联。 4、GDI+绘制实例         使用GDI+画线代码如下  

    // TODO: Add your command handler code here 
     CClientDC clientDC (this); 
     //创建Graphics对象
     Graphics graphics(clientDC);
     //创建pen
     Pen myPen;
     myPen.SetWidth(1);
     //画X轴
     myPen.SetColor(Color::Blue);
     graphics.DrawLine(&myPen, 0, 0, rect.right, 0);
    

            (1)创建 Graphics 对象:Graphics 对象表示GDI+绘图表面,是用于创建图形图像的对象。         (2)使用 Graphics 对象绘制线条和形状、呈现文本或显示与操作图像。         GDI+的相对与GDI而言,新增了一系列功能:渐变的画刷(Gradient Brushes)、基数样条函数(Cardinal Splines)、持久的路径对象(Persistent Path Objects)、变形和矩阵对象(Transformations &Matrix Object)、可伸缩区域(Scalable Regions)、Alpha混合(Alpha Blending)和丰富的图像格式支持等。下面,我们来逐个用实际代码实现GDI+的新增功能。     4.1渐变的画刷         (GDI+提供了用于填充图形、路径和区域的线性渐变画刷和路径渐变画刷。线性渐变画刷使用渐变颜色来填充图形。当用路径渐变画刷填充图形时,可指定从图形的一部分移至另一部分时画刷颜色的变化方式。例如,我们可以只指定图形的中心颜色和边缘颜色,当画刷从图形中间向外边缘移动时,画刷会逐渐从中心颜色变化到边缘颜色。 )  

    // TODO: Add your command handler code here
    CClientDC clientDC (this);
    CRect rect;
    GetClientRect(&rect);
    //创建Graphics对象
    Graphics graphics(clientDC);
    //创建渐变画刷
    LinearGradientBrush lgb(Point(0, 0), Point(rect.right, rect.bottom), Color::Blue, Color::Green);
    //填充
    graphics.FillRectangle(&lgb, 0, 0, rect.right, rect.bottom);

        4.2基数样条函数         (基数样条指的是一连串单独的曲线,这些曲线连接起来形成一条较大的曲线。样条由点(Point结构体)的数组指定,并通过该数组中的每一个点。基数样条平滑地穿过数组中的每一个点(不出现尖角),因此比用直线连接创建的路径精确。)  

       // TODO: Add your command handler code here
     CClientDC clientDC (this);
     //创建Graphics对象
     Graphics graphics(clientDC);
     Point points[] =
     {
      Point(0, 0), Point(100, 200), Point(200, 0), Point(300, 200), Point(400, 00)
     };
     //直接画线
     for (int i = 0; i < 4; i++)
     {
      graphics.DrawLine(&Pen(Color::Blue, 3), points[i], points[i + 1]);
     }
     //利用基数样条画线
     graphics.DrawCurve(&Pen(Color::Red, 3), points, 5);

        4.3变形和矩阵对象         (GDI+提供了Matrix对象,它是一种可以使变形(旋转、平移、缩放等) 简易灵活的强大工具,Matrix对象需与要被变形的对象联合使用。对于GraphicsPath类,我们可以使用其成员函数Transform接收 Matrix参数用于变形。)  

    // TODO: Add your command handler code here
     CClientDC clientDC (this);
     //创建Graphics对象
     Graphics graphics(clientDC);
     GraphicsPath path;
     path.AddRectangle(Rect(250, 20, 70, 70));
     graphics.DrawPath(&Pen(Color::Black, 1), &path); // 在应用变形矩阵之前绘制矩形
     // 路径变形
     Matrix matrix1, matrix2;
    
     matrix1.Rotate(45.0f); //旋转顺时针45度
     path.Transform(&matrix1); //应用变形
     graphics.DrawPath(&Pen(Color::Red, 3), &path);
    
     matrix2.Scale(1.0f, 0.5f); //转化成为平行四边形法则
     path.Transform(&matrix2); //应用变形
     graphics.DrawPath(&Pen(Color::Blue, 3), &path);

        4.4丰富的图像格式支持         (GDI +提供了Image、Bitmap 和Metafile 类,方便用户进行图像格式的加载、操作和保存。GDI+支持的图像格式有BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、 EMF等,几乎涵盖了所有的常用图像格式。)  

    from:http://edu.292775.com/windows/201211/16377.html

  • 相关阅读:
    得到一个文件夹中所有文件的名称的几个方法(命令指示符, C++, python)
    C++ 使用命名规范
    【前端】直击源头的让你3秒理解并且会用Jsonp!!!
    React Native新手入门
    【方法】纯jQuery实现星巴克官网导航栏效果
    【方法】jQuery无插件实现 鼠标拖动切换图片/内容 功能
    【总结】前端框架:react还是vue?
    【总结】2017年当下最值得你关注的前端开发框架,不知道你就OUT了!
    【疑点】<p></p>标签为什么不能包含块级标签?还有哪些特殊的HTML标签?
    【总结】最常用的正则表达式大全,你要找的这里都有!
  • 原文地址:https://www.cnblogs.com/lidabo/p/2848475.html
Copyright © 2020-2023  润新知