Windows GDIGDI+编程实例剖析(1)
作者:宋宝华  e-mail:21cnbao@21cn.com
1.基本概念
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要方便。
2.例程简述
本文后续的讲解都基于这样的一个例子工程(例程的开发环境为Visual C++6.0,操作系统为Windows XP),它是一个基于对话框的MFC应用程序,包括2个父菜单:
(1)    GDI
GDI父菜单下包括一个子菜单:
ID:IDM_GDI_DRAW_LINE      caption:画线
单击事件:在窗口绘制正旋曲线
(2)    GDI+
DIB位图父菜单下包括两个子菜单:
a. ID:IDM_GDIP_DRAW_LINE         caption:画线
单击事件:在窗口绘制正旋曲线
b. caption:新增功能,其下又包括下列子菜单:
(ⅰ)ID:IDM_Gradient_Brush      caption:渐变画刷
单击事件:在窗口演示GDI+的渐变画刷功能
(ⅱ)ID:IDM_Cardinal_Spline     caption:基数样条
单击事件:在窗口演示GDI+的基数样条函数功能
(ⅲ)ID:IDM_Transformation_Matrix caption:变形和矩阵对象
单击事件:在窗口演示GDI+的变形和矩阵对象功能
(ⅳ)ID:IDM_Scalable_Region   caption:可伸缩区域
单击事件:在窗口演示GDI+的可伸缩区域功能
(ⅴ)ID:IDM_IMAGE       caption:图像
单击事件:在窗口演示GDI+的多种图像格式支持功能
(ⅵ)ID:IDM_Alpha_Blend    caption:Alpha混合
单击事件:在窗口演示GDI+的Alpha混合功能
(ⅶ)ID:IDM_TEXT caption:文本
单击事件:在窗口演示GDI+的强大文本输出能力
后续篇章将集中在对上述菜单单击事件消息处理函数的讲解,下面的代码是整个对话框类CGdiexampleDlg的消息映射:
BEGIN_MESSAGE_MAP(CGdiexampleDlg, CDialog)
//{{AFX_MSG_MAP(CGdiexampleDlg)
  ON_WM_SYSCOMMAND()
  ON_WM_PAINT()
  ON_WM_QUERYDRAGICON()
  ON_COMMAND(IDM_GDI_DRAW_LINE, OnGdiDrawLine)
  ON_COMMAND(IDM_GDIP_DRAW_LINE, OnGdipDrawLine)
  ON_COMMAND(IDM_Gradient_Brush, OnGradientBrush)
  ON_COMMAND(IDM_Cardinal_Spline, OnCardinalSpline)
  ON_COMMAND(IDM_Transformation_Matrix, OnTransformationMatrix)
  ON_COMMAND(IDM_Scalable_Region, OnScalableRegion)
  ON_COMMAND(IDM_IMAGE, OnImage)
  ON_COMMAND(IDM_Alpha_Blend, OnAlphaBlend)
  ON_COMMAND(IDM_TEXT, OnText)
//}}AFX_MSG_MAP

END_MESSAGE_MAP()

Windows GDI和GDI+编程实例剖析(1)相关推荐

  1. MFC之GDI GDI+ 编程实例剖析

    GDI和GDI+编程实例剖析 1.基本概念  GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Pro ...

  2. windows编程之GDI绘图 -- 实验3-1

    windows编程之GDI绘图 – 实验3-1 文章目录 windows编程之GDI绘图 -- 实验3-1 @[toc] 1.实验名称 2.实验目的 3.实验的步骤和方法 4.代码实现 5.思考题 6 ...

  3. windows下使用fftw进行傅里叶变换及其编程实例

           傅里叶变换应该是上大二的时候<信号与系统>课上学过,上研后在<数字信号处理>课上又学了一遍.当初一直在想傅里叶变换到底有什么用呢?什么时候能用上呢?时间如梭,没想 ...

  4. Windows下C++多线程编程(入门实例)

    多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制(当然目前C++ 11 ...

  5. GDI 和GDI+ 混合编程

    主要来源于这篇文章 http://www.cnblogs.com/jcily/archive/2009/05/30/1492222.html?login=1#commentform 在Win32平台下 ...

  6. 视频教程-C++游戏编程实例精讲--3D射击游戏作弊-C/C++

    C++游戏编程实例精讲--3D射击游戏作弊 80后,游戏作弊工程师,从事C++开发14年,擅长语言:C,C++ 领域:服务器开发,精通MFC,STL,Boost,熟悉TCP/IP协议,熟练运用IOCP ...

  7. 初识GDI、GDI+

    GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重 ...

  8. 【GDI】 GDI与GDI+

    GDI Graphics Device Interface,即图形设备接口,是Windows API的一个重要组成部分.它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具 ...

  9. GDI和GDI+的区别和联系

    GDI: GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface ...

最新文章

  1. 为什么Control类提供了Invoke和BeginInvoke机制
  2. 036_CSS导航条
  3. 技术系列课回顾 | 浅谈 Serverless 开发和应用
  4. error while loading shared libraries: libatomic.so.1
  5. java项目使用junit_在Java 8之前的项目中使用JUnit 5
  6. dz论坛连接mysql数据库_dz论坛搬家后连接数据库等教程
  7. mysql 1033 frm_MySQL ERROR 1033 (HY000): Incorrect information in file. 处理一例
  8. java切面不需要接口了吗_详解Spring AOP 实现“切面式”valid校验
  9. Salesforce和SAP HANA的元数据访问加速
  10. android windows 虚拟机下载,windows10虚拟机安卓版
  11. 尔雅计算机基础答案山大,大学计算机基础2018尔雅满分答案
  12. SCADA和三大工业控制系统PLC、DCS、FCS
  13. 亚马逊多账号操作如何判断关联
  14. 论文阅读:Factoring Statutory Reasoning as Language Understanding Challenges
  15. ios引导商店评分问题
  16. 金蝶云苍穹轻量级开发人员申请试用
  17. 对安卓手机上的APP做monkey压力测试
  18. 打开win7任务管理器的六种方法
  19. 如何快速了解一个系统
  20. Android学习——Adapter适配器

热门文章

  1. ElasticSearch之Tokenizer 分词器
  2. 正月初四 | 2月15日 星期一 | 特斯拉否认推出16万元更便宜车型;中国首位百亿票房导演诞生;冷光烟花纳入烟花爆竹管理...
  3. 2020快手用户及营销报告
  4. 单独组件_阿里P8年薪百万大牛-教你打造一个Android组件化开发框架
  5. 客座编辑:杜小勇(1963-),男,中国人民大学信息学院教授,博士生导师,教育部数据工程与知识工程重点实验室主任。...
  6. 作者:桑健(1989-),男,中国科学院北京基因组研究所生命与健康大数据中心博士生...
  7. 【2016年第5期】研究(国家自然科学基金项目成果集萃)导读
  8. CSDN博客标题和目录的一点思考
  9. 【OJ】洛谷顺序结构题单题解锦集
  10. 【Java】Object基类