• Firemonkey的旁门左道[六]


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

    而是通过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进行了一次重置。



  • 相关阅读:
    ET之快递测试法学习感悟20140922
    C#单元测试Nunit小结(20141018)
    oracle数据库导入导出09192255
    Mybatis-Configuration-详解
    Mybatis快速入门
    Ajax的学习笔记(一)
    php curl使用总结(一)
    ETL工具--DataX3.0实战
    SqlServer触发器的理解
    2017年的个人计划
  • 原文地址:https://www.cnblogs.com/pangblog/p/3263058.html
Copyright © 2020-2023  润新知