invalidate()會導致整個視窗的圖象重畫,需要的時間比較長,而invalidaterect()僅僅重畫rect區域內的內容,所以所需時間會少一些。蟲蟲以前很懶,經常為一小塊區域的重畫就呼叫invalidate(),不願意自己去計算需要重畫的rect,但是事實是,如果你確實需要改善閃爍的情況,計算乙個rect所用的時間比起重畫那些不需要重畫的內容所需要的時間要少得多。
系統在需要重畫視窗的時候會幫你用指定的背景色來搽除視窗。可是,也許需要重畫的區域也許非常小。或者,在你重畫這些東西之間還要經過大量的計算才能開始。這個時候你可以禁止系統搽掉原來的圖象。直到你已經計算好了所有的資料,自己把那些需要搽掉的部分用背景色覆蓋掉(如:dc.fillrect(rect,&brush);rect是需要搽除的區域,brush是帶背景色的刷子),再畫上新的圖形。要禁止系統搽除你的視窗,可以過載onerasebkgnd()函式,讓其直接返回true就可以了。如
搽除背景的時候,不要該搽不該搽的地方都搽。比如,你在乙個視窗上放了乙個很大的edit框,幾乎佔了整個視窗,那麼你頻繁的搽除整個視窗背景將導致edit不停重畫形成劇烈的閃爍。事實上你可以crgn建立乙個需要搽除的區域,只搽除這一部分。如bool
cmywin
::onerasebkgnd
(cdc
*pdc
)
注意:在使用這個方法的時候要同時使用方法二。別忘了,到時候又說蟲蟲的辦法不靈。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...