MFC如何避免重绘闪烁

使用内存DC防止窗口闪烁   在使用VC开发图形相关的应用程序时,常常需要使用MFC的CDC类直接把图形画在窗口上。这通常是通过响应Windows的WM_PAINT消息实现的。如果要画的图形比较复杂,或者比较大,那么画图过程可能会造成窗口的闪烁。当窗口调整大小时,这种闪烁由为明显。 解决窗口闪烁问题的有效办法就是使用内存DC,也称为缓冲DC。在内存中准备一个和窗口DC相同属性的DC,在这个内存DC上执行画图操作 阅读详情

只需要重写OnPaint()和OnEraseBkgnd(CDC* pDC)即可

OnPaint()代码如下:

if (IsIconic())
{
	CPaintDC dc(this); // 用于绘制的设备上下文

	SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

	// 使图标在工作区矩形中居中
	int cxIcon = GetSystemMetrics(SM_CXICON);
	int cyIcon = GetSystemMetrics(SM_CYICON);
	CRect rect;
	GetClientRect(&rect);
	int x = (rect.Width() - cxIcon + 1) / 2;
	int y = (rect.Height() - cyIcon + 1) / 2;

	// 绘制图标
	dc.DrawIcon(x, y, m_hIcon);
}
else
{
	CPaintDC dc(this);
	CRect rect;
	GetClientRect(&rect);
	CDC dcMem;                                                 //用于缓冲作图的内存DC
	CBitmap bmp;                                                //内存中承载临时图象的位图
	dcMem.CreateCompatibleDC(&dc);              //依附窗口DC创建兼容内存DC
	bmp.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());//创建兼容位图
	dcMem.SelectObject(&bmp);                         //将位图选择进内存DC
	dcMem.FillSolidRect(rect,dc.GetBkColor());//按原来背景填充客户区,不然会是黑色
	//Draw()//你得重绘内容,使用dcMem      
       dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台
	dcMem.DeleteDC();                                      //删除DC
	bmp.DeleteObject();                                       //删除位图
	CDialog::OnPaint();
}


OnEraseBkgnd(CDC* pDC)如下:

//return CDialog::OnEraseBkgnd(pDC);
return TRUE;





完全解决在MFC中连续贴图重绘闪烁问题 这是小弟写的一个五子棋程序,由于程序的黑白棋子的安放是利用贴图来完成,所以当发生重绘时界面闪烁的非常严重,屏幕卡死!拉不动! 小弟各方百度都没有发现解决办法,但是而然看到一个论坛回复中,一高手介绍利用CMemDC来解决,经过小弟的实验果然成功。特将此方法介绍给大家。   CMemDC:A helper class for a memory device context. The memor 阅读详情

相关推荐

在MFC对话框中添加背景图片中遇到的问题之解决

问题1:窗口闪 解决方法。:双缓冲 问题2:在onpaint中添加图像,重绘局部区域,造成图像不连续 。解决方法:在OnEraseBkgnd中添加图像操作,代码如下 BOOL CExamDlg::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default CRec

Eagle.China 工业自动化与机器人技术 748

用MFC对话框做无闪烁图片重绘

<br />用应用程序向导生成一个基于对话框的应用程序 <br />    把对话框Styles里的Border设置为Resizing,并把Minimize box跟Maximize box复选按钮都勾上<br />     现在我们为资源导入一张位图然后我们为程序添加四个私有变量private:<br /> int height;<br />  int width;<br />  CBitmap myBitmap;<br />  BITMAP bm;<br />     然后用类向导添加WM

sanfenlu的专栏 419

MFC解决窗口保存及重绘闪烁问题的一种比较好的方案 v1.0.5

包含文件说明: 1. SolveFlashingAndRedrawv1.0.5 纯净版 无闪烁的MFC应用框架,实际使用时把此工程改名成你要建立的项目名称,然后开始开发即可。你熟悉MFC的话研究这个框架的半个小时应该就明白并熟练运用了。 2.SolveFlashingAndRedrawv1.0.5 demo版 利用SolveFlashingAndRedrawv1.0.4框架写的一个示例小程序,主要展示框架要实现的优点特性。 3.VCRn 修改vc工程名工具 ___作者 田彬.exe 用网上找到的一个MFC改工程名称的小工具,很实用。如果你想使用本框架就可以用它来改成你想要的工程名了。 4. 未使用本框架的类似功能简化程序 没有使用框架的程序,实现的功能和Demo类似。但是运行之后改变窗口大小等,会发现图形闪烁很厉害! 5. SolveFlashingAndRedrawv1.0.5 demo版 运行截图.jpg 6. ReadMe.txt 说明文件。 补充说明: 工程使用vc6.0开发,如果你用vc6.0双击.dsw文件无法打开,请先打开vc6.0然后把.dsw拖动到vc上面。 如果这种方法还是无法打开,你新建一个vc6.0 mfc sdi程序,把示例中框架拷贝到这个新工程中,运行即可,代码量不是太多。 框架说明: /****************************************************** SolveFlashingAndRedraw框架说明 ******************************************************/ /** 项目名称: demo框架 版本号: v1.0.5 第一作者: Jef 地址: 中国/江苏 日期: 20100724 电子邮箱: dungeonsnd@126.com 版权: 1.您可以修改及免费使用本程序。 2.修改之后附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。 3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单位无关。 4.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: SolveFlashingAndRedraw框架是MFC解决窗口保存及重绘闪烁问题的一种比较好的方案(Win32解决方法类似)。 版本历史: v1.0.1 20091126 第一版本 v1.0.2 20091212 第二版本 1. 修改了部分变量的名字使其更符合其意义 2. 增加为两个工程,一是带demo例子的,另一是不带demo的纯净版. 3. 修改了其中一个错误. 如 CreateCompatibleDC之后没有调用DeleteDC等. v1.0.3 对v1.0.2进行了整理 v1.0.4 20100416 在v1.0.3的基础上进行整理,并增加了裁剪区,提高了绘图效率! v1.0.5 20100724 1. 添加了一个工具类CMemBmpDc,帮助产生一个内存DC,并把指定的内存位图选进去。方便绘图。 2. 演示了在适当时机如何高效画图,见Demo版的DrawSinwave(bool bDrawOnScreen)函数。 演示了用两种方法来绘图, 方法1. 直接绘图到屏幕上, 同时绘图到内存位图上,内存位图不会立即贴到屏幕上减少了内存拷贝的时间,提高了效率, 将来窗口失效时OnPait贴图到屏幕上. 这种方法的优点时减小了不必要的内存拷贝,缺点时当绘图内存复杂并且非常耗时可能会导致闪烁。 故适用于像本Demo的这样绘图(本例函数只绘制一小段直线)。 方法2. 绘制到内存位图上后把应该重绘的这一小块设成裁剪区,然后立即OnPait重绘这个裁剪区。 运行步骤: 直接运行demo里面的程序,在窗口上任意拖拉鼠标画线,然后点击菜单栏的几个示范菜单项,然后移动窗口、 改变窗口大小、最大最小化窗口、用其它窗口覆盖此窗口、鼠标放到任务栏。。。 以上种种操作观察窗口内的图像变化。可以发现窗口内图像几乎看不到闪烁,而且窗口的元素已经保存下来重绘时任然可以看到图像。 如何使用: 进行项目开发时,可以先建立项目,然后把本解决方案框架拷贝到新建项目中即可。 也可以自己根据需要修改纯净版。 其它: 友情提示,小心 View类头文件及View类的实现文件中有说明,使用时别把它弄到你实际项目里哦! 进行大量复杂的图形的输出,而且对效率要求特别高时要考虑适当修改此框架(如增加裁剪区)后再使用哦。 关于如何在此框架的基础上提高绘图效率可以参阅下面的文章 如何提高绘图的效率 文章摘录 http://hi.baidu.com/new8sun/blog/item/68ccba8a80c3aadafc1f1079.html MFC双缓冲解决图象闪烁 2009-06-13 23:03 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。 MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。

VC防止窗口闪烁

1、将Invalidate()替换为InvalidateRect()。   Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所以所需时间会少一些。虫虫以前很懒,经常为一小块区域的重画就调用Invalidate(),不愿意自己去计算需要重画的Rect,但是事实是,如果你确实需要改善闪烁的情况,计算一个Rect所用的...

weixin_30546933的博客 174

vc重绘时屏幕闪烁解决办法

通常在一般的图形程序在重绘时都有闪烁问题哦,这个解决图像重绘出现的闪烁问题,

MIT Cheetah Learning (一):State Estimate 从理论到实践:EKF融合IMU与编码器的状态估计全解析

本文深入解析了MIT Cheetah机器人中基于Extended Kalman Filter的状态估计技术,详细探讨了如何融合IMU与编码器数据以实现精准的State Estimate。通过四元数建模和传感器误差分析,揭示了EKF在复杂地形中的工程实践价值,为四足机器人的实时状态估计提供了完整解决方案。

weixin_30292843的博客 305

CWND子窗口重绘

在写完MFC之CButton空间重绘(GDI篇)后我以为会很快就能把GDI+篇弄出来。结果出了点意外,效果总是有不满意的地方。弄了好几天,才弄出一个满意的效果来。同GDI篇一样,实现了3种类型的按钮,以满足公司项目的需求,分别是下面三种类型:1.普通型按钮 2.菜单型按钮 3.静态按钮。(不规则,透明等效果完美的实现) 下面贴代码: 公共头文件(public.h): [cpp]

锄禾日当午 1691

用UltraISO制作镜像以RAW格式刻录系统到U盘后,在Windows上无法识别的解决办法

在这篇文章中,用UltraISO制作镜像后,会使得U盘无法识别!!!那么,如何抹掉U盘的数据,格式化U盘呢?

拥抱具身智能,昇腾Ascend C 2730

MFC-4简单的窗口重绘(非部分重绘)

#include &lt;afxwin.h&gt; #include "resource.h" #include &lt;afxtempl.h&gt; //定义模板类的头文件 class MyDocument : public CDocument { public: CArray&lt;CPoint,CPoint &amp;&gt; pArray;//&lt;保存的数据类型,...

weixin_33919950的博客 150

Arduino Uno R3开发板系列学习教程(番外篇:USB驱动安装与疑难排解)

本文详细介绍了Arduino Uno R3开发板USB驱动安装与疑难排解的完整指南,特别针对国产克隆版常见的CH340驱动问题提供解决方案。从识别开发板类型到Windows/Mac系统驱动安装步骤,再到常见问题排查与高级排错技巧,帮助开发者快速解决连接问题,确保程序烧录顺利进行。

weixin_29182481的博客 583

Dify如何实现自主学习

摘要:Dify通过构建感知-决策-执行-反馈的闭环实现"自主学习",本质是打造能自动获取信息、更新知识库并调整策略的Agent工作流。核心包括:1)建立知识库作为记忆体;2)搭建感知与执行工具获取实时信息;3)通过工作流编排决策"大脑",包含LLM决策节点、行动执行节点和反馈反思节点。典型应用如根据用户反馈优化回答风格,通过存储反思日志到知识库实现持续优化。这种机制使智能体能基于新数据和经验不断自我改进。

专注于技术研发行业技术主要有AI人工智能视觉识别、物联网技术、电商平台、app原生技术、微信小程序、鸿蒙语言开发、办公企业oa、ERP等,致力于做东半球最优秀的程序员 725

MFC控件重绘 背景重叠问题的一解决方法

问题:MFC控件重绘时,会出现原来的背景没有被擦除的情况,新绘制的覆盖在原来的界面上。 解决办法:InvalidateRect()。如果使用Invalidate()一般会造成界面闪烁,使用InvalidateRect()效果较好。 代码: m_Control.GetWindowRect(&Rect); ScreenToClient(&Rect); InvalidateRect(&a...

u010679316的博客 2538

WinCC动态选择报警记录案例

本例中需要确认查询的时间段以及查询的关键字,然后通过一个按钮来执行报警数据查询脚本,并把查询出的结果加载到当前报警控件中。<本例中数据查询脚本的思路是根据选项组所选定的参数加载相应的归档变量到在线趋势控件,根据设定的查询时间范围设定控件时间轴的开始时间及结束时间。本文以 WinCC V8.0为例,介绍如何动态的查询WinCC报警记录,包括关键字查询/时间&关键字查询,如图1所示。<在WinCC变量管理中创建不同的变量组,并在变量组下创建相应的变量,如图2 所示(下图并非实际变量值)。

weixin_45072604的博客 2709

[转]MFC 窗口重绘问题,最小化消失的问题解决

在客户区画直线等图形时, 发现当其最小化或者其他窗口遮挡时,出现窗口重绘,而将原来绘制的图形删除,上网上搜索知道,绘制图形的代码必须放置在Ondraw函数中,才能避免重绘时图形消失(因为一直在响应WM_PAINT消息,不断的重绘),但是这样做却只能保存最近的一次绘图,只适用于单幅固定的图形,对于其中有多幅图形就不能这么做了,解决的思路是:考虑到MFC时文档/视图类,视图CView负责数据的显示和修

笨笨D幸福 - 后花园 1万+

Deepseek 10分钟化身理性荐股神器:触碰程序员不敢想的天花板

在这个消息疯狂、波动频繁的市场,“理性”两字显得弥足珍贵。通过Deepseek+AkShare+Aktools+Dify四位一体的方案,能帮我们降低信息搜集成本,并在短期投资领域搭建出一套“可解释、低门槛、易定制”的量化荐股流程。不要再盲目听小道消息或依赖情绪驱动,不妨给自己一个机会,让数据说话。而要注意的是,“理性荐股”并非万能,它只是工具,最终的收益还得依赖投资者自身对风险和机遇的权衡。祝大家都能在这股市里收获理性的底气,寻得更精准的入场时机。

qqxdh的博客 3753

【3DSlicer】基于心脏ct影像重建3d模型及导出

软件:3DSlicer4.11 基于心脏ct影像重建3d模型

Liuees的博客 1万+

MFC学习之 重载OnEraseBkgnd()

重载OnEraseBkgnd() 原文地址:http://blog.youkuaiyun.com/abidepan/article/details/7956621 在使用VC进行绘图时,最郁闷的就是屏幕闪烁问题。有时只能使用双缓冲去解决,当然更多的时候是去忍受。有没有什么这种的方法?有,那就是重载OnEraseBkgnd()函数。该函数控制重绘图的背景刷新,默认将窗口用系统背景颜色填充,即用白色将

WITNESS 9361

【并发编程五】c++进程通信——共享内存(shared memmory)

现代操作系统,对于内存管理,采⽤的是虚拟内存技术,也就是每个进程都有⾃⼰独⽴的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。所以,即使进程 A中 和 进程 B中 的虚拟地址是⼀样的,其实访问的是不同的物理内存地址,对于数据的增删查改互不影响。这样这个进程写⼊的东⻄,另外⼀个进程⻢上就能看到了,都不需要拷⻉来拷⻉去,传来传去,⼤⼤提⾼了进程间通信的速度。⽤了共享内存通信⽅式,带来新的问题,那就是如果多个进程同时修改同⼀个共享内存,很有可能就冲突了。那共享内存的⽅式,就很好的解决了这⼀问题。

junxuezheng的博客 1万+

Windows下WTL与MFC使用Invalidate()闪烁问题解决

在WTL或MFC的程序中使用了按钮控件, 在触发点击事件向按钮上面赋值时总是会出现闪烁的情况; GetDlgItem(IDC_BUTTON_TEST).SetWindowText((LPCTSTR)strTest); GetDlgItem(IDC_BUTTON_TEST).Invalidate(); Calling the Invalidate method does not forc...

Aemonair's 世界树. 993

IMSL CNL 7.0.0 (x86-64)Crack

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MFC绘图闪烁问题

1、显示图像闪烁的问题 当窗口连续显示多帧图像或者窗口拉动时,窗口需要重绘,这时候,MFC总是先用背景色将显示区清楚,之后调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图像交替出现,使得显示窗口看起来在闪烁。 如果将背景刷设置为NULL,这样无论如何重绘图像都不会闪烁,但是使得窗口的显示非常混乱,因为重绘时没有背景色对原来绘制的图像清除,而又叠加了新的图像。

ljh0302的专栏 4352

jre9下载 jdk9

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

VC无闪烁刷屏技术的实现

VC无闪烁刷屏技术的实现在实现绘图的过程中,显示的图形总是会闪烁,笔者曾经被这个问题折磨了好久,通过向高手请教,搜索资料,问题基本解决,现将文档整理出来以供大家参考.  1.显示的图形为什么会闪烁  我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用O

红杉树(ecitnet)的博客 948

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Invalidate用法

<br />void CT25View::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 Invalidate(FALSE); /*Invalidate(TRUE);*/ //返回TRUE,则有这样的情况,背景和对象一起重画,看见闪烁。 CView::OnTimer(nIDEvent); }1.void Invalidate( BOOL bErase = TRUE );<br />  该函数的作用是使整个窗口客户

qinson12321的专栏 1597

MFC---画图中的重绘操作整合

•仿元文件机制,记录绘图过程中关键信息public:public:// 形状// 点的集合•模板集合类•非模板集合类–数组–链表–映射。

Frank---7的博客 532

初学mfc

本科的时候看翔哥在那啃MFC,感觉真特么bt,好厚一本书,看了不知多久也没见他啃出个什么阶段性成果来,导致我一直对MFC抱有抵触心理。 结果现在没办法了,一个实验的准备部分,要在桌面跑一个图片时钟。用matlab方便倒是很方便,但效率着实不高,没法加快到几十毫秒一帧。于是老板开口了,那就用C++做吧...好吧,那就用opengl做吧....同学说这个用mfc很简单....好吧,其实倒是真的非常简

weichaohnu的专栏 1512

OnPaint()函数的作用原理

WM_PAINT是窗口每次重绘都会产生的一个消息。  OnPaint是对这个消息的反应函数 mfc 的 CWnd::OnPaint 没做什么,只是丢给系统处理。 一 : 先执行OnEraseBkgnd,擦除背景(如果想自绘控件,这个函数直接return TRUE就可以了,这样就不会擦除背景,不会闪) OnEraseBkGnd与OnPaint的区别与联系

Neo的专栏 1006
上一篇: 头文件重复包含
下一篇: 继承MFC CRectTracker使得橡皮条只能在规定范围变化和限制大小
T_Sky
博客等级 码龄19年 12粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值