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

2021-09-06 04:15:11 字數 1350 閱讀 8247

最近對**作了一些優化,試驗後效果還可以,但是發現介面會閃爍,具體是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)

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

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

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

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

閃爍的解決方法

首先給出實現的程式,然後再解釋,同樣是在ondraw cdc pdc 中 cdc memdc 首先定義乙個顯示裝置物件 cbitmap membitmap 定義乙個位圖物件 隨後建立與螢幕顯示相容的記憶體顯示裝置 memdc.createcompatibledc null 這時還不能繪圖,因為沒有地...

前端問題和解決方法

centering text in column th.dt center,td.dt center change table header color using bootstrap thead th tbody td change select default color selection m...