繪製, 不再閃爍
電子科技大學軟體學院 03級02班 周銀輝
在繪圖或繪製控制項過程中最讓人鬱悶的便是複雜繪製的閃爍問題. 如果您為該問題所困擾,那麼您應該注意以下幾點:
1, 使用緩衝:
比如要向graphics 物件 g 上繪製圖形, 你可以在記憶體中使用一張作為緩衝,先將圖形繪製到該上,繪製完成後再將該繪製到g上.
bitmap buffer
=new
bitmap(
this
.width,
this
.height);
using
(graphics buffergrfx
=graphics.fromimage(buffer))
rectangle srcrect
=this
.bounds;
rectangle destrect
=srcrect;
g.drawimage(buffer, destrect, srcrect, graphicsunit.pixel);
不用擔心兩次繪製會帶來效率上的損失, 其速度與直接繪製到g上幾乎一樣快.
2, base.onpaint(e);
如果所有的繪製操作都由自己來完成,那麼在覆蓋onpaint方法時, 請不要使用base.onpaint(e);
3, e.cliprectangle
運用剪輯區域, 這很重要, 很簡單地,比如圖形區域只有很小乙個部分需要更新你就沒有必要更新全部圖形區域.
具體說來就是,只有那些和剪輯區域相交(或被剪輯區域包含)的區域才需要繪製.
//假設block物件是程式的最小繪製單元
foreach
(block bk
inthis
.blocks)
}4, refrush(), invalidate(), update()
不要輕易使用refrush來重新整理圖形.
在重新整理之前,請先確定要重新整理的區域,如果要重新整理的區域只是圖形區域的一部分,您應該使用invalidate()來使該區域無效,然後使用update來更新這個無效區域便可.
5, setstyle();
其實在以上幾點之前, 應該在控制項的構造器(或其他初始化方法)中設定控制項樣式:
this
.setstyle(controlstyles.optimizeddoublebuffer,
true
);this
.setstyle(controlstyles.allpaintinginwmpaint,
true
);這裡的controlstyles有好幾個列舉,具體設定那些值,以及它們之間的相互關係,請參考msdn說明文件.
6, doublebuffered
有好幾種標準控制項是內建雙緩衝的,比如form, picturebox等, 您可以將它們的doublebuffered設定為true.來減少閃爍. (當然不要寄希望於僅僅設定該屬性便萬事大吉了, 不然以上5點不是白說了 : )
-----------------------------------
以上幾點僅僅是程式設計過程中的經驗總結, 若還有其他方法請補充 (肯定是有的).
Qt之繪製閃爍文字
根據之前的二位繪圖,我們可以很輕鬆的進行文字的繪製,如果需要一些特效,比如 文字閃爍。我們就必須借助其它輔助類來完成。主要涉及兩個輔助類 原理 標頭檔案bannerwidget.h ifndef para banner h define para banner h include include c...
解決自繪製控制項閃爍的問題
記得以前用vc開發自繪製控制項的時候,遇到的乙個很煩人的問題就是控制項在paint的時候總是出現flicker 閃爍 原因其實很簡單,就是你一點一點的向裝置上下文環境繪製,中間還有很多邏輯運算,結果就像是動畫了,不過計算機的速度比較快,所以呈現在我們面前的閃爍,而閃爍的出現大大的影響的客戶的使用體驗...
35 Qt 之繪製閃爍文字
根據之前的二位繪圖,我們可以很輕鬆的進行文字的繪製,如果需要一些特效,比如 文字閃爍。我們就必須借助其它輔助類來完成。主要涉及兩個輔助類 qfontmetrics 用於獲取文字字型的畫素高度與寬度 qbasictimer 定時器,用於更新文字繪製。利用qbasictimer進行定時重新整理。文字繪製...