有很多文章介紹如何在 VC 中輸出旋轉(zhuǎn)文字,但卻很少見到哪篇文章介紹在 BCB 中產(chǎn)生類似效果的。。以至于很多人認(rèn)為在 BCB 中是無法做到類似效果的,當(dāng)然這些人就有理由在那里口口聲聲地說 BCB 如何如何的差勁了!
這個(gè)當(dāng)然和 BCB 本身那套圖形組件的設(shè)計(jì)是有很大關(guān)系的。
VCL 圖形組件封裝了 WINDOWS 圖形設(shè)備接口(GUI),使得在 WINDOWS 程序設(shè)計(jì)中添加圖形變得很容易。BCB 的設(shè)計(jì)的確很優(yōu)秀!它的意圖是將 VCL 圖形組件 設(shè)計(jì)成三個(gè)層次:
最高層:繪制線條和圖形,比如:MoveTo, LineTo, Rectangle, and Ellipse 輸出并控制文本,比如:TextOut, TextHeight, TextWidth, and TextRect 填充形狀,比如:FillRect and FloodFill
中層: 定制輸出的文本和圖形,通過控制以下屬性:Pen, Brush, and Font,Pixels 復(fù)制以及合并圖形,比如:Draw, StretchDraw, BrushCopy, and CopyRect 方法; CopyMode 屬性
底層: 直接調(diào)用 WINDOWS 的 GDI 函數(shù),VCL 圖形組件中提供了一個(gè) Handle 屬性,通過它,你能控制一切!
BCB 的用戶絕大多數(shù)只會(huì)使用高層和中層的一些方法和屬性,他們壓根不知道還有一個(gè)什么 Handle 屬性!針對(duì)這些用戶,以及那些對(duì) BCB 有異議的人,我提供了下面這個(gè)例子來說明 BCB 的強(qiáng)大以及易用性。
很簡(jiǎn)單,幾句代碼:
void __fastcall TForm1::FormPaint(TObject *Sender) { LOGFONT lf;
GetObject(Canvas->Font->Handle, sizeof (LOGFONT), &lf);
lf.lfEscapement = 450; //set to 450 to make 45 degree angle lf.lfOrientation = 450; lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
Canvas->Font->Handle = CreateFontIndirect (&lf); Canvas->Brush->Style = bsClear; Canvas->Pen->Color=clRed; Canvas->TextOut (20, 120, "WOW!! Angled text!"); }
怎么樣?是不是很簡(jiǎn)單啊。。。我記得在 VC 中單定義一個(gè)字體變量就要十多個(gè)參數(shù)呢!下面我們來簡(jiǎn)單地分析一下這個(gè)例子:
第一句:LOGFONT lf; LOGFONT 變量能完全地控制了字體的屬性,在 wingdi.h 中被定義為:typedef LOGFONTA LOGFONT; 而 LOGFONTA 定義為:
typedef struct tagLOGFONTA { LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; CHAR lfFaceName[LF_FACESIZE]; } LOGFONTA;
第二句:
GetObject(Canvas->Font->Handle, //看!用到 Handle 屬性了吧!這句用來取得畫布字體的句柄 sizeof (LOGFONT), //這句取得 LOGFONT 的 SIZE &lf);
下面幾句通過調(diào)整 LOGFONT 的屬性來控制字體
lf.lfEscapement = 450; //set to 450 to make 45 degree angle lf.lfOrientation = 450; lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
下面創(chuàng)建了一個(gè)新的字體,并且用來設(shè)置 Canvas->Font 的字體
Canvas->Font->Handle = CreateFontIndirect (&lf); Canvas->Brush->Style = bsClear; Canvas->Pen->Color=clRed; Canvas->TextOut (20, 120, "WOW!! Angled text!");
就這么簡(jiǎn)單。。。在底層控制其他的圖形也類似于這種方法,大家不仿試試:)
|