http://blog.csdn.net/qustdong/article/details/9901361

一般图形绘制都会用到双缓冲,先在内存中绘制到bitmap中,然后再输出到界面中,可以不出现闪烁的情况。

 

本以为在FMX也是同样的套路。不然,发现Canvas永远是空白的,愣是不输出。国内资料基本为O,FQ无数,得知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