MFC双缓冲绘图-程序员宅基地

技术标签: C++  MFC  

双缓冲绘图的核心是将所有绘图操作的屏幕设备CDC pDC 用自定义的内存设备CDC MemDC来代替,然后通过在内存的位图CBitmap中作图,然后将作好的图复制到屏幕MemDC来显示,同时禁止背景刷新,从而消除闪烁。

一、原因

窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时会由于过频的刷新而引起闪烁现象。因为窗体在刷新时会有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后再调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。

解决这一问题的有效方法就是双缓冲技术。所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。

二、双缓冲绘图方法

1.重载OnEraseBkgnd()函数

通过对视图类响应WM_ERASEBKGND消息,重载OnEraseBkgnd()函数。将调用父类的OnEraseBkgnd函数屏蔽,直接返回True。

BOOL CMYView::OnEraseBkgnd(CDC* pDC)
{
    return TRUE;
      //return CView::OnEraseBkgnd(pDC);
}

2.修改OnDraw函数

void CMYView::OnDraw(CDC* pDC){
 	CRect ClientRect;
	GetClientRect(&ClientRect); //获取客户区大小
	int nWidth = ClientRect.Width();
									
	int nHeight = ClientRect.Height();
	CDC memDC; //定义一个显示设备对象
	CBitmap bmp;//定义一个位图对象 
	memDC.CreateCompatibleDC(pDC); //建立与屏幕显示兼容的内存显示设备
		bmp.CreateCompatibleBitmap(pDC, nWidth,nHeight);//建立一个与屏幕显示兼容的位图	
	memDC.SelectObject(&bmp); //将位图选入到内存显示设备中
	
	memDC.FillSolidRect(0,0,nWidth,nHeight,RGB(0,0,0));  //先用背景色将位图清除干净,这里用黑色作为背景 
 
	/*下面添加绘图或图像显示程序
	CMYView.Draw1(memDC);
 	CMYView.Draw2(memDC);
    CMYView.Draw3(memDC);
    */	

	//将内存中的图拷贝到屏幕上进行显示 
	pDC->BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY);  
	//绘图完成后的清理 
    bmp.DeleteObject(); 
	memDC.DeleteDC();
 }

主要是将不同的绘图函数在OnDraw中进行调用,从而使得每一个绘图函数都是用memDC进行绘图,达成双缓冲绘图的目标。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ThorKing01/article/details/119173880

智能推荐

vue中$emit触发的事件,$on 第一次监听不到数据,利用eventBus解决,并进行页面动态响应_this.$nuxt $emit后的数据没有监听到-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏9次。组件与页面之间想通过$ emit,来触发一个事件,传递数据,可是当在目标页面利用$on监听事件,获取数据时,发现第一次并不能监听到事件,而返回再次点击就可以监听到数据。原因在于$ emit 先于$ on 执行了,Vue并没有储存监听事件,所以无法监听到数据。因为不想用vuex来解决,所以利用eventBus来解决,而且组件不直接通过$on来存储数据,而是利用bus实例来存储数据,然后组件只负责..._this.$nuxt $emit后的数据没有监听到

809 协议相关_809协议-程序员宅基地

文章浏览阅读442次。809 协议。_809协议

RGBA与RGB和区别与转换_rgba和rgb-程序员宅基地

文章浏览阅读3.8w次,点赞5次,收藏25次。R:红色值。正整数 | 百分数G:绿色值。正整数 | 百分数B:蓝色值。正整数 | 百分数A:Alpha透明度。取值0~1之间。(颜色的透明度)此色彩模式与RGB相同,RGB定义了颜色的红绿蓝值,在RGB模式上新增了Alpha透明度.alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%_rgba和rgb

安装Cloudera Manager出现的错误_differs from the canonical name-程序员宅基地

文章浏览阅读2k次。1、hostname localhost.localdomain differs from the canonical name localhost解决方法:CentOS7查看hostnameCentOS6查看vim /etc/sysconfig/network发现与/etc/hostname中的不一致运行命令hostnamectl set-hostname XXX2..._differs from the canonical name

制造大迷局:一边全球造假,一边卡世界脖子-程序员宅基地

文章浏览阅读94次。盘子刷七遍、马桶水可以喝、一辈子就为煮好一碗饭……篡改质检报告、专业造假几十年……究竟哪个才是日本制造业的真相?

关于Token_java生成token和解析-程序员宅基地

文章浏览阅读1.8k次。在使用Token机制时,当客户端向服务器端第1次提交请求时,或提交登录请求时,客户端不需要做特殊的处理,而服务器端会在识别此客户端身份后,会。在处理过程中,服务器端只需要具体检查Token、从Token中解析出客户端身份的相关数据即可,并不需要在服务器端保存各Token数据,所以,去,后续,客户端需要携带此Token提交各种请求,服务器端会根据Token中的数据来识别客户端的身份。,因为各服务器只需要具有相同的验证、解析Token的程序即可识别客户端的身份。,不会消耗服务器端存储资源!_java生成token和解析

随便推点

android中activity的四种加载模式_android activity加载-程序员宅基地

文章浏览阅读1.8w次,点赞2次,收藏26次。一、何为加载模式在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。二、加载模式有哪些以及如何配置1、在android里面,activity有四种加载模式:standard, singleTop, singleTask, singleInstance 。详细介绍在后面。2、配置方法直接修改A_android activity加载

Unity 2d 与NPC对话的实现_unity 2d 对话 确认-程序员宅基地

文章浏览阅读5.7k次,点赞5次,收藏96次。NPC的架构未触发前任务完成前任务完成后脚本需要在脚本属性指定按键提示、对话框、还有对话框的文本using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class NPCManager : MonoBehaviour{ public GameObject dialogImage; pub_unity 2d 对话 确认

React系列-初始化React脚手架_react初始化框架install-程序员宅基地

文章浏览阅读127次。xxx脚手架:用来帮助程序员快速创建一个基于xx库的模板项目包含了所有需要的配置(语法检查,jsx编译,devServer)下载好了所有相关的依赖项目的整体技术架构为:react+webpack+es6+eslint创建步骤:全局安装:npm install -g create-react-app切换到想创建项目的目录,使用命令:create-react-app hello-reactyarn start 启动服务yarn build 打包yarn test 测试_react初始化框架install

PHP 作业2.3 判断学生成绩等级_php判断学生成绩等级-程序员宅基地

文章浏览阅读4.8k次,点赞5次,收藏35次。利用ajax和php实现以下页面index.php<!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <title>判断学生成绩等级</title> </head> <style type="text/css"> body { background-image: url(img/1.png); } .main {_php判断学生成绩等级

window上gnuplot的安装和使用【1】_windows gnuplot安装使用-程序员宅基地

文章浏览阅读4.5k次,点赞8次,收藏34次。gunplot的安装以及使用1.gnuplot的原理及用途2.gnuplot的下载及安装3.使用gcc编译c语言程序4.使用gnuplot调用c语言程序所产生的数据并且画出图像5.参考文章1.gnuplot的原理及用途\qquad它是一个小巧实用的数据处理工具,主要用来绘制2D/3D的数据或者函数图像,但是也包含数学计算、拟合等功能。虽然它的名字里边有个“gnu”,但是它和大名鼎鼎的GNU没有..._windows gnuplot安装使用

MATLAB 风力发电系统低电压穿越—串电阻策略-程序员宅基地

文章浏览阅读375次,点赞10次,收藏7次。然而,在电网故障情况下,电网的电压可能会降低,导致风力发电系统无法正常注入电网,从而影响电力供应的稳定性和可靠性。具体而言,当电网电压降低到一定程度时,串电阻将会起作用,通过改变风力机转子电枢电压,使得发电机输出电压保持在一定的范围内,从而实现低电压穿越,确保系统的稳定运行。通过MATLAB的仿真工具和实验验证,研究人员可以评估和优化串电阻策略的参数配置,提高风力发电系统的低电压穿越能力,从而实现可靠的电力供应。MATLAB作为一种强大的数学计算软件,在风力发电系统的低电压穿越策略研究中发挥了重要的作用。