-
c语言入门之如何在 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!");
就这么简单。。。在底层控制其他的图形也类似于这种方法,大家不仿试试:)
这个当然和 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!");
就这么简单。。。在底层控制其他的图形也类似于这种方法,大家不仿试试:)
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式