Firemonkey的旁門左道[一]

一般圖形繪製都會用到雙緩衝,先在內存中繪製到bitmap中,然後再輸出到界面中,可以不出現閃爍的情況。

本以爲在FMX也是同樣的套路。不然,發現Canvas永遠是空白的,愣是不輸出。國內資料基本爲O,翻牆無數,得知Bitmap的繪製前後需要:

  Bitmap.Canvas.BeginScene; 

  ...

  Bitmap.Canvas.EndScene;

在此之後需要BitmapChanged一下,然後再DrawBitmap到界面中。滿心歡喜,結果卻大失所望.

BitmapChanged在VCL的項目中有效,但是在FMX的框架中 已經被置爲了Private,這在XE2中還是Public。難道是英巴卡迪諾開發人員開小差了?



在Quality Center中果然有人提了這個BUG, 不過至今還沒有Fixed掉。


後來發現在DrawBitmap前後,分別對目標Canvas進行BeginScene, EndScene即可顯示繪製內容。

代碼結構如:

  Bitmap.Canvas.BeginScene; 

  ...

  Bitmap.Canvas.EndScene;

  Self.Canvas.BeginScene() ;

  self.Canvas.DrawBitmap(Bitmap, RectF(0,0,500,500), RectF(0,0,500, 500), 1);

  Self.Canvas.EndScene;


當然你可能發現,如果是在Paint事件中進行繪製,那麼就不需要套上BeginScene,EndScene了。我想對於Paint事件,應該是進行過特殊處理。有機會可以把源代碼挖出來看看。

-----------------

還有一個方法:TImageControl提供了bitmap,在上面繪製就是所繪即所得,不會出現明明繪製了,結果還是空白的情況。


參考鏈接:http://stackoverflow.com/questions/8336127/firemonkey-tbitmap-canvas-drawing-methods-have-no-visible-results-what-am-i-do



發佈了81 篇原創文章 · 獲贊 20 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章