消除螢幕閃爍

2021-03-31 08:56:58 字數 1282 閱讀 5143

由於作圖過於複雜和頻繁,所以時常出現閃爍的情況,一些防止閃爍的方法,如下:

(1)將invalidate()替換為invalidaterect()。

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

(2)禁止系統擦除你的視窗。

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

bool cmywin::onerasebkgnd(cdc* pdc)

(3)有效的進行擦除。

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

getclientrect(rectclient);

rgn1.createrectrgnindirect(rectclient);

rgn2.createrectrgnindirect(m_rectedit);

if(rgn1.***binergn(&rgn1,&rgn2,rgn_xor)= error)

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

brush.createsolidbrush(m_clrbackgnd);

pdc->fillrgn(&rgn1,&brush);

brush.deleteobject();

注意:在使用這個方法的時候要同時使用方法二。

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

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

void cmywiew::ondraw() //cscrollview下雙緩衝記憶體的實現:

angular ng cloak解決螢幕閃爍問題

ng cloak指令用於在 angularjs 應用在載入時防止 angularjs 未載入完而出現的問題。angularjs 應用在載入時,文件可能會由於angularjs 未載入完而出現顯示 angularjs 進而會有閃爍的效果,ng cloak指令是為了防止該問題的發生。asdasd 在需要...

java 雙緩衝技術解決螢幕閃爍問題

深入分析,這個repaint 方法是從父類jframe繼承來的,當repaint方法執行的時候會呼叫update graphics g 方法,而update 方法裡面首先判斷是否輕量元件,如果是那麼用背景色覆蓋掉介面g.clearrect 0,0,width,height 然後再呼叫paint 方法...

java雙緩衝原理和實現 消除閃爍的常用方法

為什麼出現閃爍?由於元件的重繪會呼叫update方法,然後由update呼叫paint方法,由於update的預設情況下操作如下 1清屏2設定前景色 3重畫當清屏後我們繪製過程當中,我們就捕捉到了空白的影象,就出現了閃爍。為什麼雙緩衝能夠減少閃爍?我們主要改進了第3環節,我們先在後台繪製好,放入快取...