| Delphi是具有可视化界面的面向对象编程语言,它以其功能强大、简便易用等诸多特性深受编程人员的喜爱。在Delphi 6程序中输出文字时,文字一般是水平或垂直的,虽然可以很容易地改变文字的字体、字号、颜色,但要输出带任意倾斜度的文字以达到特殊的显示效果就有点困难了。 Win32 API即为Windows应用编程接口(Application Programming Interface),所有在Win32平台上运行的应用程序都可以调用这些函数,所以通过调用Win32 API函数可以实现输出文字的特殊显示操作。 ★实例要求 在窗体的下部有一个按钮,单击按钮后,窗体中间输出一行文字,如:“中国电脑教育报”,输出的文字在窗体的中间顺时针旋转。 ★重要API函数 将指定的对象选入给定的设备描述表。 function SelectObject(DC:HDC;p2:HGDIOBJ):HGDIOBJ;stdcall; 使用LogFont结构创建一种逻辑字体。 function CreateFontIndirect(const P1:TLogFont):HFont;stdcall; 用当前字体把一个字符串写到指定位置。 function TextOut(DC: HDC; X, Y: Integer; Str: PChar; Count: Integer): BOOL; stdcall; 从内存中删除一个对象(本文指逻辑字体)。 function DeleteObject(p1: HGDIOBJ): BOOL; stdcall; ★字体结构 TLogfont结构是实现文字特殊显示的关键,Windows将根据结构中的内容创建出相应的逻辑字体,在Delphi的Windows.pas中定义的TLogFont结构如下: type TLogFontA = packed record lfHeight: Longint; //以逻辑单位标定的字体高度,取值可为正负或零。 lfWidth: Longint; //字体的平均宽度,若指定为0,则系统会自动根据适当的比例自动处理宽度。 lfEscapement: Longint; //输出方向与当前坐标系X轴之间的以十分之一度为单位的角度。 lfOrientation: Longint; //每个字符与当前坐标系X轴之间的以十分之一度为单位的角度。在Windows 95中这个值等同于lfEscpement。 lfWeight: Longint; //范围为从0至1000的字体加重程度,400是标准字体,700是加重字体,0表示采用默认值。 lfItalic: Byte; //不为0表示采用斜体字。 lfUnderline: Byte; //不为0表示带下划线。 lfStrikeOut: Byte; //不为0表示带删除线。 lfCharSet: Byte; //指定字体集。 lfOutPrecision: Byte; //输出精度,用于确定对前面一些设定值的精确程度。 lfClipPrecision: Byte; //裁剪精度,就是去掉图形中落在视图以外的部分,有助于提高图形的处理速度。 lfQuality: Byte; //指定输出质量。 lfPitchAndFamily: Byte; //指定字体的Pitch和Family。 lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar; //指定采用的字体名称,且LF_FACESIZE=32。 end; TLogFont =TLogFontA; 注意在Windows环境下,每种字体具体输出为何种形式取决于很多因素,需要对以上这些参数进行有效的组合才能达到所要的效果。 ★创作步骤 在Delphi 6.0中,建立一个新的标准工程。 在窗体下部添加一个Button按钮,将其Caption属性设为“开始旋转”。 添加“开始旋转”按钮的事件处理过程代码: procedure TForm1.Button1Click(Sender: TObject); var i: integer; LogcalFnt:TLogFont; TempFont,NewFont:integer; DispStr:Pchar; begin LogcalFnt.lfHeight:=10;//字高 LogcalFnt.lfWidth:=10;//字宽 LogcalFnt.lfEscapement:=0;//倾斜度 LogcalFnt.lfOrientation:=0;//方向与倾斜度取值相同 LogcalFnt.lfWeight:=400;//字体笔画粗细程度 LogcalFnt.lfItalic:=0;//没有斜体效果 LogcalFnt.lfUnderline:=0;//没有下划线 LogcalFnt.lfStrikeOut:=0;//没有删除线 LogcalFnt.lfCharSet:=0;//默认字符集 LogcalFnt.lfOutPrecision:=0;//系统默认值 LogcalFnt.lfClipPrecision:=0;//系统默认值 LogcalFnt.lfQuality:=0;//系统默认值 LogcalFnt.lfPitchAndFamily:=0;//系统默认值 LogcalFnt.lfFaceName:=Arial+Chr(0);//字体名称 DispStr:=中国电脑教育报; i:=3600; while (i〉-1) do //自X轴正方向开始顺时针旋转 begin LogcalFnt.lfEscapement:=i; //按一定的步长赋初值 TempFont:=CreateFontIndirect(LogcalFnt); //创建逻辑字体 NewFont:=SelectObject(Form1.Canvas.Handle,TempFont); //取得当前字体,并替换为新字体 TextOut(Form1.Canvas.Handle,form1.width div 2,form1.height div 2,sDispStr,length(DispStr)); //在窗体中间为起点输出文字 TempFont:=SelectObject(Form1.Canvas.Handle,NewFont); //还原替换的字体 DeleteObject(TempFont); //删除逻辑字体 i:=i-100; //旋转步长为10度 end; end; 注:以上代码在Windows me和Delphi 6中运行通过。 结束语这是Windows的API函数使用的一个具体例子,希望能对广大读者起到抛砖引玉的作用,笔者对LongFont结构的详细说明,但愿读者能够触类旁通,利用Win32 API接口函数编写出更为丰富多彩的文字效果。
|