转载: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我们就可以*控制这个原先不可见的私有属性了。
可见Canvas.BeginScene的时候对PixelFormat进行了一次重置。