zoukankan      html  css  js  c++  java
  • UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow

    Invalidate

    在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。

    窗口的客户区无效意味着需要重绘。例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。

    理论:这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bEraseTRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。

    Invalidate()表示客户区域无效,在下次WM_PAINT发生时重绘。而WM_PAINT是由系统进行维护的,每当CWnd的更新区域不为空,并且在应用程序的窗口消息队列中没有其它消息时,Windows就发送一条WM_PAINT消息。

    Invalidat最后也是调用InvalidatRect。

    UpdateWindow

    如果有无效区,则马上sending a WM_PAINT message到窗口处理过程,不进消息队列进行排队等待,立即刷新窗口,否则,什么都不做。不过在它发送前,先调用GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制区域,如果没有则不发送消息

    UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

    updateWindow其只对声明为无效的区域起作用,而Invalidate()是声明无效区域的方式之一。

    效果很明显,调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使

    WM_PAINT消息马上执行的,绕过了消息队列。如果你调用Invalidate之后想马上更新屏幕,那就加上UpdateWindow这条语句。

    UpdateData()

    UpdateData(TRUE)
    ——刷新控件的值到对应的变量。(外部输入值交给内部变量)
    即:控件的值—>变量。

    UpdateData(FALSE)
    —— 拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)
    即:变量值—>控件显示

    InvalidateRect

    该函数的功能与Invalidate基本一样,不同的是,它是使指定的某个区域无效,需要输入一个区域,如果参数为NULL,则设置整个窗口为无效区。

    如果不调用 InvalidateRect就调用 UpdateWindow,那么UpdateWindow什么都不做。 如果调用 InvalidateRect 后不调用UpdateWindow,则系统会自动在窗口消息队列为空的时候,系统自动发送一WM_PAINT消息。

    RedrawWindow

    强制刷新,会调用WM_PAINT,但如果你强制刷新的部分不存在就不会调用WM_PAINT。若不带任何参数,则本窗口全部刷新。

    总之:Invalidate让客户区处于可以重画的状态,而UpdateWindow开始重画,但是它首先需判断客户区是否为空,不空则UpdateWindow不执行,为空才执行重画。

    RedrawWindow()则是具有Invalidate()和UpdateWindow()的双特性

  • 相关阅读:
    重写了iniparser类
    (原)OSX 也变成svn服务器3(欢迎大家指出错误。交流提升自己。)
    延长AppViz试用期限的方法
    关于应用程序图片在保存读取显示所遇到的问题。
    OC单元测试框架Google开源单元测试框架Google Test(gtest)
    (原)OSX 也变成svn服务器2(欢迎大家指出错误。交流提升自己。)
    OC(每日一题)字符串循环移位
    XCode下的iOS单元测试(转)
    (原)OSX 也变成svn服务器1(欢迎大家指出错误。交流提升自己。)
    安装sql server 2005的时候,会提示无法启动服务的解决方案.
  • 原文地址:https://www.cnblogs.com/staring-hxs/p/3266492.html
Copyright © 2011-2022 走看看