明辉站/网站教程/内容

如何在 BCB 中旋转并输出文字

网站教程2024-02-13 阅读
[摘要]有很多文章介绍如何在 VC 中输出旋转文字,但却很少见到哪篇文章介绍在 BCB 中产生类似效果的。。以至于很多人认为在 BCB 中是无法做到类似效果的,当然这些人就有理由在那里口口声声地说 BCB 如何如何的差劲了!这个当然和 BCB 本身那套图形组件的设计是有很大关系的。VCL 图形组件封装了 ...
有很多文章介绍如何在 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!");


就这么简单。。。在底层控制其他的图形也类似于这种方法,大家不仿试试:)

……

相关阅读