《Windows API每日一练》4.1 GDI绘图

本节必须掌握的知识点:

        GDI原理

        GDI函数调用

        GDI基本图形

4.1.1 GDI原理

GDI,全称是Graphics Device Interface(图形设备接口),是微软Windows操作系统中提供的一套用于渲染图形和格式化文本的API(应用程序接口)。GDI提供了一种相对简单的方式来进行二维图形绘制,包括线段、矩形、椭圆、多边形、位图和文本等。

GDI的核心原理涉及到了以下几个重要的内容:

1.设备上下文(Device Context,DC):设备上下文是GDI的核心概念,它是一个数据结构,包含了在设备中绘图的所有信息。包括绘图的颜色、字体、绘图模式等等。当你想要在窗口或者位图上绘图时,需要先获取或者创建对应的设备上下文。

2.GDI对象:GDI使用了许多不同的GDI对象来代表绘图的各个方面。例如,使用画笔(Pen)对象来表示线条的颜色和粗细,使用字体(Font)对象来表示字体等等。在需要绘制图形或者文本时,需要先创建并选择对应的GDI对象到设备上下文中。

3.绘图函数:GDI提供了一系列的函数来进行图形和文本的绘制。例如,LineTo函数用于绘制线段,Rectangle函数用于绘制矩形,TextOut函数用于输出文本等等。这些函数根据设备上下文中当前选择的GDI对象来执行绘图动作。

4.坐标系和变换:GDI使用坐标系来确定绘制图形的位置,包括设备坐标、逻辑坐标和窗口坐标等。GDI还提供了变换函数,如缩放、旋转和平移等,可以改变绘制物体的位置和形状。

总的来说,GDI是Windows操作系统中的一个重要组成部分,它提供了一套API来处理图形、文本和图像等图形操作。通过使用GDI,开发者可以实现各种图形和界面效果,使应用程序具有更丰富的视觉体验。

GDI的一个主要目的就是支持与设备无关的图形。 Windows程序应当毫无问题地在 Windows所支持的任何图形设备上输出。GDI提供了一种特殊的机制来彻底隔离应用程序和不同输出设备的特性,这样就可以支持与设备无关的图形。

图形输出设备被分为两大类:光栅设备( raster device)和矢量设备 vector device。大多数PC输出设备是光栅设备,这也就意味着它们将图像表示成以点的形式构成的矩阵。该类输出设备有视频显示适配器、点阵打印机和激光打印机。矢量设备则使用线条来绘制图通常指绘图机 。

大多数传统地计算机图形程序完全以矢量为主。输出设备使用像素表示图形,但程序并不以像素的形式来调用输出设备的接口函数。Windows GDI可以看作是一个高层的矢量绘制系统来使用,也可以使用它来进行相对底层的像素操作。

在这个方面来看,Windows GDI与传统图形接口语言之间的关系类似于 C与其他编程语言的关系。C的闻名之处在于它在不同操作系统和环境之间的高度可移植性。还有就是允许程序员执行底层系统函数,这是其他高级语言做不到的。就如图C常被当成“高级汇编语言”一样,你可以把GDI当成图形设备硬件的一种高层接口。

如前所述, Windows默认使用以像素为单位的坐标系统。大多数传统的图形语言都使用一个“虚拟”坐标系统,它的横轴和纵轴的范围是0~32767。尽管一些图形语言并不允许使用像素坐标,但是 Windows GDI允许使用任何一种坐标系统(可以使用其他依据物理测量得到的坐标系统),所以你可以使用虚拟坐标系统来保证程序与硬件独立,也可以使用设备坐标系统来完全迎合硬件的需求。

4.1.2 GDI函数调用

在Windows编程中,GDI(图形设备接口)的函数主要可以分为以下几个类别:

获取设备环境句柄

设备上下文(Device Context)函数:包括获取和释放设备上下文(如GetDC、ReleaseDC),保存和恢复设备上下文状态(如SaveDC、RestoreDC)。

●在WM_PAINT中获取的是无效区的句柄

   hDC = BeginPaint(hWnd,&ps);

      //其他代码

   EndPaint(hWnd,&ps);

●在非WM_PAINT中

1获取整个客户区DC

hDC = GetDC(hWnd);

//GetDC(NULL)时为屏幕DC

//其他代码

Release(hWnd,hDC);

2.获取整个窗口DC(含非客户区)

hDC = GetWindowDC(hWnd);

//其他代码

Release(hWnd,hDC);

●更通用的方法(未必一定要窗口相关联,也可以是内存或打印机的DC)

1.整个屏幕DC

 hDC =CreateDC(TEXT(“DISPLAY”),NULL,NULL,NULL);// “DISPLAY”为屏幕

 DeleteDC(hDC);

2.内存DC

 hdcMem= CreateCompatibleDC(hDC);

 DeleteDC(hdcMem);

3.获得图元文件的设备环境句柄

 hdcMeta= CreateMetaFile(pszFileName);

 hmf =CloseMetaFile(hdcMeta);

●只需要获取设备环境信息,而无需创建设备上下文 (DC)。

CreateIC 函数用于创建一个与指定设备相关的设备上下文,该设备上下文可以用于进行绘图操作。它通常用于创建一个用于绘制到屏幕或打印机的设备上下文。

GDI对象函数

GDI对象函数:创建和删除画笔、画刷、字体等GDI对象(如CreatePen、CreateBrush、CreateFont),选择这些对象进入设备上下文(如SelectObject),以及获取和设置这些对象的属性(如GetLogPen、SetLogBrush)。

■绘图函数:用来绘制线条、形状和图像,如LineTo、Rectangle、Ellipse、Polygon,以及BitBlt、StretchBlt等。

■文本输出函数:显示文本,以及对文本进行格式化、计算大小等,像TextOut,DrawText,GetTextExtentPoint32等。

■坐标和变换函数:进行坐标变换,包括设置视口和窗口,以及世界变换,包括SetViewportOrgEx,SetWindowExtEx,SetWorldTransform等等。

■裁剪和区域函数:定义和使用复杂的裁剪区域,像SelectClipRgn,CreateRectRgn等。

■滚动条和画面滚动函数:用于处理滚动条和滚动视图,包括ScrollWindow,SetScrollInfo,GetScrollInfo等。

■绘图控制函数:这些函数用于操作颜色和设置模式,例如SetBkMode,SetBkColor,SetTextColor等。

所有这些函数都可以在微软官方MSDN网址上找到详细说明和示例。

4.1.3 GDI基本图形

在GDI(图形设备接口)中,一些基本的图形包括线(Line)、矩形(Rectangle)、圆(Circle)、椭圆(Ellipse)、多边形(Polygon)、多线段(Polyline)等等。

基本图形

◆线:使用MoveToEx函数来设置起始点,然后使用LineTo函数来绘制一条从起始点到指定点的线段。

◆矩形:使用Rectangle函数来绘制一个矩形,参数指定了矩形的左上角和右下角的位置。

◆圆和椭圆:使用Ellipse函数来绘制一个椭圆,参数同样指定了椭圆所在的矩形的左上角和右下角的位置。如果该矩形是正方形,那么绘制出的椭圆就是一个圆。

◆多边形:使用Polygon函数来绘制一个多边形。你需要指定一个点数组,其中每个点表示多边形的一个顶点,然后GDI会按照顶点的顺序连接线段,并自动连接第一个点和最后一个点来关闭多边形。

◆多线段:使用Polyline函数来绘制一系列的线段。和Polygon一样,你会提供一个点数组,但是GDI仅仅只是按顺序连接这些点,而并不会尝试去关闭图形。

◆可被填充的封闭区域。当一系列的线条或者曲线构成一个封闭区域时,你可以使用当前GDI的画刷对象填充这个区域。这个画刷可以是纯色的,或者是使用某种填充模式(如一系列水平的、垂直的或者倾斜的图案),还可以是在水平或垂直方向不停重复的位图图像。

◆位图。位图是一个二维的位数组,每一个元素都对应显示设备上的一个像素,是光栅图形的基础。位图通常用于在显示器或者打印机上显示复杂(通常是真实世界)的图像。位图也通常用于显示必须要快速绘制的小图像,例如图标、鼠标指针以及出现在应用程序工具栏里的按钮。GDl支持两种类型的位图:旧式的(尽管现在仍然十分常用)“设备相关”位图(它属于GDI对象)和新式的(从Windows3.0起)“设备无关”位图(DIB)。DIB可以存放在磁盘文件中。我将在第章和第十四章讨论位图。

◆文本。文本通常是任何计算机图形系统中最复杂的部分。在所有 Windows的数据结构中,用于定义GDI字体对象和获取字体信息的数据结构是最庞大的。GDI从 Windows3.1开始支持 TrueType字体,这种字体是以填充的轮廓线为基础的,某些GDI函数可以操控这些轮廓线。 Windows98还继续支持旧式的基于位图的字体,因为它的兼容性较好,对内存需求也小。我们将在第十六章讨论字体。

所有这些图形的颜色和样式由当前选择进设备上下文(Device Context)的画笔(Pen)和画刷(Brush)决定。你可以使用CreatePen,CreateSolidBrush等函数来创建画笔和画刷,并使用SelectObject函数来选择它们。

GDI的其他方面

◆映射模式(mapping mode)和转换( transform)。尽管在默认时是以像素为单位进行绘制的,但并不是别无选择。GDI的映射模式允许以英寸(甚至几分之一英寸)、毫米或者其他你所想要的任何单位进行绘制。

◆图元文件( metafile)。一个图元文件是以二进制形式存储的GDI命令的集合。图元文件主要用于通过剪贴板转换矢量图形绘制的表现形式。我将在第十七章讨论图元。

◆区域( region)。区域是一个任意形状的封闭图形,通常可以表示为由一系列简单区域进行布尔运算后得到的结果。在GDI内部,可以使用一个从已知区域出发的一系列扫描线来定义一个复杂的区域。可以使用区域进行轮廓绘制、填充或者剪裁。

◆路径(path)。路径是存储在GDI内部的直线和曲线的集合。可以用于绘制、填充和剪裁。路径还可以转换为区域。

◆剪裁( (clipping)。当绘图被限制在客户区的一个特定的空间位置时,就发生了剪裁。那个特定的空间位置可以是矩形或者非矩形,它通常被指定为一个区域或者一个路径。

◆调色板( palettes)。仅在支持256种颜色时,才能使用自定义的调色板。 Windows仅保留其中的20种色彩以供系统使用。你可以改变其他236种色彩,这样就可以准确显示按位图形式存储的真实图像。我将在第十五章讨论调色板。

◆打印 printing)。尽管本章只讨论视频显示器。但在本章学到的所有知识几乎都可以应用于打印机。我将在第十三章讨论打印机。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设

京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 水库大坝监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置(内置通信装…

【机器学习】鸢尾花分类:机器学习领域经典入门项目实战

学习机器学习,就像学习任何新技能一样,最好的方法之一就是通过实战来巩固理论知识。鸢尾花分类项目是一个经典的入门项目,它不仅简单易懂,还能帮助我们掌握机器学习的基本步骤和方法。 鸢尾花数据集(Iris Dataset&…

对象存储服务的加密特性

实现思路 加密特性的方案,涉及如下设计点: 密钥的用途加密的位置加密的算法加密密钥的使用加密密钥的管理 密钥的用途 密钥的用途分为管理密钥和数据密钥。 管理密钥用于加密数据密钥,需要定期更换,更换成本低;假如…

计算机游戏因为d3dcompiler_47.dll丢失无法启动怎么办?解决只要d3dcompiler_47.dll丢失无法启动游戏软件的方法

d3dcompiler_47.dll 是一个动态链接库文件,属于 Microsoft DirectX 的一部分,主要负责编译和运行 3D 图形程序。它是支持 Direct3D 功能的核心组件,Direct3D 是一种用于编程 3D 图形的 API,广泛应用于游戏和图形密集型应用程序中。…

Linux 如何查看磁盘空间占用

Linux 磁盘空间满会导致的问题 当 Linux 系统的磁盘空间满时,可能会导致一系列问题和不良表现,影响系统性能和稳定性。导致的问题可能是: 系统性能下降:磁盘空间不足会使得系统无法正常写入临时文件,影响系统操作和运…

html实现粘贴excel数据,在页面表格中复制

录入数据时&#xff0c;有时候需要把excel中的数据一条条粘贴到页面中&#xff0c;当数据量过多时&#xff0c;这种操作很令人崩溃。本篇文章实现了从excel复制好多行数据后,可在页面粘贴的功能 具体实现代码 <!DOCTYPE html> <html lang"en"> <head…

ArcGIS for js 4.x FeatureLayer 点选查询

示例&#xff1a; 代码如下&#xff1a; <template><view id"mapView"></view></template><script setup> import "arcgis/core/assets/esri/themes/light/main.css"; import Map from "arcgis/core/Map.js"; im…

SAP ABAP 编码规范

文章目录 前言一、案例介绍/笔者需求二、命名规范 a.类型&#xff08;Type&#xff09; b.全局&#xff08;Global&#xff09; c.局部&#xff08;Local&#xff09; d.子程序&#xff08;Perform&#xff09; e.函数…

11.QLoRA微调ChatGLM3-6B

实战 QLoRA 微调 ChatGLM3-6B 大模型 实战 PEFT 库 QLoRA ChatGLM3-6B 微调数据集 AdvertiseGen AdvertiseGen 数据集获取 使用ChatGLM3-6b Tokenizer处理数据 关于ig nore_label_id 的设置&#xff1a; 在许多自然语言处理和机器学习框架中&#xff0c; ig nore_label_id 被…

Julia 数学函数

Julia 数学函数 Julia 是一种高性能的动态编程语言,特别适合于数值计算和科学计算。在数学领域,Julia 提供了丰富的内置函数,这些函数涵盖了从基本运算到高级数学运算的各个方面。本文将详细介绍 Julia 中的数学函数,并提供一些示例,帮助读者更好地理解和使用这些函数。 …

在VSCode中使用Vim

在VSCode中使用Vim&#xff0c;主要涉及到Vim插件的安装和配置。以下是在VSCode中使用Vim的详细步骤&#xff1a; 1. 安装Vim插件 打开VSCode&#xff1a;首先&#xff0c;启动你的VSCode编辑器。进入扩展面板&#xff1a;在VSCode的左侧活动栏中&#xff0c;点击扩展图标&am…

计算机网络实验(鲁东大学)-cisco-逃课

逃课脚本4-1第二关 以4-1 第二关为例 点开图形化界面&#xff0c;点开工具箱 点复制粘贴 把逃课代码复制粘贴进&#xff0c;点击保存 回到图形化界面&#xff0c;任意位置打开终端 点击shiftctrlv&#xff08;其他方式粘贴进终端也可&#xff09;后敲击回车&#xff0c;在…

[大模型]Phi-3-mini-4k-Instruct Lora 微调

本节我们简要介绍如何基于 transformers、peft 等框架&#xff0c;对 Phi-3-mini-4k-Instruct 模型进行 Lora 微调。Lora 是一种高效微调方法&#xff0c;深入了解其原理可参见博客&#xff1a;知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件&#x…

代码随想录算法训练营day6| 哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

day5休息 1. 哈希表理论基础 要了解哈希表的内部实现原理&#xff0c;哈希函数&#xff0c;哈希碰撞&#xff0c;以及常见哈希表的区别&#xff0c;数组&#xff0c;set 和map。 什么时候想到用哈希法&#xff0c;当我们遇到了要快速判断一个元素是否出现集合里的时候&#xf…

sslh一键在一个端口上运行多个服务(KALI工具系列二十三)

目录 1、KALI LINUX 简介 2、sslh工具简介 3、信息收集 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、操作示例 4.1 监听特定端口 4.2 配置SSH 4.3 配置apache 4.4 配置sshl 4.5 验证配置 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功能强大、…

基于线性核函数的SVM数据分类算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于线性核函数的SVM数据分类算法matlab仿真&#xff0c;通过程序产生随机的二维数据&#xff0c;然后通过SVM对数据进行分类&#xff0c;SVM通过编程实现&#x…

[大模型]Phi-3-mini-4k-instruct langchain 接入

环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 。 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行演示。 创建工作…

HTML具体应用介绍要点和难点以及优缺点分析

HTML(HyperText Markup Language)是超文本标记语言,它是用于创建网页的标准标记语言。HTML 描述了网页的结构和内容,但它并不包含如何显示这些内容的样式(如字体、颜色、布局等)或如何处理用户输入(如表单提交)的信息。这些通常由 CSS(层叠样式表)和 JavaScript 来实…

Java Android 静态内部类 以及优雅实现单例模式/避免handler内存泄漏

前言 Java 中的静态内部类(Static Nested Class)是定义在另一个类里面的一个静态类。它和普通的内部类有些区别,主要是静态内部类不需要依赖于外部类的实例就可以被创建和访问。这种类的特性使得它非常适合用来作为辅助类,用于支持外部类的功能。 特点以及使用场景 静态内…

云计算时代的等保测评挑战和应对策略

概述 云计算作为一种新兴的计算模式&#xff0c;以其灵活性、可伸缩性和经济性&#xff0c;正逐渐成为企业和组织构建信息系统的首选。然而&#xff0c;云计算环境下的信息安全等级保护&#xff08;以下简称“等保”&#xff09;测评面临着前所未有的挑战。本文将从等保测评的…