• <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>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            Invalidate與UpdateWindow

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

            它和 UpdateWindow( )區(qū)別在于:

            UpdateWindow( )的作用是使窗口立即重繪。調(diào)用Invalidate等函數(shù)后窗口不會(huì)立即重繪,這是由于WM_PAINT消息的優(yōu)先級(jí)很低,它需要等消息隊(duì)列中的其它消息發(fā)送完后才能被處理。調(diào)用UpdateWindow函數(shù)可使WM_PAINT被直接發(fā)送到目標(biāo)窗口,從而導(dǎo)致窗口立即重繪。

             

            1. Invalidate在消息隊(duì)列中加入一條WM_PAINT消息,其無(wú)效區(qū)為整個(gè)客戶區(qū)。
            2. UpdateWindow直接發(fā)送一個(gè)WM_PAINT消息,其無(wú)效區(qū)范圍就是消息隊(duì)列中WM_PAINT消息(最多只有一條)的無(wú)效區(qū)。
            3. 效果很明顯,當(dāng)調(diào)用Invalidate之后,屏幕不一定馬上更新,因?yàn)?/span>WM_PAINT消息不一定在隊(duì)列頭部,而調(diào)用UpdateWindow會(huì)使WM_PAINT消息馬上執(zhí)行的,繞過(guò)了消息隊(duì)列。

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

              InvalidateRect只是增加重繪區(qū)域,在下次WM_PAINT的時(shí)候才生效
              InvalidateRect函數(shù)中的參數(shù)TRUE表示系統(tǒng)會(huì)在你畫之前用背景色將所選區(qū)域覆蓋一次,默認(rèn)背景色為白色,可以通過(guò)設(shè)置BRUSH來(lái)改變背景色。

              Invalidate()之后:
              ...OnPaint()->OnPrepareDC()->OnDraw()
              所以只是刷新在OnPaint()和OnDraw()函數(shù)中的繪圖語(yǔ)句。其它地方?jīng)]有影響。
              Invalidate標(biāo)記一個(gè)需要重繪的無(wú)效區(qū)域,并不意味著調(diào)用該函數(shù)后就立刻進(jìn)行重繪。類似于PostMessage(WM_PAINT),需要處理到WM_PAINT消息時(shí)才真正重繪。以為您Invalidate之后還有其他的語(yǔ)句正在執(zhí)行,程序沒(méi)有機(jī)會(huì)去處理WM_PAINT消息,但當(dāng)函數(shù)執(zhí)行完畢后,消息處理才得以進(jìn)行。
              Invalidate只是放一個(gè)WM_PAINT消息在隊(duì)列里,不做別的,所以只有當(dāng)當(dāng)前函數(shù)返回后,進(jìn)入消息循環(huán),取出WM_PAINT,才執(zhí)行PAINT,所以不管Invalidate放哪里,都是最后的。

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

              UpdateWindow只向窗體發(fā)送WM_PAINT消息,在發(fā)送之前判斷GetUpdateRect(hWnd,NULL,TRUE)看有無(wú)可繪制的客戶區(qū)域,如果沒(méi)有,則不發(fā)送WM_PAINT
              如果希望立即刷新無(wú)效區(qū)域,可以在調(diào)用InvalidateRect之后調(diào)用UpdateWindow,如果客戶區(qū)的任一部分無(wú)效,則UpdateWindow將導(dǎo)致Windows用WM_PAINT消息調(diào)用窗口過(guò)程(如果整個(gè)客戶區(qū)有效,則不調(diào)用窗口過(guò)程)。這一WM_PAINT消息不進(jìn)入消息隊(duì)列,直接由WINDOWS調(diào)用窗口過(guò)程。窗口過(guò)程完成刷新以后立刻退出,WINDOWS將控制返回給程序中UpdateWindow調(diào)用之后的語(yǔ)句。(windows程序設(shè)計(jì)第5版 P98)

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

            評(píng)論

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

            介紹得很詳細(xì)  回復(fù)  更多評(píng)論   

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

            自己寫了個(gè)dll控件,用invalidate能夠立即刷新,但用updatewindow就不行  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            亚洲人成精品久久久久| 日韩va亚洲va欧美va久久| 午夜精品久久影院蜜桃| 国产免费久久久久久无码| 久久久青草久久久青草| 狠狠色丁香婷综合久久| 久久精品草草草| 婷婷综合久久中文字幕| 久久本道久久综合伊人| 久久久久国产一区二区| 日本精品久久久久影院日本| 久久精品成人免费国产片小草| 中文字幕成人精品久久不卡| 国产精品美女久久久免费| 色综合久久中文字幕综合网| 无码国内精品久久人妻麻豆按摩| 无码人妻少妇久久中文字幕| 国产A级毛片久久久精品毛片| 久久香蕉超碰97国产精品| 久久亚洲综合色一区二区三区| 久久精品国产亚洲网站| 久久中文字幕无码专区| 午夜精品久久久久久久久| 狠狠干狠狠久久| 色综合久久夜色精品国产| 亚洲AV无码久久精品成人| 久久综合久久综合九色| 青春久久| 久久精品a亚洲国产v高清不卡| 婷婷综合久久中文字幕| 中文字幕热久久久久久久| 国产一级做a爰片久久毛片| 久久中文字幕精品| 亚洲狠狠久久综合一区77777| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产亚洲美女精品久久久2020| 99精品国产在热久久无毒不卡 | 91超碰碰碰碰久久久久久综合| 无码乱码观看精品久久| 久久夜色精品国产亚洲| 亚洲国产精品18久久久久久|