《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)。尽管本章只讨论视频显示器。但在本章学到的所有知识几乎都可以应用于打印机。我将在第十三章讨论打印机。
相关文章:
《Windows API每日一练》4.1 GDI绘图
本节必须掌握的知识点: GDI原理 GDI函数调用 GDI基本图形 4.1.1 GDI原理 GDI,全称是Graphics Device Interface(图形设备接口),是微软Windows操作系统中提供的一套用于渲染图形和格式化文本的API(应用程序…...
SQL Server 安装后,服务器再改名,造成名称不一致,查询并修改数据库服务器真实名称
SELECT SERVERNAME -- 1.查询旧服务器名称 SELECT serverproperty(servername) AS new --2.查询新服务器名称 -- 3.更新服务器名称 IF SERVERPROPERTY(servername) <> 新服务器名称替换 BEGIN DECLARE server_name NVARCHAR(128) SET server_name 新服务器…...
单例模式、工厂模式 c++关键字 static
static 关键字的作用: 主要作用在于 控制变量或函数的作用域、生命周期以及它们如何被不同部分的程序访问,从而帮助程序员管理内存、避免命名冲突,并实现特定的设计模式(如单例模式)。 1. 静态局部变量:当…...
基于文本和图片输入的3D数字人化身生成技术解析
随着虚拟现实、增强现实和元宇宙等技术的飞速发展,对高度逼真且具有表现力的3D数字人化身的需求日益增长。传统的3D数字人生成方法往往需要依赖大量的3D数据集,这不仅增加了数据收集和处理的成本,还限制了生成的多样性和灵活性。为了克服这些挑战,我们提出了一种基于文本提…...
C语言 | Leetcode C语言题解之第150题逆波兰表达式求值
题目: 题解: int evalRPN(char** tokens, int tokensSize) {int n tokensSize;int stk[(n 1) / 2];memset(stk, 0, sizeof(stk));int index -1;for (int i 0; i < n; i) {char* token tokens[i];if (strlen(token) > 1 || isdigit(token[0])…...
API安全性的重要性及实施策略
在当今日益互联的世界中,API(应用程序编程接口)成为连接不同软件系统的关键桥梁。随着API的使用越来越广泛,其安全性问题也日益凸显。一个不安全的API可能会使企业数据和用户信息面临严重的风险。因此,确保API的安全性…...
现在Java行情不好可以转.net吗?
转向.NET开发可能是一个选择,但要注意以下几点。我这里有一套编程入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。 技术转…...
大文件word生成的处理与解决策略
前言 对于简单word文档的生成导出,java已经有着很多技术来进行处理,在有着相对固定的格式样板下,采用word模板导出相对会是比较好的选择。但是当数据量且包含大量图片后,采用模板导出就显得无力了,模板的缺点是无法应…...
unity3d:GameFramework+xLua+Protobuf+lua-protobuf,与服务器交互收发协议
概述 1.cs收发协议,通过protobuf序列化 2.lua收发协议,通过lua-protobuf序列化 一条协议字节流组成 C#协议基类 CSPacketBase,SCPacketBaseC#用协议基类 proto生成的CS类,基于这两个基类。分别为CSPacketBase是客户端发送至服…...
二刷算法训练营Day30 | 回溯算法(6/6)
目录 详细布置: 1. 回溯总结 2. 332. 重新安排行程 3. 51. N 皇后 4. 37. 解数独 详细布置: 1. 回溯总结 回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起&#x…...
【车载AI音视频电脑】200万像素迷你一体机
产品主要特点: -设备安装方便简洁,可通过3M胶直接将设备粘 贴到车前挡风玻璃上 -支持IE预览,手机,PAD实时预览, 支持电脑客 户端实时预览功能 -内置2路模拟高清, 每路均可达到200万像素。另 外可扩充2路1080P模拟…...
齐普夫定律在循环神经网络中的语言模型的应用
目录 齐普夫定律解释公式解释图与公式的关系代码与图的分析结论 使用对数表达方式的原因1. 线性化非线性关系2. 方便数据可视化和分析3. 降低数值范围4. 方便参数估计公式详细解释结论 来自:https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/language-model…...
如何在Android Studio上发布Flutter应用
发布Flutter应用到Android平台是一个多步骤的过程,涉及配置应用、生成签名密钥、配置Gradle文件、构建发布版本APK等步骤。本文将详细介绍这些步骤,帮助你顺利发布Flutter应用。 1. 准备你的应用 在发布之前,确保你的应用在开发环境中运行良…...
C++ 字符串处理4-根据指定的分隔符将字符串分割为多个子串根据指定的分隔符将多个子串连接成一个字符串
1. 关键词 C 字符串处理 分割字符串 连接字符串 跨平台 2. strutil.h #pragma once#include <string> #include <vector>namespace cutl {/*** brief The type of vector strings used in this library.**/using strvec std::vector<std::string>;/*** b…...
微信小程序请求request封装
公共基础路径封装 // config.js module.exports {// 测试BASE_URL: https://cloud.chejj.cn,// 正式// BASE_URL: https://cloud.mycjj.com };请求封装 // request.js import config from ../config/baseUrl// 请求未返回时的loading const showLoading () > wx.showLoadi…...
Web前端不挂科:深入探索与实战指南
Web前端不挂科:深入探索与实战指南 在数字化时代的浪潮中,Web前端开发已成为一项炙手可热的技能。然而,对于许多初学者来说,如何避免在Web前端课程中挂科却成为了一道难题。本文将从四个方面、五个方面、六个方面和七个方面&…...
Golang | Leetcode Golang题解之第149题直线上最多的点数
题目: 题解: func maxPoints(points [][]int) (ans int) {n : len(points)if n < 2 {return n}for i, p : range points {if ans > n-i || ans > n/2 {break}cnt : map[int]int{}for _, q : range points[i1:] {x, y : p[0]-q[0], p[1]-q[1]if…...
京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设
京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 水库大坝监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置(内置通信装…...
程序员应该具备什么职业素养?
程序员应该有什么职业素养? 作为一个程序员,拥有以下职业素养是非常重要的: 扎实的技术功底:作为程序员,首先要具备扎实的技术基础,包括编程语言、算法、数据结构等方面的知识,能够熟练地解决问…...
linux 安装sftp及使用sftp上传和下载
一、centos7 安装sftp 1.安装 OpenSSH 服务: sudo yum install openssh-server2.启动 SSH 服务,并设置为开机启动: sudo systemctl start sshd sudo systemctl enable sshd3.创建一个新用户,用于SFTP连接(替换your_…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
