Windows图形设备接口(Graphics Device Interface)是Windows系统中的图形核心模块,以GDI.EXE形式提供给开发者使用。Windows中的图形基本上是由GDI.EXE中的函数来处理的,它的主要特点是在输出设备上支持与设备无关的图形。在GDI函数中,文本亦被视为一种图形对象,但并非简单的几何方式绘制,因为文本的输出涉及到字体。
根据Windows中字体所用的技术可以分为3类字体:光栅字体,矢量字体和TrueType字体。其中,True Type字体的主要优点之一是可被任意放大或旋转,在任何尺寸上,都可以达到较为满意的显示效果,尤其,其允许在显示器和打印机上使用相同的字体。Windows为应用程序之所以能够提供设备无关性是通过采用让应用程序创建逻辑对象从而使用物理对象的方法实现的,同样,对于字体的使用也是一样的:应用程序在使用字体时,首先创建逻辑字体,以便Windows从设备中选择一种与之匹配的物理字体,从而达到较为准确的输出效果。
使用Windows GDI函数实现文字的倾斜效果的基本步骤如下:
1.取得设备描述表或图形设备的句柄:
HDC GetDc(Thandle AWinHandle);
2.创建逻辑字体并设置文字的倾斜度:
HFont CreateFontIndirect(LogFont Far *Iplf),
其中,Iplf为tagLogFont结构体,通过设置其lfEscapement可设置文字的倾斜度(为实际度数的10倍),例如:0度-正常字体,450度-左上45度倾斜,900度-正向左,等。
3.将逻辑字体选入设备列表,从而,Windows选择与之匹配的物理字体,并且新的字体取代旧的字体:
HGDIOBJ SelectObject(HDC hdc,HGDIOBJ hgdiobj);
注:在此之前现
4.使用当前设备的字体进行文字输出:
BOOL TextOut(HDC hdc, int PosX, int PosY, LPCTSTR OutStr, int StrLength);
5.释放不再使用的图形对象(这里为逻辑字体):
BOOL DeleteObject(HGDIOBJ hObject);
6.释放设备描述表或图形设备的句柄,函数声明如下:
ReleaseDc(THandle AWinHandle,HDC Dc);
注:上述过程要求在窗口的Paint事件中编写重新绘画或绘制文字的代码。
程序实现
在Delphi5.0中新建一个工程,在主窗体的Paint事件中编写如下代码:
procedure TForm1.FormPaint(Sender: TObject); var FLogFont : tagLogFontA; file://逻辑字体--结构体类型 hTempFont, hPrevFont: HFONT; file://字体句柄 hTempDC: HDC; file://设备描述表或图形设备句柄 TempString: string; file://输出的文字 begin FLogFont.lfHeight := 10; file://字高 FLogFont.lfWidth := 10; file://字宽 FLogFont.lfWeight := 1; file://字体笔划粗细程度 FLogFont.lfUnderline := 0; file://没有下划线 FLogFont.lfStrikeOut := 0; file://没有删除线 FLogFont.lfItalic := 0; file://斜体效果否 FLogFont.lfCharSet := GB2312_CHARSET; file://字符集 FLogfont.lfEscapement := 450; file://倾斜度 FLogFont.lfOrientation := 450; file://方向与倾斜度取值同 FLogFont.lfFaceName := '宋体'; file://字体名称 file://创建逻辑字体 hTempFont := CreateFontIndirect(FLogFont); TempString := '测试'; file://取得窗口的设备句柄 hTempDC := GetDC(Handle); file://取出窗口设备的当前字体,并替换为新字体 hPrevFont := SelectObject(hTempDC, hTempFont); file://设置设备窗口的文字色彩 SetTextColor(hTempDc, clRed); file://输出文字 TextOut(hTempDc, 200 , 200, PChar(TempString), Length(TempString)); file://恢复原有的字体 SelectObject(hTempDc, hPrevFont); file://删除逻辑字体 DeleteObject(hTempFont); file://释放设备接口 ReleaseDC(Handle, hTempDC); end; |
以上代码若不写在窗体的Paint事件,则当窗体接收到重绘消息时,默认的窗口绘制过程将重新绘制窗口而使倾斜文字消失。