Windows GDI和GDI+编程实例剖析(1)

简介:
作者:宋宝华  e-mail:21cnbao@21cn.com
1. 基本概念
GDI Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在:
1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动程序的调用;
为实现图形设备无关性, Windows  的绘图操作在一个设备描述表上进行。用户拥有自己的“逻辑坐标”系统,它独立于实际的物理设备,与“设备坐标”相对应。开发 Windows 应用程序时,程序员关心的是逻辑坐标,我们在逻辑坐标系上绘图,利用 GDI 将逻辑窗口映射到物理设备上。
2GDI能检测具体设备的能力,并依据具体的设备以最优方式驱动这些设备,完成真实的显示。
 GDI 函数大致可分类为:设备上下文函数(如GetDCCreateDCDeleteDC)、画线函数(如LineToPolylineArc)、填充画图函数(如EllipseFillRectPie)、画图属性函数(如SetBkColorSetBkModeSetTextColor)、文本、字体函数(如TextOutGetFontData)、位图函数(如SetPixelBitBltStretchBlt)、坐标函数(如DPtoLPLPtoDPScreenToClientClientToScreen)、映射函数(如SetMapModeSetWindowExtExSetViewportExtEx)、元文件函数(如PlayMetaFileSetWinMetaFileBits)、区域函数(如FillRgnFrameRgnInvertRgn)、路径函数(如BeginPathEndPathStrokeAndFillPath)、裁剪函数(如SelectClipRgnSelectClipPath)等。
 GDI 虽然使程序员得到了一定程度的解脱,但是其编程方式仍很麻烦。譬如,显示一张位图,程序员需要进行“装入位图―读取位图文件头信息―启用设备场景―调色板变换”等一连串操作。而有了GDI+,这些问题便迎刃而解了。
顾名思义,GDI+GDI的增强版。它是微软在Windows 2000以后操作系统中提供的新接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的“托管类接口”。GDI+主要提供了以下三类服务:
(1)  二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类;
(2)  图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。因此,GDI+为我们提供了BitmapImage等类,它们可用于显示、操作和保存BMPJPGGIF等图像格式。
(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()




 本文转自 21cnbao 51CTO博客,原文链接:http://blog.51cto.com/21cnbao/120757,如需转载请自行联系原作者


相关文章
|
2月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
2月前
|
Windows
[原创]用MASM32编程获取windows类型
[原创]用MASM32编程获取windows类型
|
2月前
|
JavaScript 前端开发 API
MASM32编程通过WMI获取Windows计划任务
MASM32编程通过WMI获取Windows计划任务
|
1月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
46 0
|
2月前
|
API Windows
MASM32编程获取Windows当前桌面主题名
MASM32编程获取Windows当前桌面主题名
|
3月前
|
安全 Windows
【Azure云服务 Cloud Service】Cloud Service的实例(VM)中的服务描述Software Protection 与 Windows Defender, 如何设置Windows Defender Antivirus服务
【Azure云服务 Cloud Service】Cloud Service的实例(VM)中的服务描述Software Protection 与 Windows Defender, 如何设置Windows Defender Antivirus服务
|
3月前
|
编译器 开发工具 C语言
解锁QtCreator跨界神技!Windows下轻松驾驭OpenCV动态库,让你的跨平台开发如虎添翼,秒变视觉编程大师!
【8月更文挑战第4天】QtCreator是一款强大的跨平台IDE,便于创建多平台应用。本教程教你如何在Windows环境下集成OpenCV库至Qt项目。首先,下载匹配MinGW的OpenCV预编译版并解压。接着,在QtCreator中新建或打开项目,并在.pro文件中添加OpenCV的头文件和库文件路径。确保编译器设置正确。随后编写测试代码,例如加载和显示图片,并进行编译运行。完成这些步骤后,你就能在QtCreator中利用OpenCV进行图像处理开发了。
215 6
|
3月前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
250 0
|
3月前
|
安全 Windows
【Azure 云服务】当Windows系统发布新的安全漏洞后,如何查看Azure云服务(Cloud Service)的实例是否也更新了安全补丁呢?
【Azure 云服务】当Windows系统发布新的安全漏洞后,如何查看Azure云服务(Cloud Service)的实例是否也更新了安全补丁呢?
|
4月前
|
弹性计算 缓存 网络安全
云服务器 ECS产品使用问题之远程桌面无法连接到Windows实例,该如何排查
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。