各位老大,为什么调用invalidateRect()以后还要调用UpdateWindow()函数?我没有调用updatewindow()
程序也是正常啊,说明invalidateRect()也是发送了WM_PAINT消息让窗口重回了,
这到底是怎么回事??谢谢大家,

解决方案 »

  1.   

    InvalidateRect 使客户区失效,但并不会发送WM_PAINT消息。UpdateWindow 发送WM_PAINT消息,重绘失效的客户区域。你说的没有调用UpdateWindow,程序也很正常,这是对的。 因为在WINDOWS操作系统中,有太多的因素会发送WM_PAINT消息,即使UpdateWindow没有被调用,也会有其它原因使程序收到了WM_PAINT消息。WM_PAINT 消息是为数不多的在消息循环中只能存在一个的消息。系统在向消息循环中添加WM_PAINT消息的时候,会检查消息循环中是否有了WM_PAINT,只有在没有的情况下,才会添加WM_PAINT消息。 这和其它消息是不一样的。
      

  2.   

    两个概念需要区分  无效的区域和窗口的需要更新区域
    当存在窗口的更新区域时,系统发送WM_PAINT重绘窗口指定的”更新区域“
    如果当前不存在窗口的需要更新区域,则系统不发送WM_PAINT消息,不过系统提供手工发送WM_PAINT系统的函数UpdateWindow。
    InvalidateRect 函数把参数RECT 指定的无效区域加入到窗口的需要“更新区域”中去,但并不会发送WM_PAINT消息,但系统会按一定的规则检测窗口的“更新区域”,如果存在“更新区域”,则也会发送WM_PAINT消息自动重绘窗口的“需要更新区域”,这就是“我没有调用updatewindow()程序也是正常啊”的原因
     毕竟运行完函数InvalidateRect不发送WM_PAINT系统,所以不依赖系统的特性在执行完InvalidateRect函数后 再执行updatewindow()函数是个好习惯。
      在一个时刻只有一个WM_PAINT消息在系统消息队列中,很多不同的无效区域会“累积”一块,放在一个WM_PAINT中,和其他消息不同,如鼠标消息等,他们是连续发送。
      

  3.   

    各位老大,为什么调用invalidateRect()以后还要调用UpdateWindow()函数?我没有调用updatewindow()
    程序也是正常啊,说明invalidateRect()也是发送了WM_PAINT消息让窗口重回了,
    这到底是怎么回事??谢谢大家,
    ============
    不用也可以的。
    InvalidateRect是作用是置无效区,系统检测到存在无效区时会发送WM_PAINT消息。而UpdateWindow则是立即强制发送WM_PAINT消息。简单地说,InvalidateRect调用之后不会立即发送WM_PAINT消息,而是存在一个系统检测的时间差,而UpdateWindow则是立即发送。
      

  4.   

    好像不对吧,很多资料上说的是invalidateRect都会发送wm_paint消息
      

  5.   


    资料上只会说 invalidaterect 会导致系统发送 WM_PAINT, 绝对不会说 invalidaterect 会发送 WM_PAINT. 请你看资料时仔细一些。