• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統計

            最新評論

            Invalidate與UpdateWindow

            void Invalidate( BOOL bErase = TRUE );
            該函數的作用是使整個窗口客戶區無效。窗口的客戶區無效意味著需要重繪,例如,如果一個被其它窗口遮住的窗口變成了前臺窗口,那么原來被遮住的部分就是無效的,需要重繪。這時Windows會在應用程序的消息隊列中放置WM_PAINT消息。MFC為窗口類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪窗口。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bErase為TRUE時,重繪區域內的背景將被擦除,否則,背景將保持不變。

            它和 UpdateWindow( )區別在于:

            UpdateWindow( )的作用是使窗口立即重繪。調用Invalidate等函數后窗口不會立即重繪,這是由于WM_PAINT消息的優先級很低,它需要等消息隊列中的其它消息發送完后才能被處理。調用UpdateWindow函數可使WM_PAINT被直接發送到目標窗口,從而導致窗口立即重繪。

             

            1. Invalidate在消息隊列中加入一條WM_PAINT消息,其無效區為整個客戶區。
            2. UpdateWindow直接發送一個WM_PAINT消息,其無效區范圍就是消息隊列中WM_PAINT消息(最多只有一條)的無效區。
            3. 效果很明顯,當調用Invalidate之后,屏幕不一定馬上更新,因為WM_PAINT消息不一定在隊列頭部,而調用UpdateWindow會使WM_PAINT消息馬上執行的,繞過了消息隊列。

              4\如果調用Invalidate之后想馬上更新屏幕,那就加上UpdateWindow()這條語句。

              InvalidateRect只是增加重繪區域,在下次WM_PAINT的時候才生效
              InvalidateRect函數中的參數TRUE表示系統會在你畫之前用背景色將所選區域覆蓋一次,默認背景色為白色,可以通過設置BRUSH來改變背景色。

              Invalidate()之后:
              ...OnPaint()->OnPrepareDC()->OnDraw()
              所以只是刷新在OnPaint()和OnDraw()函數中的繪圖語句。其它地方沒有影響。
              Invalidate標記一個需要重繪的無效區域,并不意味著調用該函數后就立刻進行重繪。類似于PostMessage(WM_PAINT),需要處理到WM_PAINT消息時才真正重繪。以為您Invalidate之后還有其他的語句正在執行,程序沒有機會去處理WM_PAINT消息,但當函數執行完畢后,消息處理才得以進行。
              Invalidate只是放一個WM_PAINT消息在隊列里,不做別的,所以只有當當前函數返回后,進入消息循環,取出WM_PAINT,才執行PAINT,所以不管Invalidate放哪里,都是最后的。

              InvalidateRect(hWnd,&rect,TRUE);向hWnd窗體發出WM_PAINT的消息,強制客戶區域重繪制,
              rect是你指定要刷新的區域,此區域外的客戶區域不被重繪,這樣防止客戶區域的一個局部的改動,而導致整個客戶區域重繪而導致閃爍,如果最后的參數為TRUE,則還向窗體發送WM_ERASEBKGND消息,使背景重繪,當然在客戶區域重繪之前。

              UpdateWindow只向窗體發送WM_PAINT消息,在發送之前判斷GetUpdateRect(hWnd,NULL,TRUE)看有無可繪制的客戶區域,如果沒有,則不發送WM_PAINT
              如果希望立即刷新無效區域,可以在調用InvalidateRect之后調用UpdateWindow,如果客戶區的任一部分無效,則UpdateWindow將導致Windows用WM_PAINT消息調用窗口過程(如果整個客戶區有效,則不調用窗口過程)。這一WM_PAINT消息不進入消息隊列,直接由WINDOWS調用窗口過程。窗口過程完成刷新以后立刻退出,WINDOWS將控制返回給程序中UpdateWindow調用之后的語句。(windows程序設計第5版 P98)

            posted on 2008-08-11 19:22 大龍 閱讀(2504) 評論(2)  編輯 收藏 引用

            評論

            # re: Invalidate與UpdateWindow 2010-02-02 14:18 bobui

            介紹得很詳細  回復  更多評論   

            # re: Invalidate與UpdateWindow 2011-12-01 22:28 yangtzerong

            自己寫了個dll控件,用invalidate能夠立即刷新,但用updatewindow就不行  回復  更多評論   

            人妻精品久久久久中文字幕69| 久久精品亚洲精品国产色婷| 中文精品久久久久国产网址| 九九久久精品无码专区| 99精品国产综合久久久久五月天 | 久久精品国产亚洲麻豆| 日本精品久久久中文字幕| 合区精品久久久中文字幕一区| 色综合久久久久久久久五月| 99久久精品免费看国产| 国内精品久久久久久久久电影网| 久久国产精品成人影院| 综合久久精品色| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 久久久久亚洲AV无码观看| 99久久精品免费国产大片| 国产A级毛片久久久精品毛片| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲国产成人久久综合碰| 久久久无码精品亚洲日韩蜜臀浪潮| 久久国产成人精品国产成人亚洲| 精品久久人妻av中文字幕| 久久精品综合网| 色8激情欧美成人久久综合电| 国产亚洲欧美成人久久片| 天堂久久天堂AV色综合| 久久精品国产欧美日韩99热| 欧美一级久久久久久久大| 精品99久久aaa一级毛片| 伊人丁香狠狠色综合久久| 国产精品久久成人影院| 亚洲国产精品无码久久98| 亚洲AV日韩AV永久无码久久| 久久久久久曰本AV免费免费| 精品久久久一二三区| 久久人人添人人爽添人人片牛牛 | 午夜视频久久久久一区| 中文字幕精品久久久久人妻| 久久一区二区三区99| 99久久国产亚洲综合精品| 亚洲午夜久久久影院伊人|