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

《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 关键字的作用&#xff1a; 主要作用在于 控制变量或函数的作用域、生命周期以及它们如何被不同部分的程序访问&#xff0c;从而帮助程序员管理内存、避免命名冲突&#xff0c;并实现特定的设计模式&#xff08;如单例模式&#xff09;。 1. 静态局部变量&#xff1a;当…...

基于文本和图片输入的3D数字人化身生成技术解析

随着虚拟现实、增强现实和元宇宙等技术的飞速发展,对高度逼真且具有表现力的3D数字人化身的需求日益增长。传统的3D数字人生成方法往往需要依赖大量的3D数据集,这不仅增加了数据收集和处理的成本,还限制了生成的多样性和灵活性。为了克服这些挑战,我们提出了一种基于文本提…...

C语言 | Leetcode C语言题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; 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安全性的重要性及实施策略

在当今日益互联的世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;成为连接不同软件系统的关键桥梁。随着API的使用越来越广泛&#xff0c;其安全性问题也日益凸显。一个不安全的API可能会使企业数据和用户信息面临严重的风险。因此&#xff0c;确保API的安全性…...

现在Java行情不好可以转.net吗?

转向.NET开发可能是一个选择&#xff0c;但要注意以下几点。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 技术转…...

大文件word生成的处理与解决策略

前言 对于简单word文档的生成导出&#xff0c;java已经有着很多技术来进行处理&#xff0c;在有着相对固定的格式样板下&#xff0c;采用word模板导出相对会是比较好的选择。但是当数据量且包含大量图片后&#xff0c;采用模板导出就显得无力了&#xff0c;模板的缺点是无法应…...

unity3d:GameFramework+xLua+Protobuf+lua-protobuf,与服务器交互收发协议

概述 1.cs收发协议&#xff0c;通过protobuf序列化 2.lua收发协议&#xff0c;通过lua-protobuf序列化 一条协议字节流组成 C#协议基类 CSPacketBase&#xff0c;SCPacketBaseC#用协议基类 proto生成的CS类&#xff0c;基于这两个基类。分别为CSPacketBase是客户端发送至服…...

二刷算法训练营Day30 | 回溯算法(6/6)

目录 详细布置&#xff1a; 1. 回溯总结 2. 332. 重新安排行程 3. 51. N 皇后 4. 37. 解数独 详细布置&#xff1a; 1. 回溯总结 回溯是递归的副产品&#xff0c;只要有递归就会有回溯&#xff0c;所以回溯法也经常和二叉树遍历&#xff0c;深度优先搜索混在一起&#x…...

【车载AI音视频电脑】200万像素迷你一体机

产品主要特点&#xff1a; -设备安装方便简洁&#xff0c;可通过3M胶直接将设备粘 贴到车前挡风玻璃上 -支持IE预览&#xff0c;手机&#xff0c;PAD实时预览&#xff0c; 支持电脑客 户端实时预览功能 -内置2路模拟高清, 每路均可达到200万像素。另 外可扩充2路1080P模拟…...

齐普夫定律在循环神经网络中的语言模型的应用

目录 齐普夫定律解释公式解释图与公式的关系代码与图的分析结论 使用对数表达方式的原因1. 线性化非线性关系2. 方便数据可视化和分析3. 降低数值范围4. 方便参数估计公式详细解释结论 来自&#xff1a;https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/language-model…...

如何在Android Studio上发布Flutter应用

发布Flutter应用到Android平台是一个多步骤的过程&#xff0c;涉及配置应用、生成签名密钥、配置Gradle文件、构建发布版本APK等步骤。本文将详细介绍这些步骤&#xff0c;帮助你顺利发布Flutter应用。 1. 准备你的应用 在发布之前&#xff0c;确保你的应用在开发环境中运行良…...

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前端不挂科&#xff1a;深入探索与实战指南 在数字化时代的浪潮中&#xff0c;Web前端开发已成为一项炙手可热的技能。然而&#xff0c;对于许多初学者来说&#xff0c;如何避免在Web前端课程中挂科却成为了一道难题。本文将从四个方面、五个方面、六个方面和七个方面&…...

Golang | Leetcode Golang题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; 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时间同步服务器助力水库水坝水利自动化建设 水库大坝监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置&#xff08;内置通信装…...

程序员应该具备什么职业素养?

程序员应该有什么职业素养&#xff1f; 作为一个程序员&#xff0c;拥有以下职业素养是非常重要的&#xff1a; 扎实的技术功底&#xff1a;作为程序员&#xff0c;首先要具备扎实的技术基础&#xff0c;包括编程语言、算法、数据结构等方面的知识&#xff0c;能够熟练地解决问…...

linux 安装sftp及使用sftp上传和下载

一、centos7 安装sftp 1.安装 OpenSSH 服务&#xff1a; sudo yum install openssh-server2.启动 SSH 服务&#xff0c;并设置为开机启动&#xff1a; sudo systemctl start sshd sudo systemctl enable sshd3.创建一个新用户&#xff0c;用于SFTP连接&#xff08;替换your_…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...