如何在 BCB 中旋轉並輸出文字

轉載自: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!");


就這麼簡單。。。在底層控制其他的圖形也類似於這種方法,大家不仿試試:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章