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

            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)

            UpdateData()順便說下,這個函數不是刷新界面用的。
            UpdateData();參數為FALSE時,將界面上控件綁定的變量的數據導到控件內,參數為TRUE時,導入方向則相反

             

            附:Invalidate 與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是否為空等

            posted on 2008-03-11 15:34 弱水一瓢 閱讀(1679) 評論(0)  編輯 收藏 引用 所屬分類: MFC

            <2008年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導航

            統計

            文章分類

            最新評論

            亚洲精品乱码久久久久久蜜桃 | 色诱久久久久综合网ywww| 久久久久久A亚洲欧洲AV冫| 精品久久久久久国产牛牛app| 久久精品免费网站网| 久久婷婷色综合一区二区| 久久久无码精品亚洲日韩按摩| 久久中文字幕一区二区| 女同久久| 久久99国产精一区二区三区| 国内精品久久久久久久影视麻豆| 2021国产精品午夜久久| 久久99国产精品99久久| 77777亚洲午夜久久多喷| 国产精品久久久久久| 怡红院日本一道日本久久| 欧美午夜A∨大片久久 | 久久久久高潮综合影院| 免费精品99久久国产综合精品| 性做久久久久久久久久久| 久久久久久久综合日本亚洲| 狠狠色婷婷久久综合频道日韩| 一本久久a久久精品综合夜夜| 浪潮AV色综合久久天堂| 合区精品久久久中文字幕一区| 久久免费精品一区二区| 亚洲va久久久噜噜噜久久天堂| 亚洲AⅤ优女AV综合久久久| 香蕉久久夜色精品国产小说| 久久人人爽人人爽人人片AV不| 久久精品青青草原伊人| 狠狠色丁香久久婷婷综合_中| 久久久久亚洲av毛片大| 久久精品国产亚洲5555| 韩国三级中文字幕hd久久精品 | 久久人人爽人人爽人人片av高请| 亚州日韩精品专区久久久| 久久久久国产亚洲AV麻豆| 91久久福利国产成人精品| 欧美综合天天夜夜久久| 国产高清国内精品福利99久久|