MFC 刷新失效的Picture控件
来源:互联网 发布:知止而行的例子 编辑:程序博客网 时间:2024/05/18 01:40
问题描述:如在摄像头显示时,关闭摄像头,此时Picture控件仍然显示最后一帧图像,需要刷新掉,还原Picture控件。或者重复显示两张不同大小的图片时,第二张背景有第一张图片残留。
解决方法1:(最笨的方法)
用对话框背景色来填充控件,
CRect rect;GetDlgItem(IDC_ShowImage)->GetClientRect(&rect);GetDlgItem(IDC_ShowImage)->GetDC()->FillSolidRect(&rect2, RGB(255, 255, 255));//可能会把边界线也刷掉//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)。
- MFC 刷新失效的Picture控件
- MFC 刷新失效的Picture控件
- MFC+OpenCV 刷新Picture控件
- MFC的Picture控件使用
- MFC:Picture控件的用法
- MFC中获取picture控件的大小
- 6.MFC Picture Control控件的使用.
- MFC Picture 控件
- MFC--图片控件Picture Control
- MFC控件(12):Picture Control
- MFC picture 控件加载图片
- MFC图片控件Picture Control
- MFC Picture控件中截图
- OpenCV 利用MFC的Picture控件显示和处理图像
- 利用MFC的Picture控件显示和处理图像
- OpenCV 利用MFC的Picture控件显示和处理图像
- 在MFC的Picture控件上画线和框
- MFC中如何如何获得picture控件的大小
- fastjson 下载地址
- 415. Add Strings
- 重拾java基础(十一):Eclipse和bean对象三大常用方法总结
- cogs 2047. [ZOJ2676]网络战争 (最小割+01分数规划)
- 魔法方法:属性访问
- MFC 刷新失效的Picture控件
- “你适合做开发吗”知乎Live问题集锦
- 【BZOJ 1025】[SCOI2009]游戏 置换+dp
- [HDU3944]DP? (组合数学Lucas定理)
- 2017/1/14号 循环嵌套小图画代码
- eclipse luna 4.4.2源码下载地址
- 提防坏人:Nginx 拒绝指定IP访问
- 重拾java基础(十二):java最常用类型String总结
- 【Oracle】安装注意事项