文字輸出函式

文字輸出函式

文字輸出函式:在許多範例程式中使用過最常用的文字輸出函式:如TextOut (hdc, xStart, yStart, pString, iCount) ; 參數xStart和yStart是邏輯坐標上字串的起始點。通常,這是Windows開始繪製的第一個字母的左上角。TextOut需要指向字串的指標和字串的長度,這個函式不能識別以NULL終止的字串。

介紹,類似地,另一個進階的文字輸出函式,iFormat,問題解決,

介紹

TextOut函式的xStart和yStart參數的含義可由SetTextAlign函式改變。TA_LEFT、TA_RIGHT和TA_CENTER旗標影響使用xStart在水平方向上定位字串的方式。預設值是TA_LEFT。如果在SetTextAlign函式中指定了TA_RIGHT,則後面的TextOut呼叫會將字串的最後一個字元定位於xStart,如果指定了TA_CENTER,則字串的中心位於xStart。

類似地

TA_TOP、TA_BOTTOM和TA_BASELINE旗標影響字串的垂直位置。TA_TOP是預設值,它意味著字串的字母頂端位於yStart,使用TA_BOTTOM意味著字串位於yStart之上。可以使用TA_BASELINE定位字串,使基準線位於yStart。基準線是如小寫字母p、q、y等字母下部的線。
如果您使用TA_UPDATECP旗標呼叫SetTextAlign,Windows就會忽略TextOut的xStart和yStart參數,而使用由MoveToEx、LineTo或更改目前位置的另一個函式設定的位置。TA_UPDATECP旗標也使TextOut函式將目前位置更新為字串的結尾(TA_LEFT)或字串的開頭(TA_RIGHT)。這在使用多個TextOut呼叫顯示一行文字時非常有用。當水平位置是TA_CENTER時,在TextOut呼叫後,目前位置不變。
您應該還記得,第四章的一系列SYSMETS程式顯示幾列文字時,對每一列都需要呼叫一個TextOut,其替代函式是TabbedTextOut函式:
TabbedTextOut ( hdc, xStart, yStart, pString, iCount,
iNumTabs, piTabStops, xTabOrigin) ;
如果文字字串中含有嵌入的跳位字元(‘\t’或0x09),則TabbedTextOut會根據傳遞給它的整數陣列將跳位字元擴展為空格。
TabbedTextOut的前五個參數與TextOut相同,第六個參數是跳位間隔數,第七個是以圖素為單位的跳位間隔陣列。例如,如果平均字元寬度是8個圖素,而您希望每5個字元加一個跳位間隔,則這個陣列將包含40、80、120,按遞增順序依此類推。
如果第六個和第七個參數是0或NULL,則跳位間隔按每八個平均字元寬度設定。如果第六個參數是1,則第七個參數指向一個整數,表示跳位間隔重複增大的倍數(例如,如果第六個參數是1,並且第七個參數指向值為30的變數,則跳位間隔設定在30、60、90…圖素處)。最後一個參數給出了從跳位間隔開始測量的邏輯x坐標,它與字串的起始位置可能相同也可能不同。

另一個進階的文字輸出函式

是ExtTextOut(字首Ext表示它是擴展的):
ExtTextOut (hdc, xStart, yStart, iOptions, &rect,
pString, iCount, pxDistance) ;
第五個參數是指向矩形結構的指標,在iOptions設定為ETO_CLIPPED時,該結構為剪裁矩形,在iOptions設定為ETO_OPAQUE時,該結構為用當前背景色填充的背景矩形。這兩種選擇您可以都採用,也可以都不採用。
最後一個參數是整數陣列,它指定了字串中連續字元的間隔。程式可以使用它使字元間距變窄或變寬,因為有時需要在較窄的列中調整單個文字。該參數可以設定為NULL來使用內定的字元間距。
用於寫文字的高級函式是DrawText,我們第一次遇到它是在第三章討論HELLOWIN程式時,它不指定坐標的起始位置,而是通過RECT結構型態定義希望顯示文字的區域:
DrawText (hdc, pString, iCount, &rect, iFormat) ;
和其他文字輸出函式一樣,DrawText需要指向字串的指標和字串的長度。然而,如果在DrawText中使用以NULL結尾的字串,就可以將iCount設定為-1,Windows會自動計算字串的長度。
iFormat設定為0時,Windows會將文字解釋為一系列由carriage return字元(‘\r’或0x0D)或linefeed字元(‘\n’或0x0A)分隔的行。文字從矩形的左上角開始,carriage return字元或linefeed字元被解釋為換行字元,因此Windows會結束當前行而開始新的一行。新的一行從矩形的左側開始,在上一行的下面空開一個字元的高度(沒有外部間隔)。包含字母的任何文字都應該顯示在所剪裁矩形底部的右邊或下邊。

iFormat

您可以使用iFormat參數更改DrawText的內定操作,iFormat由一個或多個旗標組成。DT_LEFT旗標(預設值)指定了左對齊的行,DT_RIGHT指定了向右對齊的行,而DT_CENTER指定了位於矩形左邊和右邊中間的行。因為DT_LEFT的值是0,所以如果只需要左對齊,就不需要包含識別字。
如果您不希望將carriage return字元或linefeed字元解釋為換行字元,則可以包括識別字DT_SINGLELINE。然後,Windows會把carriage return字元和linefeed字元解釋為可顯示的字元,而不是控制字元。在使用DT_SINGLELINE時,還可以將行指定為位於矩形的頂端(DT_TOP)、底端(DT_BOTTOM)或者中間(DT_VCETER,V表示垂直)。
在顯示多行文字時,Windows通常只在carriage return字元或linefeed字元處換行。然而,如果行的長度超出了矩形的寬度,則可以使用DT_WORDBREAK旗標,它使Windows在行內字的末尾換行。對於單行或多行文字的顯示,Windows會把超出矩形的文字部分截去,可以使用DT_NOCLIP跳過這個操作,這個旗標還加快了函式的速度。當Windows確定多行文字的行距時,它通常使用不帶外部間距的字元高度,如果您想在行距中加入外部間距,就可以使用旗標DT_EXTERNALLEADING。
如果文字中包含跳位字元(‘\t’或0x09),則您需要包括旗標DT_EXPANDTABS。在內定情況下,跳位間隔設定於每八個字元的位置。通過使用旗標DT_TABSTOP,您可以指定不同的跳位間隔,在這種情況下,iFormat的高位元組包含了每個新跳位間隔的字元位置數值。不過我建議您避免使用DT_TABSTOP,因為iFormat的高位元組也用於其他旗標

問題解決

DT_TABSTOP旗標存在的問題,可以由新的函式DrawTextEx來解決,它含有一個額外的參數:
DrawTextEx (hdc, pString, iCount, &rect, iFormat, &drawtextparams) ;
最後一個參數是指向DRAWTEXTPARAMS結構的指標,它的定義如下:
typedef struct tagDRAWTEXTPARAMS
{
UINT cbSize ; // size of structure
int iTabLength ; // size of each tab stop
int iLeftMargin ; // left margin
int iRightMargin ; // right margin
UINT uiLengthDrawn ; // receives number of characters processed
} DRAWTEXTPARAMS, * LPDRAWTEXTPARAMS ;
中間的三個欄位是以平均字元的增量為單位的。

相關詞條

熱門詞條

聯絡我們