轉載自:peachblossom http://blog.csdn.net/peachblossom/article/details/9271
如何在 BCB 中旋轉並輸出文字
有很多文章介紹如何在 VC 中輸出旋轉文字,但卻很少見到哪篇文章介紹在 BCB 中產生類似效果的。。以至於很多人認爲在 BCB 中是無法做到類似效果的,當然這些人就有理由在那裏口口聲聲地說 BCB 如何如何的差勁了!
這個當然和 BCB 本身那套圖形組件的設計是有很大關係的。
VCL 圖形組件封裝了 WINDOWS 圖形設備接口(GUI),使得在 WINDOWS 程序設計中添加圖形變得很容易。BCB 的設計的確很優秀!它的意圖是將 VCL 圖形組件 設計成三個層次:
最高層:繪製線條和圖形,比如:MoveTo, LineTo, Rectangle, and Ellipse
輸出並控制文本,比如:TextOut, TextHeight, TextWidth, and TextRect
填充形狀,比如:FillRect and FloodFill
中層: 定製輸出的文本和圖形,通過控制以下屬性:Pen, Brush, and Font,Pixels
複製以及合併圖形,比如:Draw, StretchDraw, BrushCopy, and CopyRect 方法; CopyMode 屬性
底層: 直接調用 WINDOWS 的 GDI 函數,VCL 圖形組件中提供了一個 Handle 屬性,通過它,你能控制一切!
BCB 的用戶絕大多數只會使用高層和中層的一些方法和屬性,他們壓根不知道還有一個什麼 Handle 屬性!針對這些用戶,以及那些對 BCB 有異議的人,我提供了下面這個例子來說明 BCB 的強大以及易用性。
很簡單,幾句代碼:
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!");
}
怎麼樣?是不是很簡單啊。。。我記得在 VC 中單定義一個字體變量就要十多個參數呢!下面我們來簡單地分析一下這個例子:
第一句: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);
下面幾句通過調整 LOGFONT 的屬性來控制字體
lf.lfEscapement = 450; //set to 450 to make 45 degree angle
lf.lfOrientation = 450;
lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
下面創建了一個新的字體,並且用來設置 Canvas->Font 的字體
Canvas->Font->Handle = CreateFontIndirect (&lf);
Canvas->Brush->Style = bsClear;
Canvas->Pen->Color=clRed;
Canvas->TextOut (20, 120, "WOW!! Angled text!");
就這麼簡單。。。在底層控制其他的圖形也類似於這種方法,大家不仿試試:)