转载:http://blog.csdn.net/qustdong/article/details/9992033

今天还是讲讲和图形有关的事情,这次的难度再增加些,不是直接改源代码了,

而是通过RTTI的方式去让定制我们需要的功能。

从Bitmap的源代码中,我们可以看到FPixelFormat的属性是私有的,也就是我们无法动态的去改变。

明明有十几种PixelFormat形式,又不能去设置,难道又是bug?

通过RTTI,我们可以很实习它的修改。

我们先自己定义一个继承自TBitmap的类,取名为TMyBitmap;

然后设置属性PixelFormat ,get set方法如下:

procedure TMyBitmap.SetPixelFormat(const PixelFormat: TPixelFormat);

var C: TRTTIContext;

  T: TRTTIType;

  F: TRTTIField;

  V: TValue;

begin

  C := TRTTIContext.Create;

  T := C.GetType(ClassInfo);

  if T <> nil then

  begin

    F := T.GetField('FPixelFormat');

    if F <> nil then

      F.SetValue(Self, TValue.From<TPixelFormat>(PixelFormat));

  end;

  C.Free;

 

end;

function TMyBitmap.GetPixelFormat: TPixelFormat;

var C: TRTTIContext;

  T: TRTTIType;

  F: TRTTIField;

  V: TValue;

begin

  Result := pfA8B8G8R8;

  C := TRTTIContext.Create;

  T := C.GetType(ClassInfo);

  if T <> nil then

  begin

    F := T.GetField('FPixelFormat');

    if F <> nil then

    begin

      V := F.GetValue(Self);

      Result := V.AsType<TPixelFormat>;

    end;

  end;

  C.Free;

end;

通过TMyBitmap我们就可以自由控制这个原先不可见的私有属性了。

Firemonkey的旁门左道[六]Firemonkey的旁门左道[六]Firemonkey的旁门左道[六]

可见Canvas.BeginScene的时候对PixelFormat进行了一次重置。

相关文章:

  • 2022-12-23
  • 2021-12-05
  • 2021-07-01
  • 2021-08-28
  • 2021-10-03
  • 2021-12-20
猜你喜欢
  • 2021-07-20
  • 2022-12-23
  • 2021-07-02
  • 2021-06-01
  • 2021-07-05
  • 2021-09-13
  • 2022-01-10
相关资源
相似解决方案