GR32 TImage32的图层绘制原理
转载:http://blog.sina.com.cn/s/blog_491aced20100ded4.html
TImage32的继承顺序如下:TCustomControl->TCustomPaintBox32->TCustomImage32->TImage32,因此TImage32具有Windows句柄,也天然的具备了HDC这个绘画句柄,同时还可以处理Paint和EraseBackGround等事件。
TImage32和TPaintBox32都继承自TCustomPaintBox32,因此都内置了FBuffer这个TBitmap32类型的对象。在Paint(override)事件中,TCustomPaintBox32做了如下处理:
FBuffer.Lock;
with Canvas do
try
if FInvalidRects.Count > 0 then
for i := 0 to FInvalidRects.Count - 1 do
with FInvalidRects[i]^ do
BitBlt(Canvas.Handle, Left, Top, Right - Left, Bottom - Top, FBuffer.Handle, Left, Top, SRCCOPY)
else
with GetViewportRect do
BitBlt(Canvas.Handle, Left, Top, Right - Left, Bottom - Top, FBuffer.Handle, Left, Top, SRCCOPY);
finally
FBuffer.Unlock;
end;
ResetInvalidRects;
因此可以看出TCustomPaintBox32使用了FBuffer作为缓冲区画布,只有在系统重画事件发生时,才将FBuffer用Bitblt画到控件的画布上。
TImage32和TPaintBox32的一个很大的不同是:TImage32具备了分层功能,这个是通过FLayers: TLayerCollection这个对象实现的。TLayerCollection这个容器内可以包含0-n个TBitmapLayer类型的图层对象,每个图层对象都有一个TBitmap32的子对象。用户可以为TImage32增加不同的图层,并且可以通过设置图层对象OnPixelCombine属性来设置图层的融合效果。
那么这个图层绘制机制是如何被调用呢?原来TCustomPaintBox32的Paint事件中调用了DoPaintBuffer,而TImage32重载了这个函数,在这个函数中,TImage32调用每次stage的绘图函数,其中PST_DRAW_LAYERS类型的stage绘图函数会循环调用每个TBitmapLayer的DoPaint函数。
GR32 TImage32的图层绘制原理的更多相关文章
- Android面试收集录12 View测量、布局及绘制原理
一.View绘制的流程框架 View的绘制是从上往下一层层迭代下来的.DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下, ...
- Android View绘制原理分析
推荐两篇分析view绘制原理比较好的文章,感谢作者的分享. <Android应用层View绘制流程与源码分析> <View 绘制流程>
- UIView的绘制原理
当UIView调用setNeedDisplay之后, 系统会调用view对应layer的 setNeedsDisplay, 在当前runloop即将结束的时候调用CALayer的display方法. ...
- UIView绘制原理,异步绘制
绘制原理 首先看一幅流程图 UIView调用setNeedsDisplay方法后,实际上并没有发生当前视图的绘制工作,而是在之后的某一时机进行绘制工作,为什么会在之后的某一时机进行绘制工作呢? 当UI ...
- Android-图像原理/绘制原理
图像原理 先专门讲解图片,一想到图片有那些特点: 宽/高 格式jpg/jpeg/... 大小43.kb/... 图片是由像素点组成:像素点是正方形的,只是像素点很小很多,看起来可以拼接圆形⭕️, ...
- 讨论cocos2d-x字体绘制原理和应用方案
转自:http://blog.csdn.net/langresser_king/article/details/9012789 个人一直认为,文字绘制是cocos2d-x最薄弱的环节.对于愤怒的小鸟之 ...
- view的绘制原理
转:http://blog.csdn.net/berber78/article/details/42069301 自定义UI控件,需继承 View类或View的子类,并重载View类中的一些方法,不必 ...
- android自定义View的绘制原理
每天我们都会使用很多的应用程序,尽管他们有不同的约定,但大多数应用的设计是非常相似的.这就是为什么许多客户要求使用一些其他应用程序没有的设计,使得应用程序显得独特和不同. 如果功能布局要求非常定制化, ...
- NGUI UIPanel绘制原理学习
NGUI底层绘制都是调用UIDrawCall来完成的,它会动态实例化出材质球,改变UV偏移和缩放(图集显示).并且全部是面片 UIPanel也是面片,但是内部物体遮罩比较特殊,经过查找发现,影响UIP ...
随机推荐
- 自然语言21_Wordnet
QQ:231469242 欢迎喜欢nltk朋友交流 http://baike.baidu.com/link?url=YFVbJFMkZO9A5CAvtCoKbI609HxXXSFd8flFG_Lg ...
- 9月23日JavaScript作业----子菜单下拉
例题一.子菜单下拉 <style type="text/css"> *{ margin:0px auto; padding:0px} #menu{ width:700p ...
- ubuntu下eclipse遇到The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
JSP页面顶端出现“红色”的报错信息:The superclass "javax.servlet.http.HttpServlet" was not found on the Ja ...
- 关闭和启动adb服务命令
在运行中输入 关闭——adb kill-server 重启——adb start-server
- hdu 4006 The kth great number(优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006 题目大意: 第一行 输入 n k,后有 n 行,对于每一行有两种状态 ,①“I x” : 插入 ...
- VC----资源文件RC && RES
Windows所有可使用预定义资源的位置:点这里. MSDN查找Resource-Definition Statements (Windows) 关键字. 资源在VC程序中的使用. 一个源文件.RC ...
- VisualStudio.gitignore git 忽略
https://github.com/kaedei/gitignore/blob/master/VisualStudio.gitignore
- Nginx重新编译添加模块
原文链接:http://www.linuxidc.com/Linux/2013-06/86438.htm 找到安装nginx的源码根目录,如果没有的话下载新的源码 http://nginx.org t ...
- 安装windows后重新修复grub2的引导
前段时间,我的用的双系统windows8.1 + fedora 21 workstation,使用grub2引导fedora和windows8.1的启动.由于一些原因,导致我的windows8.1无法 ...
- php各种编码集详解和以及在什么情况下进行使用
字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集.GB2312字符集.B ...