zoukankan      html  css  js  c++  java
  • 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函数。

  • 相关阅读:
    题目:返回一个整数数组中最大子数组的和。(要求程序必须能处理1000 个元素)
    四则运算三(接受用户输入答案,并判断对错。)
    二维数组
    结对开发(一位数组)
    测试四则运算
    四则运算2
    程序设计思路
    项目计划总结
    小学二年级题目的改进
    二年级题目的改进
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/4718591.html
Copyright © 2011-2022 走看看