VC GDI双缓冲绘图

VC GDI双缓冲绘图

  • VC GDI双缓冲绘图
    • 创建内存DC和内存图片,缺一不可
    • 最好是封装一下内存绘制
    • 绘制效果 关键是不闪烁
    • PS 重绘机制

VC GDI双缓冲绘图

双缓冲绘图,知道这个知识点,每次用的时候还得踩一遍坑,真是服,总结记录一下,下次抄~

创建内存DC和内存图片,缺一不可

创建的内存DC需要绘制到内存图片上,绘制完成以后再拷贝到内存DC,所有两者缺一不可。

void CImageView::OnDraw(CDC* pDC)
{
	// TODO: 在此添加专用代码和/或调用基类
	CRect rect;
	GetClientRect(&rect);
	CDC memDC;
	memDC.CreateCompatibleDC(pDC);
	CBitmap bitmap;
	bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
	CBitmap* preBitmap = memDC.SelectObject(&bitmap);

	OnCompatibleDraw(&memDC);

	pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
	memDC.SelectObject(preBitmap);
	bitmap.DeleteObject();
	memDC.DeleteDC();
}

最好是封装一下内存绘制

void CImageView::OnCompatibleDraw(CDC * pDC)
{
	CMFCCompleteDoc* pDoc = (CMFCCompleteDoc*)GetDocument();
	if (pDoc != nullptr)
	{
		pDoc->m_UnitManager.OnDraw(pDC);
	}
}

绘制效果 关键是不闪烁

在这里插入图片描述

PS 重绘机制

由于是每次新建的内存DC和内存的图片,所以窗口失效可以选择不重新绘制,如果不是重新创建的内存DC和内存图片,则需要手动清空内存DC和内存图片。

问:需要每次重建内存DC和内存图片吗?
答:需要,因为设备DC随时会发生变化,例如窗口大小。如果需要不每次重建提升效率,则设备DC发生变化的所有地方需要重新创建内存DC和内存图片

void CMFCCompleteDoc::OnIdle()
{
	CDocument::OnIdle();

	CView* pView = GetActiveView();
	if (pView == nullptr)
	{
		return;
	}

	if (pView->IsKindOf(RUNTIME_CLASS(CImageView)))
	{
		CRect rect;
		pView->GetClientRect(&rect);
		pView->InvalidateRect(&rect, FALSE);
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何实现 ESP 设备多证书管理?

设置特定分区存储证书文件多证书文件管理证书格式转换证书下载使用证书文件 1、设置特定分区存储证书文件 在项目工程下分区表文件下定义证书分区表文件,如下: 如上,转换的 certificate.bin 下载地址就为 0x41000证书分区文件的大小可不做设…

Typora改变字体颜色

方法一:下载AutoHotkey并创建快捷键的方法(推荐) 第一步:在官网(https://www.autohotkey.com/)下载 AutoHotkey并傻瓜式安装,安装在任意盘符下均可; 第二步:在安装目录…

JavaScript 基础 DOM (三)

日期对象 实例化 获得当前时间 const date new Date() 获得指定时间 const date1 new Date( 指定时间) 方法 // 1. 实例化const date new Date();// 2. 调用时间对象方法// 通过方法分别获取年、月、日,时、分、秒const year date.getFullYear(); // 四位年份 时…

docker的基本相关知识和操作

镜像相关操作命令: 访问DockerHub搜索镜像,https://hub.docker.com/ 查看本地镜像:docker images 搜索镜像 docker search redis (搜索redis) 拉取镜像:docker pull redis (默认版本&#x…

【Python】列表和字典

知识目录 一、写在前面✨二、列表应用三、字典应用四、总结撒花😊 一、写在前面✨ 大家好!我是初心,希望我们一路走来能坚守初心! 今天跟大家分享的文章是 Python函数式编程第二弹,再次以两个简单的例子带大家更好的…

OpenStreetMap实战

介绍 OpenStreetMap(OSM)是一个由志愿者创建并维护的免费和开源的地图数据库。其目的是为全球任何人提供可自由使用、编辑和分发的地图数据。OpenStreetMap数据库中的地理要素包括道路、建筑、河流、森林、山脉、公共设施等。由于OpenStreetMap是开放的…

单点登录二:登录过程使用摘要算法和加盐的意义以及demo练习

上一篇《springboot项目使用redis、springSecurity、jwt实现单点登录》写了关于单点登录的架子&#xff0c;但是没有实现密码验证的细节。这里使用盐和摘要算法来实现一个密码验证的完整过程demo。 1、依赖没变&#xff0c;还是上一篇内容那些 <dependencies><depen…

接口测试简介以及接口测试用例设计思路

接口测试简介 1.什么是接口 接口就是内部模块对模块&#xff0c;外部系统对其他服务提供的一种可调用或者连接的能力的标准&#xff0c;就好比usb接口&#xff0c;他是系统向外接提供的一种用于物理数据传输的一个接口&#xff0c;当然仅仅是一个接口是不能进行传输的&#x…

多层感知机学习XOR实例

多层感知机学习XOR实例 多层感知机介绍使用多层感知机学习XOR实例传统统计数学方法&#xff08;传统机器学习&#xff09;使用多层感知机学习XOR 总结 多层感知机介绍 多层感知机&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;&#xff0c;又称为深度前馈网络…

JAVA并发编程之锁应用

Java并发包是Java中提供的一个用于支持多线程编程的工具包。Java并发包提供了多种机制来控制线程的执行&#xff0c;保证线程的安全性和可靠性。下面我们将介绍Java并发包的使用方法&#xff0c;并给出示例。 synchronized public class SynchronizedDemo { ​private int v;…

自学网络安全,一般人我劝你还是算了吧

学前感言: 我为什么会这样说&#xff0c;要一般人自学网络安全就算了&#xff0c;因为我不是一般人 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发 .3.有时多 google,baidu,我们往往都…

termux-x11教程

小粉丝已经求稿两个星期了&#xff0c;不写是不行了。 termux-x11 是Termux的一个图形化项目&#xff0c;官方是这么介绍的。 A Termux add-on app providing Android frontend for Xwayland.安装工具 我们需要在Termux和安卓系统上安装工具以成功的运行程序。 x11-repo&am…

使用canvas给图片添加水印

上接文章“图片处理” canvas元素其实就是一个画布&#xff0c;我们可以很方便地绘制一些文字、线条、图形等&#xff0c;它也可以将一个img标签里渲染的图片画在画布上。 我们在上传文件到后端的时候&#xff0c;使用input标签读取用户本地文件后得到的其实是一个Blob对象&a…

HNU-电路与电子学-小班3

第三次讨论 1 、直接用晶体管而不是逻辑门实现异或门&#xff0c;并解释这个电路是如何工作的。 &#xff08;6个 MOS 管构成&#xff09; 2 、通信双方约定采用 7 位海明码进行数据传输。请为发送方设计海明码校验位 生成电路&#xff0c;采用功能块和逻辑门为接收方设计海…

ISO_IEC_7816-3

介绍 ISO/IEC 7816 是一系列标准&#xff0c;规定了集成电路卡和此类卡的使用 互换。 这些卡是用于在外部世界和卡中的集成电路之间协商的信息交换的识别卡。 作为信息交换的结果&#xff0c;卡传递信息&#xff08;计算结果、存储的数据&#xff09;和/或修改其内容&#xff0…

路径规划算法:基于果蝇优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于果蝇优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于果蝇优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法果蝇…

2023全国酒店数据

数据内容字段结构 hotel_id int(11) NOT NULL, name varchar(100) DEFAULT NULL, name_en varchar(100) DEFAULT NULL, short_name varchar(100) DEFAULT NULL, province varchar(20) DEFAULT NULL, city_id int(11) DEFAULT NULL, city varchar(20…

Android12之源码手动生成aidl对应java/cpp/ndk/rust服务(一百五十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

博客系统(ssm版本)

在前面的文章中给大家介绍过博客系统的servlet版本&#xff0c;但是servlet的技术非常的老旧&#xff0c;我们在企业中用的都是springboot相关的框架&#xff0c;本章内容就是讲述如何一步一步的利用ssm的技术来实现博客系统。 目录 前期配置 创建数据库 配置文件 公共文件…

【JavaSE】Java基础语法(五):数组详解

文章目录 &#x1f378;1.1 数组介绍&#x1f378;1.2 数组的动态初始化1.2.1 什么是动态初始化1.2.2 动态初始化格式&#x1f378;1.3 数组元素访问1.3.1 什么是索引1.3.2 访问数组元素格式1.3.3 示例代码 &#x1f378;1.4 内存分配1.4.1 内存概述1.4.2 java中的内存分配 &am…