关于SetMapMode坐标变换以后的BitBlt使用

Windows GDI文本绘制:TextOut与DrawText的核心原理与实战选择 在Windows桌面应用开发中,图形设备接口(GDI)是界面渲染的基石,其文本绘制功能直接影响用户体验与性能。GDI通过设备上下文(DC)管理字体、颜色等绘制状态,开发者需理解其模型才能有效控制文本输出。TextOut函数提供像素级精准控制,如同狙击步枪,适合高性能场景,但需手动处理换行与对齐;而DrawText则集成自动换行、对齐等排版功能,如同瑞士军刀,简化了多行文本与动态布局的实现。两者分别代表了底层控制与开发效率的不同取舍,其选择需基于绘制性能、排版复杂度等具体需求。本文聚焦Windows GUI编 阅读详情
目标:现在用一个timer在一个static空间上动态绘制一个sin曲线,希望在大约一秒钟内画完一个sin周期图形

思路:

用timer触发Polyline函数依次连接sin数组内的点,然后动态画出sin曲线

第一次进入OnTimer画点1和点2

第二次进入OnTimer画点1,点2,点3

第三次进入OnTimer画点1,点2,点3,点4

以此类推

m_ArySin是一个Sin数组,X:0~2PI,Y=sin(X)


问题:

在timer内用双缓存实现绘图,由于sin数组内有正有负,为了直观化,引入坐标变化,把(X=0,Y=rect.bottom/2)设为原点,结果画出来的图如附件所示,感觉内存里的DC坐标并没有变化正确,虽然内存DC中的Y轴方向是朝上了,但是Y轴起始点好像还是在Y=0的位置


做了N次实验,发现如下代码能够达到预期目的,但是具体理由不详

		CBitmap memBitmap;//内存绘图
		CBitmap* pOldBmp = NULL;//内存绘图
		CRect rect; //控件区域


		//获取空间区域DC
		CWnd* pWnd = GetDlgItem(IDC_STATIC1);//控件窗口
		pWnd->GetClientRect(&rect);//控件客户区
		m_pDC = pWnd->GetDC();//获取控件DC


		//坐标转换
		m_pDC->SetMapMode(MM_ANISOTROPIC);//设置map模式
		m_pDC->SetWindowExt(rect.right, -rect.bottom);//设置窗口尺寸,逻辑单位
		m_pDC->SetViewportExt(rect.right, rect.bottom);//设置视口尺寸,物理单位
		m_pDC->SetViewportOrg(0, rect.bottom/2);//设置设备坐标原点
		//m_pDC->SetWindowOrg(0, rect.bottom/2);//设置逻辑坐标原点

//		CPoint PtTest;
//		PtTest = m_pDC->GetWindowOrg();
//		PtTest = m_pDC->GetViewportOrg();

		//m_pDC->MoveTo(0,0);
		//m_pDC->LineTo(10,-10);
		
		//pWnd->Invalidate();
		//pWnd->UpdateWindow();
		

		//创建内存绘图设备
		m_memDC.CreateCompatibleDC(m_pDC);
		memBitmap.CreateCompatibleBitmap(m_pDC,rect.right,rect.bottom);
		pOldBmp = m_memDC.SelectObject(&memBitmap);
		//m_memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,m_pDC,0,0,SRCCOPY);
		//m_memDC.BitBlt(0,-rect.bottom/2,rect.right,rect.bottom,m_pDC,0,-rect.bottom/2,SRCCOPY);


		//坐标转换
		m_memDC.SetMapMode(MM_ANISOTROPIC);//设置map模式
		m_memDC.SetWindowExt(rect.right, rect.bottom);//设置窗口尺寸,逻辑单位
		m_memDC.SetViewportExt(rect.right, -rect.bottom);//设置视口尺寸,物理单位
		m_memDC.SetViewportOrg(0, rect.bottom/2);//设置设备坐标原点
		//m_memDC.SetWindowOrg(0, rect.bottom/2);//设置逻辑坐标原点


		//先把图拷贝到内存获取底色
		m_memDC.BitBlt(0,-rect.bottom/2,rect.right,rect.bottom,m_pDC,0,-rect.bottom/2,SRC
vc6.0 MFC 动态曲线 SetMapMode 双缓冲绘图 vc6.0 动态曲线 运用了SetMapMode,SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt 注释也比较详细 双缓冲,但是我刷新还是用了全局,有点闪,没时间弄它。 立即下载

相关推荐

bitblt函数详解

详细解释api函数bitblt的用法,各参数设置,是 mfc函数的底层函数.

如何实现三种不同RAM?(单端口RAM、伪双端口RAM、真双端口RAM|verilog代码|Testbench|仿真结果)

RAM(随机存取存储器)是计算机系统中的一种主要存储器件,用于存储和读取数据。在RAM中,单端口RAM(Single-port RAM)和双端口RAM(Dual-port RAM)是两种常见的类型,双端口RAM又分为真双端口(True dual-port RAM)和伪双端口RAM(Simple dual-port RAM)。那么什么是单端口和双端口?又该如何区分真双端口和伪双端口?输入只有一组数据线和一组地址线,读写共用地址线,输出只有一个端口。

Loudrs的博客 1万+

Dia 使用说明

简述 在linux上面能找到dia这个工具还是挺幸运的,因为之前画流程图总是使用ubuntu默认的word工具 在里面画图,感觉流程图使用起来麻烦,并且视觉效果真的不好看。 自从使用Dia后,感觉至少画起来流程图会变得越来越标准了。但是Dia也存在问题,就是使用的文档很少,使用中遇到为后,查起来比较费劲,但是至少问题不是很多,所以使用中遇到的几点问题我就记下来,和大家分享,加快大家的开发和文档整理能力。 我会按照遇到的问题来说,不存在使用的先后顺序。 1. Dia 去掉背景中的线条 首先去点那个大一点的蓝色

linan101的博客 4926

ENVI 5.3与IDL 8.5安装指南:从下载到激活的完整流程

本文提供了一份详细的ENVI 5.3与IDL 8.5安装教程,涵盖从获取安装包、运行主程序、安装许可证到关键文件替换的完整流程。指南重点解决了激活过程中的常见问题,并分享了个人实践经验,旨在帮助用户,特别是遥感图像处理初学者,一次性顺利完成软件部署,为后续的科研与开发工作奠定基础。

weixin_29213827的博客 545

万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

这篇文章是图像处理的最后一篇文章,后面我们将进入新的章节。图像处理文章主要讲解的图像处理方法包括图像几何运算、图像量化采样、图像点运算、图像形态学处理、图像增强、图像平滑、图像锐化、图像特效、图像分割、傅里叶变换与霍夫变换、图像分类等。个人感觉如果你是编程初学者、Python初学者或图像处理爱好者,这个系列真心适合你学习,并且这篇文章算是Python图像处理的学习路线,希望您喜欢。

杨秀璋的专栏 2万+

【2026年米哈游春招 - 3月14日 -第一题- 行列相等】(题目+思路+Java&C++&Python解析+在线测试)

摘要 本文解决了一个矩阵行列和匹配问题:统计矩阵中行和等于列和的所有行列对数量。算法首先计算每行和每列的元素和,然后利用哈希表统计各行列和的出现次数。通过遍历列和并查询对应的行和出现次数,高效计算出匹配对数。该方法时间复杂度为O(nm),空间复杂度为O(n+m),适用于大规模矩阵数据。代码实现了Python、Java和C++版本,通过哈希表优化避免了暴力枚举,显著提高了计算效率。

m0_73659489的博客 83

C#每日面试题-属性和字段的区别

在C#面试中,“属性(Property)和字段(Field)的区别”是基础且高频的考点。很多初学者会把两者混为一谈,甚至觉得“属性就是加了get/set的字段”,但这种理解只停留在表面。面试考察的核心,是对“封装思想”的理解,以及两者在语法特性、底层实现、实际应用中的本质差异。今天我们从“基础认知→核心差异→底层原理→实际应用→面试避坑”五个层面,把这个知识点讲透,既保证新手能看懂,又能满足面试的深度要求。

Amon的专栏 779

《YOLO11魔术师专栏》专栏介绍 & 专栏目录

【原创自研模块】【多组合点优化】【注意力机制】【主干篇】【neck优化】【卷积魔改】 【block&多尺度融合结合】【损失&IOU优化】【上下采样优化】【小目标性能提升】【前沿论文分享】【训练实战篇】

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1万+

28-Halcon-- union_object_model_3d函数功能(用于3D模型融合)

Halcon算子union_object_model_3d是专业的3D模型融合工具,主要用于多视图拼接、部件组装和多源数据融合。该算子支持点云、网格和参数化模型输入,提供多种融合算法选择,包括基础点云拼接('points_cloud')、网格融合('mesh')和精确CAD布尔运算('cad')。工业应用涵盖逆向工程扫描拼接、汽车部件虚拟装配等场景,支持性能优化如空间分区和流式处理。算子还解决颜色属性融合、法向量保留等特殊需求,并提供拼接误差分析、拓扑验证等质量评估手段。最佳实践包含动态场景重建工作流和CA

weixin_45590420的博客 1055

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

下一篇: 关于2010下使用mscomm控件
drlsdrls
博客等级 码龄15年 5粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值