MFC 刷新失效的Picture控件
问题描述:如在摄像头显示时,关闭摄像头,此时Picture控件仍然显示最后一帧图像,需要刷新掉,还原Picture控件。或者重复显示两张不同大小的图片时,第二张背景有第一张图片残留。
解决方法1:(最笨的方法)
用对话框背景色来填充控件,
CRect rect;
GetDlgItem(IDC_ShowImage)->GetClientRect(&rect);
GetDlgItem(IDC_ShowImage)->GetDC()->FillSolidRect(&rect2, RGB(, , ));//可能会把边界线也刷掉
//CRect rect2(rect.left+1 , rect.top+1 , rect.Width()-1 , rect.Height()-1 ); //可以转化一下,但治标不治本
解决方法2:
(1)Invalidate(); //使整个窗体无效,全部重绘
(2)GetDlgItem(IDC_ShowImage)->Invalidate(true);//使控件部分无效,进行重绘,但测试发现好像无效,原因不知,有知道的可以留言告知,谢谢!
Invalidate()是使整个窗口客户区无效, 窗口的客户区无效意味着需要重绘,会将整个窗口下所有控件都给刷新,一般会造成闪烁。
Invalidate标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WM_PAINT),需要处理到WM_PAINT消息时才真正重绘。
Invalidate里面有个bool型的参数,用来标识重绘的时候是否用背景色填充,默认为true。
注意:UpdateWindow() 则是要求系统对区域进行立即重绘。向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。
设想了一下:直接UpdateWindow()是不执行的,因此,
InvalidateRect(rect); //声明无效区
UpdateWindow(); //进行重绘
确实重绘了,但由于相对坐标系的问题,导致重绘区域不是想要的,方法3会讲解原因以及解决方法。
UpdateData()这个函数不是刷新界面用的。
UpdateData()参数为FALSE时,将界面上控件绑定的变量的数据导到控件内,参数为TRUE时,导入方向则相反。
解决方法3:(比较推荐的)
这是因为该种方法得到的 rect是控件客户区坐标, 而InvalidateRect ,RedrawWindow用的却是对话框客户区坐标,所以在使用InvalidateRect、RedrawWindow 之前 必须将其他坐标系下的坐标进行转换,否则不能按预想的执行。
CWnd* pWnd = GetDlgItem(IDC_ShowImage);
pWnd->GetClientRect(&rect);//得到控件客户端区域坐标
pWnd->ClientToScreen(rect);//将区域坐标由 控件客户区转成对话框区
//pWnd->GetWindowRect(&rect); //直接得到控件的对话框区坐标 this->ScreenToClient(rect); //将区域坐标由 对话框区转成对话框客户区坐标
InvalidateRect(rect);
//RedrawWindow(rect);
这里面有几个需要注意的点:
1.可以通过GetWindowRect直接获取控件相对于对话框区坐标。
2. 注意对话框区和对话框客户区的区别。(参考链接2)
3.在这里,InvalidateRect(rect);和RedrawWindow(rect)效果一样,这是由于消息队列消息很少,所以执行很快,但需要注意:
InvalidateRect()不能实现立即更新 ;
InvalidateRect()与 UpdateWindow()结合后可以实现立即更新;
两者结合的效果相当于RedrawWindow(rect)。
参考链接:
(1) InvalidateRect()、UpdateWindow()、RedrawWindow()区别
http://blog.csdn.net/shuilan0066/article/details/6826000
(2) GetWindowRect和GetClientRect的区别详解
http://www.cnblogs.com/wb-DarkHorse/archive/2013/07/08/3178201.html
(3) 使用InvalidateRect(rect) 防止图片移动时发生闪烁
http://blog.csdn.net/shuilan0066/article/details/6676229
MFC 刷新失效的Picture控件的更多相关文章
- Opencv+MFC获取摄像头数据,显示在Picture控件
分为两步:OpenCV获取摄像头数据+图像在Picture上显示 第一步:OpenCV获取摄像头数据 参考:http://www.cnblogs.com/epirus/archive/2012/06/ ...
- MFC中Picture控件显示图像
图片显示在picture控件中,整个软件最小化后图片消失问题. 解决方案:OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面 - CSDN博客 http:// ...
- MFC-----在MFC中使用Picture控件加载任意图片
对于刚刚接触OpenCV的童鞋来说,如何在MFC中加载并显示一张图片.应该是初期必定会碰到的问题之一.因此本文在分享这方面经验的同时,也相当于是写给自己的一份备忘录. 本文使用的是OpenCV2.1+ ...
- [转]MFC子线程中更新控件内容的两种办法
一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...
- VC/MFC 当鼠标移到控件上时显示提示信息
VC/MFC 当鼠标移到控件上时显示提示信息 ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法 ...
- Winform中Picture控件图片的拖拽显示
注解:最近做了一个小工具,在Winform中对Picture控件有一个需求,可以通过鼠标从外部拖拽图片到控件的上,释放鼠标,显示图片! 首先你需要对你的整个Fom窗口的AllowDrop设置Ture ...
- 不受路径限制的 HALCON开发环境, 并且初始化两个Picture控件;
知识储备: http://bbs.csdn.net/topics/391829463 关于 添加第三方库的方式 http://www.ihalcon.com/read-3730.html VS ...
- 如何在vs2010中添加Picture控件
1.新建项目,并在对话框控件中拖入picture控件,并做如下设置 2.在picture控件的属性栏需要进行如下修改:ID需要修改,不能为static ID是控件的唯一标识,PictureCtrl(p ...
- 将OpenCV捕获的摄像头加载到picture控件中
CRect rect; CStatic* pStc; CDC* pDC; HDC hDC; pStc = (CStatic*)GetDlgItem(IDC_CAM);//IDC_CAM是Picture ...
随机推荐
- 自定义生命周期的设计(iOS篇)
自定义生命周期的设计(iOS篇) 首先要确定一点,我们的App,要基于XIB文件进行编程,而不是在每个相应的ViewController里面去手动创建页面的每个控件.这样做的好处是,将页面布局与业务逻 ...
- jstl标签的fmt:formatDate格式化日期 String to Date
使用fmt函数需在jsp中引入 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" ...
- Log in Spring
记录日志向来是企业级应用程序必须考虑的事情.早些年,一个项目一个日志功能或模块,然后有了log4j这样的产品.不知是log4j将记录日志做到了极致,或是技术含量不高,又或是经济利益不明显,它已成为了这 ...
- OpenXml操作Word的一些操作总结.
OpenXml操作Word的一些操作总结. OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势: 1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩 ...
- 使用 javascript 来实现 观察者模式
以[猫叫.老鼠跑.主人醒]为例子,使用 javascript 来实现 观察者模式 (有在线演示) 2013-06-24 08:35 by 金色海洋(jyk)阳光男孩, 572 阅读, 4 评论, 收藏 ...
- CoreCRM 开发实录 —— 单元测试之 Mock UserManager 和 SignInManager
单元测试的核心就是:只测试眼前的逻辑.这就要求所有的依赖项都要使用仿类来代替,也就是所谓的 Mock Object.在测试 ProfileRepository 和 AccountController ...
- ASP.NET MVC 异步Excel数据选择导出
以前习惯用一些框架来实现Excel文件数据导出,工作中也经常用到:比如extJs.easyUI.angularJs等,最近在做mvc程序的时候要实现该功能,相信这种功能在我们实际工作中是很常见,尤其是 ...
- CentOS在线升级内核
升级内核需要使用 elrepo 的yum 源首先我们导入 elrepo 的key rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org ...
- DrawingCombiner——CAD图纸批量合并软件
DrawingCombiner是一款CAD图纸批量合并软件,可以批量合并多个dwg或dxf文件为单个dwg文件,并可以设置合并后的排列方式. 此程序附属MagicTable(可到依云官网下载:http ...
- 使用Egret Conversion 转化as代码到ts代码
1,转换时,如果一次转化代码文件太多,可能会出现错误,可以一次少转几个文件: 2,如果出现所转换文件中有错误,则需修改要转换文件: 3,转换时还可能生成新文件夹如elex,转换的ts文件就会存在ele ...