WINDOWS程式設計--文字和字體

顯示文字是本書所要解決的首要問題,現在我們來研究Microsoft Windows中各種有效字體字體大小的使用方法以及調整文字的方式。

Windows 3.1發表的TrueType使程式寫作者和使用者以靈活的方式處理文字的能力大幅增強。TrueType是輪廓字體技術,由Apple Computer公司和Microsoft公司開發,並被許多字體製造商支援。由於TrueType字體能夠連續縮放,並能應用於視訊顯示器和印表機,現在能夠在Windows下實作真的WYSIWYG(whatyou see is what you get:所見即所得)。TrueType也便於製作「奇妙」字體,例如旋轉的字母、內部填充圖案的字母或將它們用於剪裁區域,在本章我將展示它們。

簡單的文字輸出

讓我們先來看看Windows文字輸出、影響文字的裝置內容屬性以及備用字體提供的各種函式。

文字輸出函式

我已經在許多範例程式中使用過最常用的文字輸出函式:

<span style="font-size:18px;">TextOut (hdc, xStart, yStart, pString, iCount) ; </span>

參數xStart和yStart是邏輯座標上字串的起始點。通常,這是Windows開始繪製的第一個字母的左上角。TextOut需要指向字串的指標和字串的長度,這個函式不能識別以NULL終止的字串。

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函式:

<span style="font-size:18px;">TabbedTextOut ( hdc, xStart, yStart, pString, iCount,iNumTabs, piTabStops, xTabOrigin) ;</span>

如果文字字串中含有嵌入的跳位字元(‘/t’或0x09),則TabbedTextOut會根據傳遞給它的整數陣列將跳位字元擴展爲空格。

TabbedTextOut的前五個參數與TextOut相同,第六個參數是跳位間隔數,第七個是以圖素爲單位的跳位間隔陣列。例如,如果平均字元寬度是8個圖素,而您希望每5個字元加一個跳位間隔,則這個陣列將包含40、80、120,按遞增順序依此類推。

如果第六個和第七個參數是0或NULL,則跳位間隔按每八個平均字元寬度設定。如果第六個參數是1,則第七個參數指向一個整數,表示跳位間隔重複增大的倍數(例如,如果第六個參數是1,並且第七個參數指向值爲30的變數,則跳位間隔設定在30、60、90…圖素處)。最後一個參數給出了從跳位間隔開始測量的邏輯x座標,它與字串的起始位置可能相同也可能不同。

另一個進階的文字輸出函式是ExtTextOut(字首Ext表示它是擴展的):

<span style="font-size:18px;">ExtTextOut (hdc, xStart, yStart, iOptions, &rect,pString, iCount, pxDistance);</span>

第五個參數是指向矩形結構的指標,在iOptions設定爲ETO_CLIPPED時,該結構爲剪裁矩形,在iOptions設定爲ETO_OPAQUE時,該結構爲用目前背景色填充的背景矩形。這兩種選擇您可以都採用,也可以都不採用。

最後一個參數是整數陣列,它指定了字串中連續字元的間隔。程式可以使用它使字元間距變窄或變寬,因爲有時需要在較窄的列中調整單個文字。該參數可以設定爲NULL來使用內定的字元間距。

用於寫文字的高級函式是DrawText,我們第一次遇到它是在第三章討論HELLOWIN程式時,它不指定座標的起始位置,而是通過RECT結構型態定義希望顯示文字的區域:

<span style="font-size:18px;">DrawText (hdc, pString, iCount, &rect, iFormat); </span>

和其他文字輸出函式一樣,DrawText需要指向字串的指標和字串的長度。然而,如果在DrawText中使用以NULL結尾的字串,就可以將iCount設定爲-1,Windows會自動計算字串的長度。

當iFormat設定爲0時,Windows會將文字解釋爲一系列由carriage return字元(‘/r’或0x0D)或linefeed字元(‘/n’或0x0A)分隔的行。文字從矩形的左上角開始,carriage return字元或linefeed字元被解釋爲換行字元,因此Windows會結束目前行而開始新的一行。新的一行從矩形的左側開始,在上一行的下面空開一個字元的高度(沒有外部間隔)。包含字母的任何文字都應該顯示在所剪裁矩形底部的右邊或下邊。

您可以使用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來解決,它含有一個額外的參數:

<span style="font-size:18px;">DrawTextEx (hdc, pString, iCount, &rect, iFormat, &drawtextparams);</span>

最後一個參數是指向DRAWTEXTPARAMS結構的指標,它的定義如下:

<span style="font-size:18px;">1.	typedef struct tagDRAWTEXTPARAMS  
2.	{  
3.	    UINT    cbSize ;                    // size of structure  
4.	        int     iTabLength ;            // size of each tab stop  
5.	        int     iLeftMargin ;           // left margin  
6.	        int     iRightMargin ;          // right margin  
7.	        UINT    uiLengthDrawn ;         // receives number of characters processed  
8.	} DRAWTEXTPARAMS, * LPDRAWTEXTPARAMS ; 
</span>

中間的三個欄位是以平均字元的增量爲單位的。

文字的裝置內容屬性

除了上面討論的SerTextAlign外,其他幾個裝置內容屬性也對文字產生了影響。在內定的裝置內容下,文字顏色是黑色,但您可以用下面的敘述進行更改:

<span style="font-size:18px;">1.	SetTextColor (hdc, rgbColor) ;  </span>

使用畫筆的顏色和畫刷的顏色,Windows把rgbColor的值轉換爲純色,您可以通過呼叫GetTextColor取得目前文字的顏色。

Windows在矩形的背景區域中顯示文字,它可能根據背景模式的設定進行著色,也可能不這樣做。您可以使用

<span style="font-size:18px;">1.	SetBkMode (hdc, iMode) ;  </span>

更改背景模式,其中iMode的值爲OPAQUE或TRANSPARENT。內定的背景模式爲OPAQUE,它表示Windows使用背景顏色來填充矩形的背景。您可以使用

<span style="font-size:18px;">1.	SetBkColor (hdc, rgbColor) ;  </span>

來改變背景顏色。rgbColor的值是轉換爲純色的值。內定背景色是白色。

如果兩行文字靠得太近,其中一個的背景矩形就會遮蓋另一個的文字。由於這種原因,我通常希望內定的背景模式是TRANSPARENT。在背景模式爲TRANSPARENT的情況下,Windows會忽略背景色,也不對矩形背景區域著色。Windows也使用背景模式和背景色對點和虛線之間的空隙及陰影刷中陰影間的區域著色,就像第五章所討論的那樣。

許多Windows程式將WHITE_BRUSH指定爲Windows用於擦出視窗背景的畫刷,畫刷在視窗類別結構中指定。然而,您可能希望您程式的視窗背景與使用者在「控制檯」中設定的系統顏色保持一致,在這種情況下,可以在WNDCLASS結構中指定背景顏色的這種方式:

<span style="font-size:18px;">1.	wndclass.hbrBackground = COLOR_WINDOW + 1 ;</span>

當您想要在顯示區域書寫文字時,可以使用目前系統顏色設定文字色和背景色:

<span style="font-size:18px;">1.	SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT)) ;  
2.	SetBkColor (hdc, GetSysColor (COLOR_WINDOW)) ;  
</span>

完成這些以後,就可以使您的程式隨系統顏色的更改而變化:

<span style="font-size:18px;">1.	case    WM_SYSCOLORCHANGE :  
2.	        InvalidateRect (hwnd, NULL, TRUE) ;  
3.	        break ;  
</span>

另一個影響文字的裝置內容屬性是字元間距。它的預設值是0,表示Windows不在字元之間添加任何空間,但您可以使用以下函式插入空間:

<span style="font-size:18px;">1.	SetTextCharacterExtra (hdc, iExtra) ;  </span>

參數iExtra是邏輯單位,Windows將其轉換爲最接近的圖素,它可以是0。如果您將iExtra取爲負值(希望將字元緊緊壓在一起),Windows會接受這個數值的絕對值─也就是說,您不能使iExtra的值小於0。您可以通過呼叫GetTextCharacterExtra取得目前的字元間距,Windows在傳回該值前會將圖素間距轉換爲邏輯單位。

使用備用字體

當您呼叫TextOut、TabbedTextOut、ExtTextOut、DrawText或DrawTextEx書寫文字時,Windows使用裝置內容中目前選擇的字體字體定義了特定的字樣和大小。以不同字體顯示文字的最簡單方法是使用Windows提供的備用字體,然而,它的範圍是很有限的。

您可以呼叫下面的函式取得某種備用字體的代號:

<span style="font-size:18px;">1.	hFont = GetStockObject (iFont) ; </span>

其中,iFont是幾個識別字之一。然後,您就可以將該字體選入裝置內容:

<span style="font-size:18px;">1.	SelectObject (hdc, hFont) ;  </span>

這些您也可以只用一步完成:

<span style="font-size:18px;">1.	SelectObject (hdc, GetStockObject (iFont)) ;  </span>

在內定的裝置內容中選擇的字體稱爲系統字體,能夠由GetStockObject的SYSTEM_FONT參數識別。這是調和的ANSI字元集字體。在GetStockObject中指定SYSTEM_FIXED_FONT(我在本書的前面幾個程式中應用過),可以獲得等寬字體的代號,這一字體與Windows 3.0以前的系統字體相容。在您希望所有的字體都具有相同寬度時,這是很方便的。

備用字體OEM_FIXED_FONT也稱爲終端機字體,是Windows在MS-DOS命令提示視窗中使用的字體,它包括與原始IBM-PC擴展字元集相容的字元集。Windows在視窗標題列、功能表和對話方塊的文字中使用DEFULT_GUI_FONT。

當您將新字體選入裝置內容時,必須使用GetTextMetrics計算字元的高度和平均寬度。如果選擇了調和字體,那麼一定要注意,字元的平均寬度只是個平均值,某些字元會比它寬或比它窄。在本章的後面,您會瞭解到確定由不同寬度字元所組成的字串總寬度的方法。

儘管GetStockObject確實提供了存取不同字體的最簡單方式,但是您還不能充分控制項Windows所提供的字體。不久,您會看到指定字體字樣和大小的方法。

字體的背景

本章剩餘的部分致力於處理不同的字體。但是在您接觸這些特定程式碼前,對Windows使用字體的基本知識有一個深入的瞭解是很有好處的。

字體型態

Windows支援兩大類字體,即所謂的「GDI字體」和「設備字體」。GDI字體儲存在硬碟的檔案中,而設備字體是輸出設備本來就有的。例如,通常印表機都具有內建的設備字體集。

GDI字體有三種樣式:點陣字體,筆劃字體和TrueType字體

點陣字體的每個字元都以點陣圖圖素圖案的形式儲存,每種點陣字體都有特定的縱橫比和字元大小。Windows通過簡單地複製圖素的行或列就可以由GDI點陣字體產生更大的字元。然而,只能以整數倍放大字體,並且不能超過一定的限度。由於這種原因,GDI點陣字體又稱爲「不可縮放的」字體。它們不能隨意地放大或縮小。點陣字體的主要優點是顯示性能(顯示速度很快)和可讀性(因爲是手工設計的,所以儘可能清晰)。

字體是通過字體名稱識別的,點陣字體字體名稱爲:

System (用於SYSTEM_FONT

FixedSys (用於SYSTEM_FIXED_FONT

Terminal (用於OEM_FIXED_FONT

Courier

MS Serif

MS Sans Serif(用於DEFAULT_GUI_FONT

Small Fonts

每個點陣字體只有幾種大小(不超過6種)。Courier字體是定寬字體,外形與用打字機打出的字體相似。「Serif」指字體字母筆劃在結束時拐個小彎。「sans serif」字體不是serif類的字體。在Windows的早期版本中,MS(Microsoft)Serif和MS Sans Serif字體被稱爲Tms Rmn(指它與Times Roman相似)和Helv(與Helvetica相似)。Small Fonts是專爲顯示小字設計的。

在Windows3.1以前,除了GDI字體外,Windows所提供的字體只有筆劃字體。筆劃字體是以「連結點」的方式定義的一系列線段,筆劃字體可以連續地縮放,這意味著同樣的字體可以用於具有任何解析度的圖形輸出設備,並且字體可以放大或縮小到任意尺寸。不過,它的性能不好,小字體的可讀性也很糟,而大字體由於筆劃是單根直線而顯得很單薄。筆劃字體有時也稱爲繪圖機字體,因爲它們特別適合於繪圖機,但是不適合於別的場合。筆劃字體的字樣有:Modern、Roman和Script。

對於GDI點陣字體和GDI筆劃字體,Windows都可以「合成」粗體、斜體、加底線和加刪除線,而不需要爲每種屬性另外儲存字體。例如,對於斜體,Windows只需要將字元的上部向右移動就可以了。

接下來是Truetype,我將在本章的剩部分主要討論它。

TrueType字體

TrueType字體的單個字元是通過填充的直線和曲線的輪廓來定義的。Windows可以通過改變定義輪廓的座標對TrueType字體進行縮放。

程式開始使用特定大小的TrueType字體時,Windows「點陣化」字體。這就是說Windows使用TrueType字體檔案中包括的「提示」對每個字元的連結直線和曲線的座標進行縮放。這些提示可以補償誤差,避免合成的字元變得很難看(例如,在某些字體中,大寫H的兩豎應該一樣寬,但盲目地縮放字體可能會導致其中一豎的圖素比另一豎寬。有了提示就可以避免這些現象發生)。然後,每個字元的合成輪廓用於建立字元的點陣圖,這些點陣圖儲存在記憶體以備將來使用。

最初,Windows使用了13種TrueType字體,它們的字體名稱如下:

Courier New

Courier New Bold

Courier New Italic

Courier New BoldItalic

Times New Roman

Times New Roman Bold

Times New RomanItalic

Times New Roman BoldItalic

Arial

Arial Bold

Arial Italic

Arial Bold Italic

Symbol

在新的Windows版本中,這個列表更長了。在此特別指出,我將使用Lucida Sans Unicode字體,它包括了一些在世界其他地方使用的字母表。

三個主要字體系列與點陣字體相似,Courier New是定寬字體。它看起來就像是打字機輸出的字體。Times New Roman是Times字體的複製品,該字體最初爲《Times of London》設計,並用在許多印刷材料上,它具有很好的可讀性。Arial是Helvetica字體的複製品,是一種sans serif字體。Symbol字體包含了手寫符號集。

屬性或樣式

在上面的TrueType字體列表中,您會注意到,Courier、Times New Roman和Arial的粗體和斜體是帶有自己字體名稱的單獨字體,這一命名與傳統的板式一致。然而,電腦使用者認爲粗體和斜體只是已有字體的特殊「屬性」。Windows在定義點陣字體命名、列舉和選擇的方式時,採用了屬性的方法。但對於TrueType字體,更傾向於使用傳統的命名方式。

這種衝突在Windows中還沒有完全解決,簡而言之,您可以完全通過命名或特定屬性來選擇字體。然而在處理字體列舉時,應用程式需要系統中的字體列表,正如您所預料,這種雙重處理使問題複雜化了。

點值

在傳統的版式中,您可以用字體名稱和大小來指定字體字體的大小以點的單位來表示。一點與1/72英寸很接近──它們非常接近,因此在電腦中它通常定義爲1/72英寸。點值通常描述爲字母頂端(不包括髮音符號)到字母底端的高度,例如,字母「bq」的總高度。這是一個考慮字體大小的簡單方式,但它通常不是很精確。

字體的點值實際上是排版設計的概念而不是度量概念。特定字體中字元的大小可能會大於或小於其點值所表示的大小。在傳統的排版中,您使用點值來指定字體的大小,在電腦排版中,還有其他方法來確定字元的實際大小。

間隔和間距

在第四章我們曾提到,可以通過呼叫GetTextMetrics取得裝置內容中目前選擇的字體資訊,我們也多次使用過這個函式。圖4-3顯示了FONTMETRIC結構中字體的垂直大小。

TEXTMETRIC結構的另一個欄位是tmExternalLeading,詞「間隔(leading)」來自排字工人在金屬字塊間插入的鉛,它用於在兩行文字之間產生空白。tmInternalLeading值與爲發音符號保留的空間有關,tmExternalLeading表示字元的連續行之間所留的附加空間。程式寫作者可以使用或忽略外部的間隔值。

當我們說一個字體是8點或12點時,指的是不帶內部間隔的高度。某種大寫字母上的發音符號佔據了分隔行的間距。這樣,TEXTMETRIC結構的tmHeight值實際指行間距而不是字體的點值。字體的點值可由tmHeight減tmInternalLeading得到。

邏輯英寸問題

正如我們在第五章〈設備的大小〉一節中所討論的,Windows98將系統字體定義爲帶有12點行距的10點字體。根據在「顯示屬性」對話方塊中選擇的是「小字體」還是「大字體」,該字體的tmHeight值爲16或20圖素,tmHeight減去tmInternalLeading的值爲13或16圖素。這樣,字體的選擇就暗指以每英寸的點數爲單位的設備解析度,選擇「小字體」即爲96dpi,選擇「大字體」即爲120dpi。

您可以用LOGPIXELSX或LOGPIXELSY參數呼叫GetDeviceCaps來取得該設備解析度。因此,96或120圖素在螢幕上佔有的度量距離可以稱爲「邏輯英寸」。如果您用尺測量螢幕並計算圖素,就可能發現邏輯英寸要比實際的英寸大一些,爲什麼會這樣呢?

在紙張上,每英寸放設14個8點的字元很方便閱讀。如果您在作文書處理或寫作應用程式時,可能希望在顯示器上顯示清晰的8點字型,但如果使用視訊顯示器的實際尺寸,就沒有足夠的圖素清晰地顯示字元。即使顯示器具有足夠的解析度,在螢幕上閱讀8點字體仍然會有問題。當人們閱讀紙上的印刷物時,眼睛與文字的距離通常爲一英尺,而使用視訊顯示器時,這個距離通常爲兩英尺。

邏輯英寸有效地對螢幕進行了放大,能夠顯示小至8點的清晰字體。而且,每英寸96點使640圖素的最小顯示大小等於大約6.5英寸。這恰恰是在頁邊距爲1英寸的8.5英寸寬的紙上列印的文字的寬度。因而,邏輯英寸也利用了螢幕寬度,儘可能大地顯示文字

您可能還記得在第五章,Windows NT的做法有些不同。在Windows NT中,從GetDeviceCaps中得到的LOGPIXELSX(每英寸的圖素數)值不等於HORZRES值(圖素數)除以HORZSIZE值(毫米數)再乘以25.4的值。以此類似,LOGPIXELSY、VERTRES和VERTSIZE也不一致。Windows在爲不同映射方式計算視窗和偏移範圍時,使用HORZRES、HORZSIZE、VERTRES和VERTSIZE值。然而,顯示文字程式最好不要使用根據LOGPIXELSX和LOGPIXELSY使用假定的顯示解析度,這一點與Windows 98更爲一致。

所以,在Windows NT下,當程式以特定的點值顯示文字時,它可能不使用Windows提供的映射方式,程式根據與Windows 98一樣的每英寸的邏輯圖素數來定義自己的映射方式。我將這種用於文字的映射方式稱爲「Logical Twips」映射方式。您可以設定如下:

<span style="font-size:18px;">1.	SetMapMode  (hdc, MM_ANISOTROPIC) ;  
2.	SetWindowExtEx   (hdc, 1440, 1440, NULL) ;  
3.	SetViewportExt   (hdc,  GetDeviceCaps (hdc, LOGPIXELSX),  
4.	                        GetDeviceCaps (hdc, LOGPIXELSY), NULL) ;  
</span>

使用這種映射方式設定,您能夠以點值的20倍來指定字體大小,例如,爲12點字取240。注意,與MM_TWIPS映射方式不同,y值在螢幕中向下增長,這在顯示文字的連續行時很方便。

請記住,邏輯英寸與實際英寸間的差異僅對顯示器存在。在列印設備上,GDI和尺是完全一致的。

邏輯字體

既然我們已經明確了邏輯英寸和邏輯單位的概念,那麼現在我們就來討論邏輯字體

邏輯字體是一個GDI物件,它的代號儲存在HFONT型態的變數中,邏輯字體字體的描述。和邏輯畫筆及邏輯畫刷一樣,它是抽象的物件,只有當應用程式呼叫SelectObject將它選入裝置內容時,它才成爲真實的物件。例如,對於邏輯畫筆,您可以爲畫筆指定任意的顏色,但是在您將畫筆選入裝置內容時,Windows纔將其轉換爲設備中有效的顏色。只有此時,Windows才知道設備的色彩能力。

邏輯字體的建立和選擇

您可以透過呼叫CreateFont或CreateFontIndirect來建立邏輯字體。CreateFontIndirect函式接受一個指向LOGFONT結構的指標,該結構有14個欄位。CreateFont函式接受14個參數,它們與LOGFONT結構的14個欄位形式相同。它們是僅有的兩個建立邏輯字體的函式(我提到這一點,是因爲Windows中有許多用於其他字體操作的函式)。因爲很難記住14個欄位,所以很少使用CreateFont。因此,我主要討論CreateFontIndirect。

有三種基本的方式用於定義LOGFONT結構中的欄位,以便呼叫CreateFontIndirect:

  • 您可以簡單地將LOGFONT結構的欄位設定爲所需的字體特徵。在這種情況下,在呼叫SelectObject時,Windows使用「字體映射」演算法從設備上有效的字體中選擇與這些特徵最匹配的字體。由於這依賴於視訊顯示器和印表機上的有效字體,所以其結果可能與您的要求有相當大的差別。
     
  • 您可以列舉設備上的所有字體並從中選擇,甚至用對話方塊把它們顯示給使用者。我將在本章後面討論字體列舉函式。不過,它們現在已經不常用了,因爲第三種方法也可以進行列舉。
     
  • 您可以採用簡單的方法並呼叫ChooseFont函式,我在第十一章曾討論過這個函式,能夠使用LOGFONT結構直接建立字體
     

在本章,我使用第一種和第三種方法。

下面是建立、選擇和刪除邏輯字體的程序:

  1. 通過呼叫CreateFont或CreateFontIndirect建立邏輯字體,這些函式傳回HFONT型態的邏輯字體代號。
  2. 使用SelectObject將邏輯字體選入裝置內容,Windows會選擇與邏輯字體最匹配的真實字體
  3. 使用GetTextMetrics(及可能用到的其他函式)確定真實字體的大小和特徵。在該字體選入裝置內容後,可以使用這些資訊來適當地設定文字的間距。
  4. 在使用完邏輯字體後,呼叫DeleteObject刪除邏輯字體,當字體選入有效的裝置內容時,不要刪除字體,也不要刪除備用字體

GetTextFace

函式使程式能夠確定目前選

入裝置內容的字體名稱:

<span style="font-size:18px;">1.	GetTextFace (hdc, sizeof (szFaceName) / sizeof (TCHAR), szFaceName) ;  </span>

詳細的字體資訊可以從GetTextMetrics中得到:

<span style="font-size:18px;">1.  GetTextMetrics (hdc, &textmetric) ;  </span>

其中,textmetric是TEXTMETRIC型態的變數,它具有20個欄位。

稍後我將詳細討論LOGFONT和TEXTMETRIC結構的欄位,這兩個結構有一些相似的欄位,所以它們容易混淆。現在您只需記住,LOGFONT用於定義邏輯字體,而TEXTMETRIC用於取得目前選入裝置內容中的字體資訊。

 

.....未完待續,文章鏈接:http://www.verydemo.com/demo_c173_i71344.html

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章