问题描写叙述:

        就是首先用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截图和界面刷新相关问题的更多相关文章

  1. 记一个界面刷新相关的Bug

    今天遇到一个比较有意思的bug, 这里简单记录下. Bug的症状是通过拖拉边框把我们客户端主窗口拖小之后,再最大化,会发现窗口显示有问题, 看起来像是刷新问题, 有些地方显示的不对了. 这里要说明的是 ...

  2. Android界面刷新之invalidate与postInvalidate的区别

    Android的invalidate与postInvalidate都是用来刷新界面的. 在UI主线程中,用invalidate():本质是调用View的onDraw()绘制. 主线程之外,用postI ...

  3. Android之界面刷新(invalidate和postInvalidate使用)

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Inva ...

  4. Android界面刷新

    Android的invalidate与postInvalidate都是用来刷新界面的,用法区别在于: 1)invalidate():实例化一个Handler对象,并重写handleMessage方法调 ...

  5. Android界面刷新方法

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...

  6. Swing界面刷新问题(转)

    在Java Swing编程中,往往会遇到需要动态刷新界面的时候,例如动态刷新JLabel的文本,JTextField里的文本等等.但是往往却没有达到我们预期的效果,我相信很多朋友都遇到过本文将要说的这 ...

  7. androidTv界面刷新跳动的问题

    今天刚完成老大要求的新模块,在界面刷新的时候遇到了一些问题:一个scrollview动态的添加控件且控件中的数据进行更换的时候,出现的界面跳动的问题 刚开始以为是界面没有展示完全配合scrollvie ...

  8. 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  9. WPF 数据绑定,界面刷新的两种方法-----INotifyPropertyChanged

    .Netformwork4.0及以下版本 -------INotifyPropertyChanged 命名空间: System.ComponentModel 后台代码 public partial c ...

随机推荐

  1. 【Deeplearning】关注书目

    Deep Learning: A Practitioner's Approach http://www.amazon.com/Deep-Learning-Practitioners-Adam-Gibs ...

  2. java导出word文件

    java导出word文件 test5.ftl文件生存方法, 第一步:用word新建test5.doc,填写完整模板,将需导出数据用${}代替 第二步:将test5.doc另存为test5.xml 第三 ...

  3. 新机器,分区为NTFS, 安装 Windows XP、Windows Server 2003 时蓝屏问题,修改为 FAT32 即可

    现象:安装刚刚开始就会蓝屏:Ghost版本的也无法正常开机. 原因:硬盘引起,通常是主板的RAID.或STAT的设置引起????? 最直接的原因是安装所在的分区的文件系统格式不正确,为NTFS 解决: ...

  4. Unity资源解决方案之AssetBundle

    1.什么是AssetBundle AssetBundle是Unity pro提供的一种用来存储资源的文件格式,它可以存储任意一种Unity引擎能够识别的资源,如Scene.Mesh.Material. ...

  5. WPF 跟踪命令和撤销命令(复原)

    WPF 命令模型缺少一个特性是复原命令.尽管提供了一个 ApplicationCommands.Undo 命令,但是该命令通常被用于编辑控件(如 TextBox 控件),以维护它们自己的 Undo 历 ...

  6. 单行dp复习hdu1087

    我写的想法是每个dp[i]都是前dp[i]的最大值 dp[i]就等于前全部dp[0...i-1]的最大值加上dp[i] 最大值是一个中间变量 最大值得选取条件就是序列的值大小都是递增的,也就是a[i] ...

  7. oracle查锁表

    查锁表 select LOCK_INFO.OWNER || '.' || LOCK_INFO.OBJ_NAME as OBJ_NAME, -- 对象名称(已经被锁住) LOCK_INFO.SUBOBJ ...

  8. 一个php日志类

    <?php //author:lixiuran class Log { public static function writeLog($string) { $string = date('H: ...

  9. java基础---->多线程之interrupt(九)

    这里我们通过实例来学习一下java多线程中关于interrupt方法的一些知识.执者失之.我想当一个诗人的时候,我就失去了诗,我想当一个人的时候,我就失去了我自己.在你什么也不想要的时候,一切如期而来 ...

  10. java基础---->多线程之Daemon(五)

    在java线程中有两种线程,一种是用户线程,另一种是守护线程.守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁.今天我们通过实例来学习一下java中关于守护线程的知识.我是个平 ...