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

            窗口重繪函數(shù)心得

                     在刷新窗口時(shí)經(jīng)常要調(diào)用重繪函數(shù)MFC提供了三個(gè)函數(shù)用于窗口重繪
                     InvalidateRect(&Rect)
                     Invalidate()
                     UpdateWindow()
                     當(dāng)需要更新或者重繪窗口時(shí),一般系統(tǒng)會(huì)發(fā)出兩個(gè)消息WM_PAINT(通知客戶區(qū)有變化)和WM_NCPAINT(通知非客戶區(qū)有變化)WM_NVPAINT系統(tǒng)會(huì)自己搞定WM_PAINT消息對(duì)應(yīng)的函數(shù)是OnPaint(),它是系統(tǒng)默認(rèn)的接受WM_PAINT消息的函數(shù),但我們一般在程序中做重繪時(shí)都在OnDraw函數(shù)中進(jìn)行的,因?yàn)樵谝晥D類ONPAINT函數(shù)中調(diào)用了ONDRAW函數(shù)。
                      CView默認(rèn)的標(biāo)準(zhǔn)的重畫函數(shù)
                        void CView::OnPaint()
                        {  
                               CPaintDC dc(this);   
                               OnPreparDC(&dc);  
                               OnDraw(&dc); //調(diào)用了OnDraw} 
                        上面講到InvalidateRect(&Rect)Invalidate()兩個(gè)函數(shù)形式和功能差不多但I(xiàn)nvalidate是使得整個(gè)窗口無(wú)效,形成無(wú)效矩形,而InvalidateRect(&Rect)是使得指定的區(qū)域無(wú)效 Invalidate()申明無(wú)效,等待WM_PAINT消息以便重繪,隊(duì)列中無(wú)其他消息時(shí)系統(tǒng)會(huì)自動(dòng)發(fā)送UpdateWindow()會(huì)立即發(fā)送WM_PAINT,不過(guò)在它發(fā)送前,先調(diào)用GetUpdateRect(hWnd,NULL,TRUE)看有無(wú)可繪制區(qū)域,如果沒有則不發(fā)送消息 RedrawWindow()RedrawWindow()則是具有Invalidate()和UpdateWindow()的雙特性。聲明窗口的狀態(tài)為無(wú)效,并立即更新窗口,立即調(diào)用WM_PAINT消息處理。   
                     系統(tǒng)為什么不在調(diào)用Invalidate時(shí)發(fā)送WM_PAINT消息呢?又為什么非要等應(yīng)用消息隊(duì)列為空時(shí)才發(fā)送WM_PAINT消息呢?這是因?yàn)橄到y(tǒng)把在窗口中的繪制操作當(dāng)作一種低優(yōu)先級(jí)的操作,于是盡 可能地推后做。不過(guò)這樣也有利于提高繪制的效率:兩個(gè)WM_PAINT消息之間通過(guò)InvalidateRect和InvaliateRgn使之失效的區(qū)域就會(huì)被累加起來(lái),然后在一個(gè)WM_PAINT消息中一次得到 更新,不僅能避免多次重復(fù)地更新同一區(qū)域,也優(yōu)化了應(yīng)用的更新操作。像這種通過(guò)InvalidateRect和InvalidateRgn來(lái)使窗口區(qū)域無(wú)效,依賴于系統(tǒng)在合適的時(shí)機(jī)發(fā)送WM_PAINT消息的機(jī) 制實(shí)際上是一種異步工作方式,也就是說(shuō),在無(wú)效化窗口區(qū)域和發(fā)送WM_PAINT消息之間是有延遲的;有時(shí)候這種延遲并不是我們希望的,這時(shí)我們當(dāng)然可以在無(wú)效化窗口區(qū)域后利用SendMessage 發(fā)送一條WM_PAINT消息來(lái)強(qiáng)制立即重畫,但不如使用Windows GDI為我們提供的更方便和強(qiáng)大的函數(shù):          
                     UpdateWindow和RedrawWindow。UpdateWindow會(huì)檢查窗口的 Update Region,當(dāng)其不為空時(shí)才發(fā)送WM_PAINT消息;RedrawWindow則給我們更多的控制:是否重畫非客戶區(qū)和背景,是否總是發(fā)送 WM_PAINT消息而不管Update Region是否為空等。 BeginPaint和WM_PAINT消息緊密相關(guān)。試一試在WM_PAINT處理函數(shù)中不寫B(tài)eginPaint會(huì)怎樣?程序會(huì)像進(jìn)入了一個(gè)死循環(huán)一樣達(dá)到驚人的CPU占用率,你會(huì)發(fā)現(xiàn)程序總在處理一個(gè)接 一個(gè)的WM_PAINT消息。這是因?yàn)樵谕ǔG闆r下,當(dāng)應(yīng)用收到WM_PAINT消息時(shí),窗口的Update Region都是非空的(如果為空就不需要發(fā)送WM_PAINT消息了),BeginPaint的一個(gè)作用就是把該Update Region置為空,這樣如果不調(diào)用BeginPaint,窗口的Update Region就一直不為空,如前所述,系統(tǒng)就會(huì)一直發(fā)送WM_PAINT消息。 BeginPaint和WM_ERASEBKGND消息也有關(guān)系。當(dāng)窗口的Update Region被標(biāo)志為需要擦除背景時(shí),BeginPaint會(huì)發(fā)送WM_ERASEBKGND消息來(lái)重畫背景,同時(shí)在其返回信息里有一個(gè)標(biāo)志表明窗口背景是否被重畫過(guò)。當(dāng)我們用InvalidateRect和InvalidateRgn來(lái)把指定區(qū)域加到Update Region中時(shí),可以設(shè)置該區(qū)域是否需要被擦除背景,這樣下一個(gè)BeginPaint就知道是否需要發(fā)送WM_ERASEBKGND消息了。另外要注意的一點(diǎn)是,BeginPaint只能在WM_PAINT處理函數(shù)中使用。

            posted on 2008-03-24 21:48 弱水一瓢 閱讀(1685) 評(píng)論(1)  編輯 收藏 引用 所屬分類: MFC

            評(píng)論

            # re: 窗口重繪函數(shù)心得[未登錄] 2008-12-04 13:36 小C

            看了你的博客很有收獲,十分感謝!
            …^_^…  回復(fù)  更多評(píng)論   

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

            導(dǎo)航

            統(tǒng)計(jì)

            文章分類

            最新評(píng)論

            无码任你躁久久久久久老妇App| 无码人妻久久一区二区三区蜜桃| 亚洲欧洲日产国码无码久久99| AAA级久久久精品无码片| 久久精品国产亚洲网站| 久久久久人妻精品一区三寸蜜桃| 人妻无码αv中文字幕久久琪琪布| 久久九九有精品国产23百花影院| 怡红院日本一道日本久久 | 亚洲精品97久久中文字幕无码| yy6080久久| 国产精品九九久久免费视频 | 国产成人久久精品二区三区| 亚洲国产视频久久| 国产精品成人久久久久三级午夜电影| 亚洲午夜无码AV毛片久久| 91精品国产高清91久久久久久| 日韩欧美亚洲综合久久| 亚洲欧美精品伊人久久| 99久久超碰中文字幕伊人| 影音先锋女人AV鲁色资源网久久| 久久精品国产亚洲av瑜伽| 精品久久久久久中文字幕| 亚洲日本va中文字幕久久| 伊人久久无码精品中文字幕| 蜜臀久久99精品久久久久久| 91精品国产91久久久久久蜜臀| 亚洲国产另类久久久精品小说 | 久久综合九色综合网站| 久久国产乱子伦精品免费午夜| 精品九九久久国内精品| 99久久婷婷国产综合精品草原| 91精品国产综合久久久久久| 777午夜精品久久av蜜臀| 99精品国产综合久久久久五月天| 精品久久久久久久久免费影院| 超级97碰碰碰碰久久久久最新 | 久久夜色精品国产亚洲| 国产精品久久国产精品99盘 | 久久精品无码一区二区三区| 久久青青草原国产精品免费|