当前位置: 首页 > news >正文

GDI详解

    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要方便。

相关文章:

  • Jmeter 压测工具使用手册(完整版)
  • BitBlt(wingdi.h)
  • 位图是什么
  • DIB设备无关位图
  • CImage 类
  • CPaintDC 、CWindowDC、 CClientDC、 CDC的区别与联系
  • CWnd::Invalidate()用法
  • USB 协议分析之 HID 设备
  • XHR-XMLHttpRequest
  • 说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
  • Windows CreateFont
  • SelectObject
  • OpenGL、OpenCL、OpenCV的区别与联系
  • Opencv3概述及框架介绍
  • 分卷压缩详解
  • 分享的文章《人生如棋》
  • Golang-长连接-状态推送
  • JAVA多线程机制解析-volatilesynchronized
  • Laravel 实践之路: 数据库迁移与数据填充
  • mysql innodb 索引使用指南
  • MySQL-事务管理(基础)
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 基于webpack 的 vue 多页架构
  • 聚簇索引和非聚簇索引
  • 前端路由实现-history
  • 悄悄地说一个bug
  • 学习HTTP相关知识笔记
  • 用jquery写贪吃蛇
  • 用Python写一份独特的元宵节祝福
  • 昨天1024程序员节,我故意写了个死循环~
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​学习一下,什么是预包装食品?​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (2)Java 简介
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (蓝桥杯每日一题)love
  • (译)计算距离、方位和更多经纬度之间的点
  • .NET CLR Hosting 简介
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Redis的秒杀Dome和异步执行
  • .Net 知识杂记
  • .NET/C# 使窗口永不获得焦点
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET建议使用的大小写命名原则
  • .NET中的十进制浮点类型,徐汇区网站设计
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C语言]——函数递归