MFC 視窗重新整理防止閃爍方法

2022-05-08 10:15:09 字數 1653 閱讀 7389

invalidate()會導致整個視窗的圖象重畫,需要的時間比較長,而invalidaterect()僅僅重畫rect區域內的內容,所以所需時間會少一些。蟲蟲以前很懶,經常為一小塊區域的重畫就呼叫invalidate(),不願意自己去計算需要重畫的rect,但是事實是,如果你確實需要改善閃爍的情況,計算乙個rect所用的時間比起重畫那些不需要重畫的內容所需要的時間要少得多。

系統在需要重畫視窗的時候會幫你用指定的背景色來搽除視窗。可是,也許需要重畫的區域也許非常小。或者,在你重畫這些東西之間還要經過大量的計算才能開始。這個時候你可以禁止系統搽掉原來的圖象。直到你已經計算好了所有的資料,自己把那些需要搽掉的部分用背景色覆蓋掉(如:dc.fillrect(rect,&brush);rect是需要搽除的區域,brush是帶背景色的刷子),再畫上新的圖形。要禁止系統搽除你的視窗,可以過載onerasebkgnd()函式,讓其直接返回true就可以了。如

bool 

cmywin

::onerasebkgnd

(cdc

*pdc

)

搽除背景的時候,不要該搽不該搽的地方都搽。比如,你在乙個視窗上放了乙個很大的edit框,幾乎佔了整個視窗,那麼你頻繁的搽除整個視窗背景將導致edit不停重畫形成劇烈的閃爍。事實上你可以crgn建立乙個需要搽除的區域,只搽除這一部分。如

getclientrect

(rectclient

);

rgn1

.createrectrgnindirect

(rectclient

);

rgn2

.createrectrgnindirect

(m_rectedit

);

if

(rgn1

.combinergn

(&rgn1

,&rgn2

,rgn_xor)==

error

)//處理後的rgn1只包括了edit框之外的客戶區域,這樣,edit將不會被我的背景覆蓋而導致重畫。

brush

.createsolidbrush

(m_clrbackgnd

);

pdc

-<

fillrgn

(&rgn1

,&brush

);

brush

.deleteobject

();

注意:在使用這個方法的時候要同時使用方法二。別忘了,到時候又說蟲蟲的辦法不靈。

4、使用memorydc先在記憶體裡把圖畫好,再複製到螢幕上。

這對於一次畫圖過程很長的情況比較管用。畢竟記憶體操作比較快,而且複製到螢幕又是一次性的,至少不會出現可以明顯看出乙個東東從左畫到右的情況。

void

cmywin

::onpaint

()

來自為知筆記(wiz)

防止ClistCtrl重新整理閃爍的五種方法

程式需要從資料庫某乙個活動表中,定時取資料,更新介面的列表顯示,比如有20條資料 變化 則這20資料 不停的變化,通過其他程式實現 方案 1 先在列表中查詢,後插入 比如每條記錄都有乙個唯一的編號,查詢的時候,首先查詢該編號的記錄在列表中是否存在,如果存在 則找到item後,直接更新各個列的資料,如...

Halcon 解決視窗重新整理閃爍問題

當現實影象變數語句與滑鼠等事件繫結時,頻繁重新整理影象介面,會出現視窗閃爍的問題。可以按照例程 median interative.hdev 例程中while迴圈每次都重新整理影象視窗,但是不會出現閃爍問題。很流暢。原因就在 具體效果可以將這兩句運算元注釋掉,或者將之後的write string運算...

在MDI視窗中防止子視窗閃爍

解決的方法 1 過載precreatewindow,此方法能夠解決上述前兩種情況的閃爍問題 bool cchildframe precreatewindow createstruct cs 2 第3個問題的方法是處理mainframe的mdi client區域,mainframe cmdiframe...