字體簡介

       GDI(Graphics Device Interface),圖形設備接口,是Windows提供的一些函數(shù)和結(jié)構,用于在顯示器和打印機上顯示圖形。我們在MFC開發(fā)中經(jīng)常會使用GDI來輸出文本或圖形圖像(當然現(xiàn)在也有了GDI+,本教程主要講解GDI)。文本實際上就是一種特殊的圖形,它只不過是根據(jù)事先指定的“字體”繪制出來的圖形。

       字體通常用來為字符集中每一個字符,如字母、數(shù)字、標點符號等,指定其形狀等外表特征。窗口創(chuàng)建后,如果沒有專門指定,一般會采用系統(tǒng)字體作為默認字體。我們可以使用API函數(shù)GetStockObject(SYSTEM_FONT)獲得系統(tǒng)字體的句柄。

       CFont類

       CFont類封裝了一個Windows圖形設備接口(GDI)字體,并為操作字體提供了成員函數(shù)。

       為了使用CFont對象,首先構造一個CFont對象,再通過調(diào)用CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect將一個Windows字體與此CFont對象關聯(lián),然后使用此CFont對象的成員函數(shù)就可以操作字體了。

       一般使用CreatePointFont或CreatePointFontIndirect比使用CreateFont或CreateFontIndirect要更簡便,因為前兩者會自動的將字體高度的單位由點轉(zhuǎn)換為邏輯單位。

       :“點”是傳統(tǒng)計量字大小的單位,是從英文Point來的,一般用小寫p表示,俗稱“磅”。其換算關系為:1p=0.35146mm≈0.35mm,1英寸=72p。

       先簡單解釋下下面用到的幾個概念:

       設備上下文是包含某個設備(如顯示器、打印機)的繪制屬性信息的Windows數(shù)據(jù)結(jié)構,有了它就可以在Windows中進行與設備無關的繪圖,而不用考慮此設備是顯示器還是打印機等。CDC類就是設備上下文類。

       在繪圖時還經(jīng)常會提到邏輯和物理,例如邏輯單位、物理單位,通俗點說,邏輯的就是與具體設備無關的,甚至我們可以自定義,物理的就是由具體設備決定的了。

       CFont類為字體的操作提供了幾個成員函數(shù),下面是對其各個成員函數(shù)的詳細介紹。

       1、CFont( ); 

       構造一個CFont對象。此對象在使用之前應該先使用CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect初始化。

       2、

BOOL CreateFont(
   int nHeight,
   int nWidth,
   int nEscapement,
   int nOrientation,
   int nWeight,
   BYTE bItalic,
   BYTE bUnderline,
   BYTE cStrikeOut,
   BYTE nCharSet,
   BYTE nOutPrecision,
   BYTE nClipPrecision,
   BYTE nQuality,
   BYTE nPitchAndFamily,
   LPCTSTR lpszFacename
);

       通過指定的一些特征初始化CFont對象。下面分別介紹每個參數(shù):

       nHeight:指定字體高度(邏輯單位)。有三種取值:>0,字體映射器將高度值轉(zhuǎn)換為設備單位,并與可用字體的字符元高度進行匹配;=0,字體映射器使用默認的高度值;<0,字體映射器將高度值轉(zhuǎn)換為設備單位,用其絕對值與可用字體的字符高度進行匹配。nHeight轉(zhuǎn)換后的絕對值不應超過16384個設備單位。

       nWidth:指定字體中字符的平均寬度(邏輯單位)。

       nEscapement:指定偏離垂線和顯示界面X軸之間的角度,以十分之一度為單位。偏離垂線是穿過一行文本中第一個字符和最后一個字符的直線。

       nOrientation:指定每個字符的基線和設備X軸之間的角度,以十分之一度為單位。

       nWeight:指定字體磅數(shù)(每1000點中墨點像素數(shù))。可取0到1000之間的任意整數(shù)值。

       bItalic:指定字體是否為斜體。

       bUnderline:指定字體是否帶有下劃線。

       bStrikeOut:指定字體是否帶有刪除線。

       nCharSet:指定字體的字符集。預定義的字符集:

       ANSI_CHARSET;BALTIC_CHARSET;CHINESEBIG5_CHARSET;DEFAULT_CHARSET;EASTEUROPE_CHARSET; GB2312_CHARSET; GREEK_CHARSET;HANGUL_CHARSET; MAC_CHARSET; OEM_CHARSET; RUSSIAN_CHARSET; SHIFTJIS_CHARSET;SYMBOL_CHARSET; TURKISH_CHARSET。韓國Windows:JOHAB_CHARSET;中東地區(qū)Windows:HEBREW_CHARSSET,ARABIC_CHARSET;泰國Windows:THAI_CHARSET。應用程序可以使用DEFAULT_CHARSET以允許字體名和大小完全指定邏輯字體,如果指定的字體名不存在則可能會用任意字符集的字體來代替,所以為避免不可預料的結(jié)果,應謹慎使用DEFAULT_CHARSET。

       nOutPrecision:指定輸出精度。輸出精度定義了輸出與要求的字體高度、寬度、字符方向、移位和間距等的接近程度。它的取值及含義如下(只能取其一):  

       OUT_CHARACTER_PRECIS;未用。   
       OUT_DEFAULT_PRECIS:指定缺省的字體映射器狀態(tài)。   
       OUT_DEVICE_PRECIS:在當系統(tǒng)里有多種字體使用同一個名字時指示字體映射器選擇一種設備字體。   
       OUT_OUTLINE_PRCIS:在Windows NT中此值指示字體映射器從TrueType和其他基于邊框的字體中選擇。   
       OUT_RASTER_PRECIS:在當系統(tǒng)里有多種字體使用同一個名字時指示字體映射器選擇一種光柵字體。   
       OUT_STRING_PRECIS:此值沒有被字體映射器使用,但是當列舉光柵字體時它會被返回。    
       OUT_STROKE_PRECIS:沒有被字體映射器使用,但是當列舉TrueType字體、其他基于邊框的字體和向量字體時它會被返回?!?br>       OUT_TT_ONLY_PRECIS:指示字體映射器僅從TrueType字體中選擇,如果系統(tǒng)中沒有安裝TrueType字體,則字體映射返回缺省狀態(tài)?! ?br>       OUT_TT_PRECIS:在當系統(tǒng)里有多種同名的字體時指示字體映射器選擇一種TrueType字體。當操作系統(tǒng)含有多種與指定名字同名的字體時,應用程序可以使用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS和OUT_TT_PRECIS值來控制字體映射器如何選擇一種字體,例如,如果操作系統(tǒng)含有名字Symbol的光柵和TrueType兩種字體,指定OUT_TT_PRECIS使字體映射器選擇TrueType方式(指定OUT_TT_ONLY_PRECIS強制字體映射器選擇一種TrueType字體,盡管這會給TrueType字體換一個名字)。

       nClipPrecision:指定裁剪精度。裁剪精度定義了怎樣裁剪部分超出裁剪區(qū)域的字符。它的取值及含義如下(可取一個或多個值):

  CLIP_DEFAULT_PRECIS:指定缺省裁剪狀態(tài)。
       CLIP_CHARACTER_PRECIS:未用。   
       CLIP_STROKE_PRECIS:未被字體映射器使用,但是當列舉光柵字體、向量字體或TrueType字體時它會被返回。在Windows環(huán)境下,為保證兼容性,當列舉字體時這個值總被返回。   
       CLIP_MASK:未用。
       CLIP_EMBEDDED:要使用嵌入式只讀字體必須使用此標志。   
       CLIP_LH_ANGLES:當此值被使用時,所有字體的旋轉(zhuǎn)依賴于坐標系統(tǒng)的定位是朝左的還是朝右的。如果未使用此值,設備字體總是逆時針方向旋轉(zhuǎn),但其他字體的旋轉(zhuǎn)依賴于坐標系統(tǒng)的定向。   
       CLIP_TT_ALWAYS:未用。

       nQuality:指定字體的輸出質(zhì)量。輸出質(zhì)量定義了GDI將邏輯字體屬性匹配到實際物理字體的細致程度。它的各個取值及含義如下(取其一):

       DEFAULT_QUALITY:字體的外觀不重要。   
       DRAFT_QUALITY:字體外觀的重要性次于使用PROOF_QUALITY時,對GDI光柵字體,縮放比例是活動的,這意味著多種字體大小可供選擇,但質(zhì)量可能不高,如果有必要,粗體、斜體、下劃線、strikeout字體可被綜合起來使用。   
       PROOF_QUALITY:字符質(zhì)量比精確匹配邏輯字體字體屬性更重要。對GDI掃描字體,縮放比例是活動的,并選擇最接近的大小。盡管當使用PROOF_QUALITY時,選擇字體大小并不完全匹配,但字體的質(zhì)量很高,并沒有外觀上的變形。如果有必要,粗體、斜體、下劃線、strikeout字體可被綜合起來使用。 

       nPitchAndFamily:指定字體間距和字體族。低2位用來指定字體的間距,可取下列值中的一個:DEFAULT_PITCH,F(xiàn)IXED_PITCH,VARIABLE_PITCH。高4位指定字體族,取值及含義如下(取其一):

       FF_DECORATIVE:新奇的字體,如老式英語(Old English)。
       FF_DONTCARE:不關心或不知道。   
       FF_MDERN:筆劃寬度固定的字體,有或者無襯線。如Pica、Elite和Courier New。   
       FF_ROMAN:筆劃寬度變動的字體,有襯線。如MS Serif。   
       FF_SCRIPT:設計成看上去象手寫體的字體。如Script和Cursive。   
       FF_SWISS:筆劃寬度變動的字體,無斜線。如MS Sans Serif。   

       應用程序可以用運算符OR將字符間距和字體族組合起來給nPitchAndFamily賦值。   

       字體族描述一種字體的普通外觀,當所有的精確字樣都不能使用時,可用它們來指定字體。

       lpszFacename:指定字體的字樣名的字符串。此字符串的長度不應超過30個字符。Windows函數(shù)EnumFontFamilies可以枚舉出當前所有可用字體的字樣名。如果lpszFacename為NULL,則GDI使用一種與設備無關的字體。

       返回值:此函數(shù)成功則返回TRUE,否則返回FALSE。

       CreateFont函數(shù)初始化CFont對象后,此字體就能夠被選作任何設備上下文的字體了。此函數(shù)并不會創(chuàng)建一個新的Windows GDI字體,只是從GDI的物理字體中選擇了一個最匹配的字體。在創(chuàng)建一個邏輯字體時,大部分參數(shù)可以使用默認值,但一般情況下都會給出參數(shù)nHeight和lpszFacename的指定值,如果沒有給nHeight和lpszFacename參數(shù)設定取值,則創(chuàng)建的邏輯字體與設備相關。當使用CreateFont函數(shù)初始化一個CFont對象完成后,就能夠使用CDC::SelectObject函數(shù)來為設備上下文選擇字體了,并且還能夠在不再使用此CFont對象時刪除它。

       3、BOOL CreateFontIndirect(const LOGFONT* lpLogFont);

       通過一個LOGFONT結(jié)構體變量給出的特征來初始化CFont對象。參數(shù)lpLogFont是指向LOGFONT結(jié)構體變量的指針,此LOGFONT結(jié)構體變定義了邏輯字體的特征。LOGFONT結(jié)構體的定義可以參見VS2010/MFC編程入門之十八(對話框:字體對話框)。

       4、BOOL CreatePointFont(int nPointSize,LPCTSTR lpszFaceName,CDC* pDC = NULL);

       此函數(shù)提供了一種由指定字樣和點數(shù)創(chuàng)建字體的簡單方式。參數(shù)的意義如下:

       nPointSize:指定字體高度,以十分之一點為單位。例如,nPointSize為120則表示是12點的字體。

       lpszFacename:指定字體的字樣名的字符串。此字符串的長度不應超過30個字符。Windows函數(shù)EnumFontFamilies可以枚舉出當前所有可用字體的字樣名。如果lpszFacename為NULL,則GDI使用一種與設備無關的字體。

       pDC:指向CDC對象,用來將nPointSize指定的高度轉(zhuǎn)換為邏輯單位,如果為NULL,則使用屏幕設備上下文進行轉(zhuǎn)換。

       5、BOOL CreatePointFontIndirect(const LOGFONT* lpLogFont,CDC* pDC = NULL);

       此函數(shù)是通過指定的字樣和點數(shù)創(chuàng)建字體的間接方式。參數(shù)lpLogFont指向一個LOGFONT結(jié)構體變量,此LOGFONT變量定義了邏輯字體的特征,它的lfHeight成員以十分之一點為單位,而不是邏輯單位。參數(shù)pDC指向CDC對象,用來將lfHeight表示的高度轉(zhuǎn)換為邏輯單位,如果為NULL,則使用屏幕設備上下文進行轉(zhuǎn)換。

       此函數(shù)與CreateFontIndirect很相似,但區(qū)別是LOGFONT變量中l(wèi)fHeight成員的單位是十分之一點而不是邏輯單位。

       6、static CFont* PASCAL FromHandle(HFONT hFont);

       由Windows GDI字體的HFONT句柄獲得相應的CFont對象指針。參數(shù)hFont是一個Windows字體的HFONT句柄。成功則返回CFont對象的指針,否則返回NULL。

       7、int GetLogFont(LOGFONT * pLogFont);

       獲取CFont對象的LOGFONT結(jié)構體的拷貝。參數(shù)pLogFont指向用來接收字體信息的LOGFONT結(jié)構體變量。成功則返回非零值,否則返回零。