使用Windows GDI进行绘图

news2024/11/20 20:30:20

使用Windows GDI绘图,可以使用MFC,也可以直接使用Windows API绘图,两者其实都一样。MFC也是封装了Windows API。

下面以MFC为例,进行说明。因为MFC帮我们做好了一些底层,可以直接使用Windows GDI的函数。

在MFC中使用GDI进行绘图,主要就是在View类的OnDraw函数中进行编程,这个函数为

void ClassAView::OnDraw(CDC* pDC)

ClassAView是一个视图对象,CDC是设备上下文标识符,代表了一个抽象的绘图对象,一把来说就是窗口的绘图区。

在绘图之前,首先需要设置映射模式,然后设置画笔,笔刷,然后就可以直接进行一些几何元素的绘图的。

映射模式

CDC::SetMapMode(int nMapMode)

MapMode默认有多种,比如下面是一些定义
在这里插入图片描述
在这里插入图片描述
默认情况下使用的MM_TEXT,但是也可以通过设置为其他MM_ANISOTROPIC定义,这种方法比较自由,下面以MM_ANISOTROPIC为例来说明

其实设置映射模式,其实就是设置绘图区的逻辑坐标到设备坐标之间的关系。逻辑坐标就是我们在绘图时使用的坐标,设备坐标就是真实绘图区的像素坐标。在Windows文档中把逻辑坐标校正“窗口坐标”,而把设备坐标定义成“视口坐标”,有下面的关系
在这里插入图片描述
x W i n d o w s , y W i n d o w xWindows, yWindow xWindows,yWindow就是逻辑坐标
x V i e w P o r t , y V i e w P o r t xViewPort, yViewPort xViewPort,yViewPort就是设备坐标

其中 x V i e w E x t , y V i e w E x t xViewExt, yViewExt xViewExt,yViewExt可以用下面的函数进行设置

CSize CDC::SetWindowExt(int cx, int cy)
CSize CDC::SetWindowExt(Size size)

其中 x V i e w E x t , y V i e w E x t xViewExt, yViewExt xViewExt,yViewExt可以哦那个下面函数进行设置

CSize CDC::SetViewportExt(int cx, int cy)
CSize CDC::SetViewportExt(Size size)

返回值都是原来的范围

设置逻辑坐标原点

CPoint CDC::SetWindowOrg(int x, int y)
CPoint CDC::SetWindowOrg(POINT p)

设置设备坐标原点

CPoint CDC::SetViewportOrg(int x, int y)
CPoint CDC::SetViewportOrg(POINT p)

返回的都是原来的原点值

一般SetWindowOrg和SetViewportOrg只使用一个,因为使用两个会使得逻辑坐标到设备坐标之间转换比较复杂。在本文中使用SetViewportOrg。

因此使用窗口映射,可以把逻辑坐标系设置到绘图区的中心,并且X轴向右,Y轴向上

	CRect rect;
	GetClientRect(&rect);

	pDC->SetMapMode(MM_ANISOTROPIC);
	pDC->SetWindowExt(rect.Width(), rect.Height());
	pDC->SetViewportExt(rect.Width(), -rect.Height());
	pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2);

画笔

创建画笔的函数

BOOL CPen::CreatePen(int PenStyle, int penwidth, COLORREF color)

返回非0为成功,0为不成功

其中PenStyle有下面一些定义
在这里插入图片描述

penwidth是画笔的宽度,
color是画笔颜色,可以用RGB(r,g,b)来定义

创建画笔后,需要选择画笔

CPen *CDC::SelectObject(CPen *pen)

返回值是旧的画笔

使用完后删除画笔

BOOL CGdiOjbect::DeleteObject()

除了自定义的画笔,也可以使用库里面自带的画笔

CGDIObject *CDC::SelectStockObject(int nIndex)

返回值为旧的画笔,这样就不用自己创建画笔了,也不需要删除画笔
nIndex有下面3种库自带画笔
在这里插入图片描述

笔刷

笔刷是用于填充颜色的,创建和使用与画笔一致

创建笔刷

BOOL CBrush::CreateSolidBrush(COLORREF color)

选择笔刷与选择画笔一样,都是使用

CBrush* CDC::SelectObject(CBrush *brush)

删除笔刷也一样

BOOL CGdiObject::DeleteObject()

也可以选择库中定义好的一些笔刷

CGdiObject *CDC::SelectStockObject(int nIndex)

nIndex有以下一些自定义笔刷
在这里插入图片描述

绘图函数

绘制像素点

COLORREF SetPixel(int x, int y, COLORREF color)
COLORREF SetPixel(POINT p, COLORREF color)

返回值如果是RGB值,表示绘制成功;如果点不在绘图区,返回-1

绘制直线

CPoint CDC::MoveTo(int x, int y)
CPoint CDC::MoveTo(POINT p)

返回值是原来的位置,这个函数只是将位置更新,不进行绘图,绘图函数是下面这个

BOOL CDC::LineTo(int x, int y)
BOOL CDC::LineTo(POINT p)

绘制矩形框

BOOL CDC::Rectangle(int x1, int y1, int x2, int y2)
BOOL CDC::Rectangle(LPCRECT lpRect)

矩形框由左上角和右下角指定,矩形框不包含右边界和下边界。

绘制椭圆函数

BOOL CDC::Ellipse(int x1, int y1, int x2, int y2)
BOOL CDC::Ellipse(LPCRECT lpRect)

椭圆由外接矩形框来定义,外接矩形框的定义方法与上面一样。如果需要画一个圆形,让外接矩形框为正方形即可。

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

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

相关文章

如此建立网络根文件系统 Mount NFS RootFS

安静NFS系统服务 sudo apt-get install nfs-kernel-server 创建目录 sudo mkdir /rootfsLee 将buildroot编译的根文件系统解压缩到 sudo tar xvf rootfs.tar -C /rootfsLee/ 添加文件NFS访问路径 sudo vi /etc/exports sudo /etc/exports文件,添加如下一行 …

SecureCRT中添加命令显示为空如何处理?(原因添加了空行)

相关背景信息 配置相关路径:~/Library/Application\ Support/VanDyke/SecureCRT/Config包括的配置信息 按钮、命令、全局配置、色彩、以及license都在$ ls ButtonBarV4.ini Commands Global.ini SSH2.ini Button…

STM32单片机通过ST-Link 烧录和调试

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. ST-LINK V2 2. 操作步骤 2.1 连接方式 2.2 驱动安装常规步骤 2.3 Keil中的设置 3. 调式仿真 4. 常见问题排查 1. ST-LINK V2 ST LINK v2下载器用于STM32单片机,可以下载程序、调试…

代码随想录第49天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一…

为什么常用氢化物

知识星球(星球名:芯片制造与封测社区)里的学员问:diffusion工序,所需要的气体种类有哪些? Diffusion是什么工序? "Diffusion"工序是通过热能将掺杂剂原子扩散到硅片中,以形…

AD高速板设计--RJ45(笔记)

瑞芯微VS全志科技(处理器芯片王者) - 知乎 (zhihu.com) RTL8211E应用(二)之信号输入、输出接口_rtl8211eg中文资料-CSDN博客 Raspberry Pi 硬件 - Raspberry Pi 文档 RJ45接口的PCB设计布局布线注意事项 - 知乎 (zhihu.com) 以…

CTF之eval

首先我们先了解一下eval()函数 什么是eval()? eval() 函数把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码,且必须以分号结尾。 如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误…

OpenCV直方图计算

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV实现直方图均衡 下一篇 :OpenCV系列文章目录(持续更新中......) 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::split 将图像划分…

Kubernetes中文件挂载的四种方式

一. Kubernetes入门 1.1 Kubernetes创建POD过程 1.2. Kubernetes基本操作 命令说明用法create创建kubectl create -f xx.yamledit编辑kubectl edit svc [POD的service名称]get获取kubectl get pod --namespaceXXXpatch更新kubectl patch -f xx.yamldelete删除kubectl delete …

[SWPUCTF-2022-新生赛]ez_sql

title:[SWPUCTF 2022 新生赛]ez_sql 审题 根据提示,POST传参 得到假的flag 判断类型 字符型注入 判断列数 发现空格和’or’被过滤 重新构造 nss-1/**/oorrder/**/by/**/4#发现为3个字段 采用联合注入union 爆库 发现union被过滤,双写union绕过 发…

sheng的学习笔记-AI-支持向量机(SVM)

目录:sheng的学习笔记-AI目录-CSDN博客 目录 什么是向量机 SVM算法原理 SVM基本模型 SVM对偶问题 什么是对偶问题: 为什么使用对偶问题 拉格朗日定理 拉格朗日乘子法 对偶问题算法 非线性SVM算法原理 核函数 常用核函数 软间隔与正则化 软…

PMBOK® 第六版 项目是什么

目录 读后感—PMBOK第六版 目录 项目定义 定义:项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目的特征具备以下三点: 独特性:独一无二,无法简单重复过去的做法。 临时性:项目有明确的起点和终点&…

腾讯云邮件推送如何设置?群发邮件的技巧?

腾讯云邮件推送功能有哪些?怎么有效使用邮件推送? 腾讯云邮件推送以其稳定、高效的特点,受到了众多企业的青睐。那么,腾讯云邮件推送如何设置呢?又有哪些群发邮件的技巧呢?下面AokSend就来详细探讨一下。 …

AI预测体彩排列3第2套算法实战化测试第5弹2024年4月27日第5次测试

今天继续进行新算法的测试,今天是第5次测试。好了,废话不多说了,直接上图上结果。 2024年4月27日体彩排3预测结果 6码定位方案如下: 百位:6、2、1、7、8、9 十位:8、9、4、3、1、0 个位:3、7、8…

Python 数组控件的使用

当一个UI窗口界面内有多个相同类型的控件,且这多个控件的功能都类似时,使用数组控件是一个非常不错的选择,可以大大减少代码的编写 且 代码易读性强,可惜的是Python好象是没有数组控件这个东东。 我们来看看以下一个界面&#xff…

生成完美口型同步的 AI 代言人视频(及其实现原理详解)

目录 什么是Heygen? Heygen注册 Video Translation(视频翻译 完美口型同步) 实现原理详解 视频翻译部分 完美口型同步部分 什么是Heygen? Heygen是一款在线工具,可帮助您生成具有完美口型同步的 AI 代言人视频。 Heygen注册 https:…

SpringBoot 缓存

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 目录 一、缓存的作用二、SpringBoot启用缓存三…

循迹/跟随/摇头避障小车

循迹小车 智能小车2-循迹小车-CSDN博客 接线 B-1A -- PB0 B-1B -- PB1 A-1A -- PB2 A-1B -- PB10 循迹模块(左) -- PB3 循迹模块(右) -- PB4 CubeMx 在CubeMx配置,并重定义,在main.h会自动生成 #define B_1A_Pin GPIO_PIN_0 #define B_1A_GPIO_Port GPIOB #defi…

【开发问题记录】启动某个服务时请求失败(docker-componse创建容器时IP参数不正确)

问题记录 一、问题描述1.1 产生原因1.2 产生问题 二、问题解决2.1 找到自己的docker-compose.yml文件2.2 重新编辑docker-compose.yml文件2.3 通过docker-componse重新运行docker-compose.yml文件2.4 重新启动docker容器2.5 查看seata信息 一、问题描述 1.1 产生原因 因为我是…

【国标语音对讲】EasyCVR视频汇聚平台海康/大华/宇视摄像头GB28181语音对讲配置

一、背景分析 近年来,国内视频监控应用发展迅猛,系统接入规模不断扩大,涌现了大量平台提供商,平台提供商的接入协议各不相同,终端制造商需要给每款终端维护提供各种不同平台的软件版本,造成了极大的资源浪…