一、引言
在Delphi開發環境中,文字的輸出效果一般都是頭上腳下的"正統"字符,如何輸出帶有一定傾斜角度的文字以達到特殊的顯示效果呢?筆者在制作公章輔助設計軟件過程中,通過Windows圖形設備接口函數實現了文字呈輻射狀分布的功能。
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事件中編寫重新繪畫或繪制文字的代碼。
<b>二、程序實現</b>
在Delphi5.0中新建一個工程,在主窗體的Paint事件中編寫如下代碼:
<ccid_nobr>
<table width="400" border="1" cellspacing="0" cellpadding="2"
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
<tr>
<td bgcolor="e6e6e6" class="code" >
<pre><ccid_code>
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事件,則當窗體接收到重繪消息時,默認的窗口繪制過程將重新繪制窗口而使傾斜文字消失。
三、結束語
以上,只是Windows GDI接口函數使用的一個具體例子,希望能對廣大讀者起到拋磚引玉的作用,利用Windows GDI接口函數編寫出更為豐富多彩的的文字效果。