C 控制項的閃爍問題解決方法總結

2021-10-24 06:30:56 字數 1350 閱讀 2449

最近對**作了一些優化,試驗後效果還可以,但是發現介面會閃爍,具體是treeview控制項會閃爍,語言為c#,ide為vs2005。在查閱一些資料,使用了一些基本技術後(如開啟雙緩衝),發現沒什麼效果。

於是使用profiler工具,查詢出瓶頸在於每次更新完介面的endupdate操作(使用這個是為了減少介面更新次數,但這裡不理想是因為控制項中中的元素很多),猜想大概每次更新,.net底層都會更新重繪每個圖元,所以速度會慢,造成閃爍。但是如果這樣,使用雙緩衝應該會有較好效果。再看**,發現可能是更新動作太過頻繁,於是降低速度,有所好轉,但還是不行。

繼續在網上查閱,最終找到乙個方案比較合適。原來底層重繪每次會清除畫布,然後再全部重新繪製,這才是導致閃爍最主要的原因。於是過載訊息傳送函式操作,禁掉這條訊息。**如下:

protected override void wndproc(ref message m)

if (m.msg == 0x0014) // 禁掉清除背景訊息

return;

base.wndproc(ref m);

成功!注:雙緩衝還是有用的,在更新不是很頻繁且控制項內含元素不是特別多的時候。一旦元素過多,每次更新時間都比較長,即便使用了雙緩衝,仍解決不了閃爍問題。個人認為最終比較理想的方法還是禁掉清除背景訊息。

附:一些嘗試過但失敗的記錄

1)使用setstyle

網上有說使用setstyle函式去設定該控制項的引數,具體為:

setstyle(controlstyles.userpaint | controlstyles.allpaintinginwmpaint | controlstyles.optimizeddoublebuffer, true);

這三個選項引數後者是依賴前者的,必須並存,否則無效。並且這個函式本身是protected的,所以首先需要繼承某控制項再使用。

這個目標是跟前面正確解決方案一致,也是禁止清除背景並開啟雙緩衝,但需要使用使用者繪製選項,而且是全部交由使用者繪製。這需要自己實現控制項的全部繪製,比較麻煩。所以這個方法不是完全不可行,但是需要額外工作量,不推薦。我也沒有使用。

2)使用beginupdate和endupdate

3)使用controlstyles.enablenotifymessage選項

這個選項的作用和正確解決方案也是一致的。使用方法是:

setstyle(controlstyles.enablenotifymessage, true);

protected override void onnotifymessage(message m)

// 此處書寫過濾訊息**

但是實際實驗顯示無效果,不知是什麼原因,沒有細究。

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

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

C 控制項開發的閃爍問題和解決方法總結

最近對 作了一些優化,試驗後效果還可以,但是發現介面會閃爍,具體是treeview控制項會閃爍,語言為c ide為vs2005。在查閱一些資料,使用了一些基本技術後 如開啟雙緩衝 發現沒什麼效果。於是使用profiler工具,查詢出瓶頸在於每次更新完介面的endupdate操作 使用這個是為了減少介...

vuejs Angularjs 閃爍問題解決

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