问题描写叙述:

        就是首先用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. 搜集的一些酷炫的金属色 ,RGB值 和大家分享一下

    开发iOS程序过程中会使用到RGB,要注意每个RGB值都要除以 255.0 ,注意: ' .0 ' 不能省!! 一下是本人搜集的一些酷炫金属色的RGB值:   黄金 242,192,86 石墨 87, ...

  2. ojdbc14.jar 放在kettle那个目录下面

    \libext\edtftpj-1.4.5.jar \libext\firebirdsql-full.jar \libext\firebirdsql.jar \libext\gis-shape.jar ...

  3. 在 SharePoint 2010 打开网页出错时,显示实际的错误信息

    每次打开错误页面时,SharePoint出错显示的都是友好信息“发生意外错误”,而且友好到您基本上无法明白到底出什么错,怎么办? 修改Web.config文件配置就可以了,就可以显示更详细的信息: 1 ...

  4. Java集合----List集合

    List List 代表一个元素有序.且可重复的集合,集合中的每个元素都有其对应的顺序索引List 允许使用重复元素,可以通过索引来访问指定位置的集合元素.List 默认按元素的添加顺序设置元素的索引 ...

  5. GIS-005-Dojo & jQuery 事件处理

    1.添加事件 dojo.connect(dojo.byId("SelectRect"), "onclick", function () { //todo }); ...

  6. GIS-002-gdal2srtmtiles使用注意事项

    本次安装和配置过程重点参考了: 1.http://blog.csdn.net/wjkwjk/article/details/52560236 2.http://blog.csdn.net/wjkwjk ...

  7. 基于Cocos2d-x学习OpenGL ES 2.0系列——纹理贴图(6)

    在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...

  8. ios Instruments 内存泄露

    本文转载至 http://my.oschina.net/sunqichao/blog?disp=2&p=3 虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是 ...

  9. JavaScript的记忆函数真的可以提升性能吗?

      1 记忆函数是什么呢? 让函数记住曾经计算过的参数对应的结果 2 那我们为什么使用记忆函数呢? 答案是 避免重复计算 3 在工作中如何使用和实现函数记忆 ? 形成闭包,在闭包中维护一个哈希数组(其 ...

  10. Date Json格式转换Date格式

    CreateTime=\/Date(1458722493663+0800)\/ var CreateTime="/Date(1458722493663+0800)/";var st ...