MFC截图和界面刷新相关问题
问题描写叙述:
就是首先用CDC来截图,保存图片的路径通过dlg窗体来手动设置并传入。但是截下来的图片就会连带那个对话框也截图下来。
见图片;
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2hldmlubg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
部分代码:
解决方式:
涉及到的函数有:
BOOL UpdateWindow(HWND hWnd // 窗体的句柄);
假设窗体更新的区域不为空,UpdateWindow函数通过发送一个WM_PAINT消息来更新指定窗体的客户区。
函数绕过应用程序的消息队列。直接发送WM_PAINT消息给指定窗体的窗体过程,假设更新区域为空,则不发送消息。
void Invalidate( BOOL bErase = TRUE );
參数: bErase 决定了是否要在WM_PAINT消息前发送WN_ERASEBKGND
该函数的作用是使整个窗体客户区无效。窗体的客户区无效意味着须要重绘。比如。假设一个被其他窗体遮住的窗体变成了前台窗体,那么原来被遮住的部分就是无效的,须要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。
MFC为窗体类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗体。
视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数。实际的重绘工作由OnDraw来完毕。參数bErase为TRUE时。重绘区域内的背景将被擦除,否则,背景将保持不变。
差别:
UpdateWindow( )的作用是使窗体马上重绘。
调用Invalidate等函数后窗体不会马上重绘。这是由于WM_PAINT消息的优先级非常低,它须要等消息队列中的其他消息发送完后才干被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗体,从而导致窗体马上重绘。
联系:
系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗体时。当改变窗体的大小时。当把窗体从还有一个窗体背后移出时,当最大化或最小化窗体时,等等,这些动作都是由系统管理的,应用仅仅是被动地接收该消息。在消息处理函数中进行绘制操作;大多数的时候应用也须要可以主动引发窗体中的绘制操作,比方当窗体显示的数据改变的时候。这通常是通过InvalidateRect和 InvalidateRgn函数来完毕的。
InvalidateRect和InvalidateRgn把指定的区域加到窗体的Update Region中,当应用的消息队列没有其他消息时,假设窗体的Update
Region不为空时,系统就会自己主动产生WM_PAINT消息。
系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是由于系统把在窗体中的绘制操作当作一种低优先级的操作,于是尽可能地推后做,这样有利于提高绘制的效率:在两个WM_PAINT消息之间多个Invalidate调用使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新。不仅能避免多次反复地更新同一区域,也优化了应用的更新操作。像这样的通过InvalidateRect和InvalidateRgn来使窗体区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机
制实际上是一种异步工作方式,也就是说,在无效化窗体区域和发送WM_PAINT消息之间是有延迟的;有时候这样的延迟并非我们希望的。这时我们当然可以在无效化窗体区域后利用SendMessage 发送一条WM_PAINT消息来强制马上重画,但不如使用Windows GDI为我们提供的更方便和强大的函数:UpdateWindow和RedrawWindow。UpdateWindow会检查窗体的Update Region。当其不为空时才发送WM_PAINT消息;RedrawWindow则给我们很多其他的控制:是否重画非客户区和背景。是否总是发送WM_PAINT消息而无论Update
Region是否为空等
MFC截图和界面刷新相关问题的更多相关文章
- 记一个界面刷新相关的Bug
今天遇到一个比较有意思的bug, 这里简单记录下. Bug的症状是通过拖拉边框把我们客户端主窗口拖小之后,再最大化,会发现窗口显示有问题, 看起来像是刷新问题, 有些地方显示的不对了. 这里要说明的是 ...
- Android界面刷新之invalidate与postInvalidate的区别
Android的invalidate与postInvalidate都是用来刷新界面的. 在UI主线程中,用invalidate():本质是调用View的onDraw()绘制. 主线程之外,用postI ...
- Android之界面刷新(invalidate和postInvalidate使用)
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Inva ...
- Android界面刷新
Android的invalidate与postInvalidate都是用来刷新界面的,用法区别在于: 1)invalidate():实例化一个Handler对象,并重写handleMessage方法调 ...
- Android界面刷新方法
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...
- Swing界面刷新问题(转)
在Java Swing编程中,往往会遇到需要动态刷新界面的时候,例如动态刷新JLabel的文本,JTextField里的文本等等.但是往往却没有达到我们预期的效果,我相信很多朋友都遇到过本文将要说的这 ...
- androidTv界面刷新跳动的问题
今天刚完成老大要求的新模块,在界面刷新的时候遇到了一些问题:一个scrollview动态的添加控件且控件中的数据进行更换的时候,出现的界面跳动的问题 刚开始以为是界面没有展示完全配合scrollvie ...
- 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO
刷新SQL Server所有视图.函数.存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...
- WPF 数据绑定,界面刷新的两种方法-----INotifyPropertyChanged
.Netformwork4.0及以下版本 -------INotifyPropertyChanged 命名空间: System.ComponentModel 后台代码 public partial c ...
随机推荐
- Oracle查询优化-多表查询
--合并结果集 --1.union all UNION ALL--单纯合并 ; --2.union UNION --将重复结果集合并 ; --------------使用命令窗口执行,查看union与 ...
- 【C++基础 05】友元函数和友元类
友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend. 友元不是成员函数,可是它能够訪问类中的私有成员. 友元的作用 ...
- Unity的加载路径
1.Resources 路径 只读 不能动态的修改 存放内容 预制体(prefabs) - 不容易变化的预制体 prefabs打包的时候 会自动过滤不需要的资源 有利于减小资源大小 主线程加载 Res ...
- MFC中控件添加了变量后修改
新增一个变量这个变量存在于两个位置,一个是头文件中项目名+Dlg.h文件,另一个是源文件中项目名+Dlg.cpp文件
- IDE、SATA、SCSI、SAS、FC、SSD 硬盘类型
http://www.cnblogs.com/awpatp/archive/2013/01/29/2881431.html
- python2.0_s12_day19_前端结合后端展示客户咨询纪录
接下来就是将后台视图与前端页面结合起来了完成后台系统了.实现前端展示用户列表1.先在base.html代码中把模版中Dashboard下面的内容清空,如下: 具体删除哪些html代码,自己找吧.2.我 ...
- php学习十:继承
在php中,我们常常会定义许多类,当多个类里面的方法或者属性出现重复的时候,会常常造成代码重复和冗杂的弊端,这个时候,我们可以用到继承(extends) 继承的特性: * 1.子类可以扩充属性* 2. ...
- Runtime 运行时之一:消息转发
解释一 上一篇文章咱们提到了Runtime的消息传递机制,主要围绕三个C语言API来展开进行的.这篇文章我将从另外三个方法来描述Runtime中另一个特性:消息转发机制. 一.消息转发机制 当向某个对 ...
- 时序数据库技术体系 – InfluxDB 多维查询之倒排索引
本文转自: http://hbasefly.com/2018/02/09/timeseries-database-5/ 在时序数据库概述一文中,笔者提到时序数据库的基础技术栈主要包括高吞吐写入实现.数 ...
- Visual Studio 2013 如何在停止调试Web程序后阻止IIS Express关闭
vs2013 调试项目的时候,当停止调试的时候,端口就被断了.之前以为是IIS那边的控制问题,但是其他并行的项目运行都没有出现这种情况. 最初也没在意,直到现在实在忍受不了了,每次重开也太烦了.就去各 ...