vc中關於螢幕閃爍問題解決的小結

2021-09-01 09:54:04 字數 1187 閱讀 2654

因為invalidate()會導致整個視窗的圖象重畫,需要的時間比較長,而invalidaterect()僅僅重畫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.combinergn(&rgn1,&rgn2,rgn_xor) == error)//處理後的rgn1只包括了edit框之外的客戶區域,這樣,edit將不會被我的背景覆蓋而導致重畫。

brush.createsolidbrush(m_clrbackgnd);

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

brush.deleteobject();

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

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

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

void cmywin::onpaint()

vuejs Angularjs 閃爍問題解決

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

MFC中螢幕重新整理閃爍問題解決方法總結

在mfc中經常遇到螢幕重新整理的問題,下面是幾種解決方法。重新整理整個程式區域,有明顯的閃爍情況 invalidate true updatewindow 重新整理指定區域,該區域有閃爍情況,不過比上一種方法要好多了。invalidaterect m rect,true 0 updatewindow...

iOS tableView重新整理閃爍問題解決

原來思路是這樣的 圖中紅框是我們的訊息列表,是乙個tableview,每個訊息是乙個cell,每次接收到一條訊息立刻新增到資料陣列中,同時重新整理tableview,滾動到底部。原來的 是這樣寫的 chatdataarray addobject chatmodel chattable reloadd...