Firemonkey的旁門左道 六

2022-06-23 08:18:11 字數 1455 閱讀 6325

**:

今天還是講講和圖形有關的事情,這次的難度再增加些,不是直接改源**了,

而是通過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(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;

end;

end;

c.free;

end;

通過tmybitmap我們就可以自由控制這個原先不可見的私有屬性了。

可見canvas.beginscene的時候對pixelformat進行了一次重置。

Firemonkey的旁門左道 一

一般圖形繪製都會用到雙緩衝,先在記憶體中繪製到bitmap中,然後再輸出到介面中,可以不出現閃爍的情況。本以為在fmx也是同樣的套路。不然,發現canvas永遠是空白的,愣是不輸出。國內資料基本為o,翻牆無數,得知bitmap的繪製前後需要 bitmap.canvas.beginscene bitm...

Firemonkey的旁門左道 七

時間過得真快,又到了週末!今天晚上,我們就講講如何設定bitmap中的畫素點吧。原先xe還保持了bitmap.scanline i 的方法,不過到了xe4我們再一次無法使用了。方法總比困難多。通過tbitmapdata,我們還是可以訪問每個畫素點的,也就意味著我們可以去改變他們了。如下 proced...

一些旁門左道

asp.net 上如何重啟iis 達到讓 重啟的效果,可以用cmd.exe執行restartiis命令,可以修改web.config,但這些都要求 的賬戶有一定的許可權,至少 是要localsystem。private void restartiis string file codedir rest...