zoukankan      html  css  js  c++  java
  • Firemonkey的旁门左道[六]

    转载: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进行了一次重置。

  • 相关阅读:
    嵌入式系统编程和调试技巧
    使用Kotlin开发Android应用(II):创建新project
    2015 Multi-University Training Contest 2
    C#开发Unity游戏教程之游戏对象的属性变量
    Java开发project师案例-网络日志分析系统
    Flask
    Flask
    Flask
    Flask
    Flask
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/5032762.html
Copyright © 2011-2022 走看看