三维标签DIY 要实现文字的三维显示，就是将相同的文字以不同的颜色进行错位叠加，从而使人的视觉产生3D效果。但在Delphi中只提供了标准的二维标签，要展现标签的3D风采，可以自己制作一个新控件。 在正式进入控件的制作之前，有必要先了解一下制作这个控件所涉及的不可缺少的函数： ·OffsetRect(LPRECT lprc, int x, int y)，其作用是用预定的偏移量移动一个指定的矩形，它的三个参数中，lprc指向欲被移动的矩形，而x和y则分别代表着水平方向和垂直方向上的偏移量。该函数如果被成功执行，则返回True，否则返回False。
·接下来的是DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat)，它的作用则是在指定的矩形中按一定的格式画出文字。其中hDC定义句柄，lpString指向欲写的文字串，nCount指定文字串的长度，若它的值为－1，则自动计算文字串的长度，lpRec指向写入文字的矩形，uFormat定义写入文字的格式。若该函数被成功执行，则返回文字的高度。
先创建一个新的程序包，在随后打开的程序包管理器中新建一个元件，并选择其上级类型为Tlabel（因为我们的控件只是在它的基础上作了一点小小的改动而已），即可得到该组件的骨架，在这个骨架上稍作修改。程序如下所示：
unit mylabel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TtdLabel = class(TLabel)
private
{ Private declarations }
procedure Draw3dText(R : TRect);
protected
{ Protected declarations }
procedure paint;override;
public
{ Public declarations }
constructor create(aowner:tcomponent);override;
destructor destroy;override;
published
{ Published declarations }
end;
procedure Register;
implementation
constructor Ttdlabel.create(aowner:tcomponent);
begin
inherited create(aowner);
end;
destructor Ttdlabel.destroy;
begin
inherited destroy;
end;
procedure Ttdlabel.Draw3dText(R:trect);
var
CaptionStz : array [0..255] of Char;
TempRct : TRect;
Flags:word;
begin
with Canvas do
begin
StrPCopy(CaptionStz,Caption);
if WordWrap then
Flags :=dt_WordBreak;
Font := Self.Font;
TempRct := R;
OffsetRect(TempRct,1,1);
Font.Color := clBtnShadow;
DrawText(Handle,CaptionStz,－1,TempRct,Flags);
TempRct := R;
OffsetRect(TempRct,－1,－1);
Canvas.Font.Color := clBtnHighLight;
DrawText(Handle,CaptionStz,－1,TempRct,Flags);
Font.Color := Self.Font.Color;
if not Enabled then
Font.Color := clGrayText;
DrawText(Handle,CaptionStz,－1,R,Flags);
end;
end;
procedure ttdlabel.paint;
begin
with Canvas do
begin
if not Transparent then
begin
Brush.Color := Self.Color;
Brush.Style := bsSolid;
FillRect(ClientRect);
end;
Brush.Style := bsClear;
Draw3DText (ClientRect);
end;
end;
procedure Register;
begin
RegisterComponents('SAMPLE', [TtdLabel]);
end;
end.
将制作好的三维标签控件安装上，打开一个新工程，选择Sample页，感觉一下效果如何。感兴趣的读者还可以再加上一些自己的特色上去
(赵　罡)