一.初步认识:

GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在:

  (1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动程序的调用。

  为实现图形设备无关性,Windows 的绘图操作在一个设备描述表上进行。用户拥有自己的"逻辑坐标"系统,它独立于实际的物理设备,与"设备坐标"相对应。开发Windows应用程序时,程序员关心的是逻辑坐标,我们在逻辑坐标系上绘图,利用GDI将逻辑窗口映射到物理设备上。

  (2)GDI能检测具体设备的能力,并依据具体的设备以最优方式驱动这些设备,完成真实的显示。

   GDI函数大致可分类为:设备上下文函数(如GetDC、CreateDC、DeleteDC)、画线函数(如LineTo、Polyline、Arc)、填充画图函数(如Ellipse、FillRect、Pie)、画图属性函数(如 SetBkColor、SetBkMode、SetTextColor)、文本、字体函数(如TextOut、GetFontData)、位图函数(如 SetPixel、BitBlt、StretchBlt)、坐标函数(如DPtoLP、LPtoDP、ScreenToClient、 ClientToScreen)、映射函数(如SetMapMode、SetWindowExtEx、SetViewportExtEx)、元文件函数 (如PlayMetaFile、SetWinMetaFileBits)、区域函数(如FillRgn、FrameRgn、InvertRgn)、路径函数(如BeginPath、EndPath、StrokeAndFillPath)、裁剪函数(如SelectClipRgn、 SelectClipPath)等。

  GDI虽然使程序员得到了一定程度的解脱,但是其编程方式仍很麻烦。譬如,显示一张位图,程序员需要进行"装入位图―读取位图文件头信息―启用设备场景―调色板变换"等一连串操作。而有了GDI+,这些问题便迎刃而解了。

  顾名思义,GDI+是GDI的增强版。它是微软在Windows 2000以后操作系统中提供的新接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的"托管类接口"。GDI+主要提供了以下三类服务:

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

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

  (3) 文字显示:GDI+支持使用各种字体、字号和样式来显示文本。

  GDI接口是基于函数的,而GDI+是基于C++类的对象化的应用程序编程接口,因此使用起来比GDI要方便。

二.实现了解--

头文件:

#include <GdiPlus.h>
        #pragma comment(lib, "GdiPlus.lib")//这是告诉编译器在编译形成的.obj文件和.exe文件中加一条信息,使得 链接器在链接库的时候要去找GdiPlus.lib这个库,不要先去找别的库。

在应用程序类添加一个保护权限的数据成员:

ULONG_PTR  m_gdiplusToken;

然后在应用程序类的InitInstance加上下面初始化代码:

BOOL C***App::InitInstance()
{

CWinApp::InitInstance();

Gdiplus::GdiplusStartupInput StartupInput;
   GdiplusStartup(&m_gdiplusToken,&StartupInput,NULL);
}

在应用程序类的InitInstance加上下面代码:(作用是销毁GDI+资源)

int C***App::ExitInstance()
{
 // TODO: 在此添加专用代码和/或调用基类
   
   Gdiplus::GdiplusShutdown(m_gdiplusToken);
   return CWinApp::ExitInstance();
}

例子:

CDC *pDC = pView->GetDC();
    Gdiplus::Graphics graphics(pDC->m_hDC);
    Gdiplus::Pen pen(Gdiplus::Color(255,0,0,255));
    Gdiplus::SolidBrush brush(Gdiplus::Color(255,0,0,255));
    Gdiplus::FontFamily fontfm(L"宋体");
    Gdiplus::Font font(&fontfm,24,Gdiplus::FontStyleRegular,Gdiplus::UnitPixel);
     CRect rt;
     pView->GetClientRect(&rt);
    Gdiplus::PointF pointF(rt.Width()/2,rt.Height()/2);
    graphics.DrawString(L"GDI+程序示意",-1,&font,pointF,&brush);
    graphics.ReleaseHDC(pDC->m_hDC);
    pView->ReleaseDC(pDC);
三.内容进阶:

在GDI+中,颜色的表示除了红绿蓝三种分量外,增加了一种叫做Alpha的变量,其作用是用来表示颜色的透明度,取值范围为0-255.本例中实现的图像透明度的改变主要就是改变图像中每一种颜色的Alpha的值来达到改变透明度的效果。

改变图像透明度的原理
        之前说过,在GDI+中增加了一个alpha的变量用于表示图像的透明度,可是由于在GDI+中不能直接改变图像中的alpha的值,因此我们要用到一个叫做ColorMatrix的结构体,他是一个5*5的数组,我们用其表示颜色的变换关系。下面是GDI+中ColorMatrix的定义

ColorMatrix的定义
[cpp] typedef struct{
     REAL m[5][5];
}ColorMatrix;

//REAL是单精浮点值。1.00f 表示图片颜色原值

下面为方便理解,我定义了个静态的例子:

static Gdiplus::ColorMatrix DisableMatrix = {

1.00f, 0.00f, 0.00f, 0.00f, 0.00f,
            0.00f, 1.00f, 0.00f, 0.00f, 0.00f,
            0.00f, 0.00f, 1.00f, 0.00f, 0.00f,
            0.00f, 0.00f, 0.00f, 0.X0f, 0.00f,
            0.00f, 0.00f, 0.00f, 0.00f, 1.00f };

//X:为任意值(0-9)

下面是GDI+下的一个颜色变换公式

1   0   0   0   0
                                           0   1   0   0   0

[R  G  B A 1]=[r  g  b  a  1]0   0   1   0   0

0   0   0   1   0

0   0   0   0   1

解释下,R/G/B/A表示颜色变换后的红、绿、蓝和透明度的分量,r/g/b/a表示颜色变换前图像的红、绿、蓝和透明度的分量,后面是一个5*5的矩阵,这个矩阵就是ColorMatrix结构体的5*5数组。根据矩阵的乘法,我们要改变图像的透明度,只需定义一个ColorMatrix结构体,将第四行第四列的数改成相应的透明度即可。

也就是改变第四行第四列的X值即可。。。

图像透明度对话框实现:

。。。。。。。。。。。。。。。。。时间有限,请看下篇

GDIplus学习--业精于勤荒于嬉,行成于思毁于随相关推荐

  1. 业精于勤荒于嬉 行成于思毁于随

    对"业精于勤荒于嬉 行成于思毁于随"有感 今天上网浏览到一个博客http://www.cnblogs.com/hnrainll/,我深深的受到了启发.特别是它的博客的名字是&quo ...

  2. 业精于勤荒于嬉-行成于思而毁于随

    最近恰逢日程都集中到了一起, 心思有点混乱, 感情有点弥散, 梦里也竟然思考了很多. 这是正常的吧, 总会有比较的, 人又是贪婪的, 你不能期望你拥有的什么都是最好的, 要适时降低自己的期望, 人生才 ...

  3. 业精于勤荒于嬉,行成于思毁于随

    业精于勤荒于嬉,行成于思毁于随 转载于:https://www.cnblogs.com/ivanlee-ee-233/p/8763526.html

  4. FPGA学习笔记(2020.04.24)业精于勤荒于嬉,成于思毁于随

    FPGA自学笔记(2020.04.24) 最近老师再教在系统编程技术,已经上过四节课,发现在家 学习效率低下好多东西都忘掉了.所以做一下总结笔记来让自己印象深刻. 业精于勤荒于嬉,成于思毁于随. 第一 ...

  5. 业精于勤,荒于嬉;行成于思,毁于随。─韩愈 给我的启示

    业精于勤,荒于嬉;行成于思,毁于随.这句名言大家可能都常见这句话,但是大家明白吗?你们知道这句话的含义吗?那能联系实际说说你经历的事吗? 业精于勤,荒于嬉;行成于思,毁于随.这大家可能都知道,这句名言 ...

  6. FALSE/TRUE与false/true的区别--C++--业精于勤荒于嬉,行成于思毁于随

    1.FALSE/TRUE与false/true的区别: false/true是标准C++语言里新增的关键字,而FALSE/TRUE是通过#define,这要用途 是解决程序在C与C++中环境的差异,以 ...

  7. objective-c中 -(void)和+(void) 业精于勤荒于嬉,行成于思毁于随

    -(void)是实例方法,只有定义了这个类的实例,才能用实例调用这个方法. +(void)是类方法,用类名可以直接调用这个方法. 例如: @interface ClassName - (void)pr ...

  8. 业精于勤毁于嬉,行成于思毁于随

    勤基本能做到了,但是要更勤! 思还没有做到,现在只做到大量的获取知识,思考方面做的比较少,需要注意啊!!! 什么叫做思考? 就是同一件事情,你思考如何处理,别人思考如何处理,再做对比,分析过程和结果, ...

  9. 业精于勤而荒于嬉 行成于思而毁于随

    理想很丰满,现实很残酷. 当每天晚上有各种理由不去学习的时候,缺发现躺在床上心慌慌.自己比其他技术员优秀的地方在哪?比那些菜鸟又值钱在什么地方?三年后的我应该是什么样?偶尔脑中有太多的迷茫和恐慌.既然 ...

最新文章

  1. 【Linux系统】基础总结
  2. Hadoop之回收站
  3. 属性“dataProvider”有多个初始值设定项。(注意:“dataProvider”是“mx.charts.BarChart”的默认属性)。...
  4. LeetCode 409. 最长回文串(计数)
  5. 【Flink】Could not complete the operation,Number of retries has been exhausted
  6. Kaldi AMI数据集脚本学习7---train_deltas.sh
  7. /proc/sysrq-trigger文件的强大功能 shell
  8. 发送HTTP请求返回415状态码的解决办法
  9. freeswitch exporter
  10. 全国银行开户行名称查询数据库,包括行号、电话、地址、
  11. 就业管理系统(Java毕业设计:SpringBoot项目)
  12. upc 9367 雷涛的小猫
  13. windows-chrome安装Elasticsearch-head插件
  14. 基础拓扑学笔记(1)——欧拉定理
  15. android图片裁剪xof,HttpServletResponse response相关头信息,内容信息设置
  16. 【解决方案】智慧国土管理靠什么?EasyCVR综合性视频监控管理系统成支撑
  17. inner join和outer join的区别
  18. 探析初代虚拟人Lil Miquela的陨落
  19. 借名买房规避限购政策的,合同应认定为无效
  20. 对话任正非:华为是一家全球化公司

热门文章

  1. 1062 最简分数 (C++)
  2. 流动电影放映服务器维修,流动数字电影放映机的日常操作与维护
  3. C语言/C++ 矩阵的右下半部分【简单易懂,代码可以直接运行】
  4. 什么是单元测试(unit testing)
  5. firefox浏览器修改样式为绿色护眼
  6. nginx 反向代理proxy_pass 后加斜杠和不加斜杆的区别
  7. JS截取URL中最后一个斜杆前(后)的内容
  8. 什么是高维组合特征?
  9. net slim 分割_如何用TensorFlow和TF-Slim实现图像标注、分类与分割
  10. 【转】Windows系统中简单卷、带区卷、跨区卷、镜像卷的测试对比