轉(zhuǎn)帖|使用教程|編輯:鮑佳佳|2021-07-01 15:56:12.287|閱讀 423 次
概述:上一節(jié)中講了MFC異常處理,本節(jié)的主要內(nèi)容是字體CFont類。我們?cè)贛FC開(kāi)發(fā)中經(jīng)常會(huì)使用GDI來(lái)輸出文本或圖形圖像(當(dāng)然現(xiàn)在也有了GDI+,本教程主要講解GDI)。文本實(shí)際上就是一種特殊的圖形,它只不過(guò)是根據(jù)事先指定的“字體”繪制出來(lái)的圖形。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷售中 >>
相關(guān)鏈接:
上一節(jié)中講了,本節(jié)的主要內(nèi)容是字體CFont類。在內(nèi)容開(kāi)始前為大家介紹兩款MFC界面開(kāi)發(fā)控件:
字體簡(jiǎn)介
GDI(Graphics Device Interface),圖形設(shè)備接口,是Windows提供的一些函數(shù)和結(jié)構(gòu),用于在顯示器和打印機(jī)上顯示圖形。我們?cè)陂_(kāi)發(fā)中經(jīng)常會(huì)使用GDI來(lái)輸出文本或圖形圖像(當(dāng)然現(xiàn)在也有了GDI+,本教程主要講解GDI)。文本實(shí)際上就是一種特殊的圖形,它只不過(guò)是根據(jù)事先指定的“字體”繪制出來(lái)的圖形。
字體通常用來(lái)為字符集中每一個(gè)字符,如字母、數(shù)字、標(biāo)點(diǎn)符號(hào)等,指定其形狀等外表特征。窗口創(chuàng)建后,如果沒(méi)有專門(mén)指定,一般會(huì)采用系統(tǒng)字體作為默認(rèn)字體。我們可以使用API函數(shù)GetStockObject(SYSTEM_FONT)獲得系統(tǒng)字體的句柄。
CFont類
CFont類封裝了一個(gè)Windows圖形設(shè)備接口(GDI)字體,并為操作字體提供了成員函數(shù)。
為了使用CFont對(duì)象,首先構(gòu)造一個(gè)CFont對(duì)象,再通過(guò)調(diào)用CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect將一個(gè)Windows字體與此CFont對(duì)象關(guān)聯(lián),然后使用此CFont對(duì)象的成員函數(shù)就可以操作字體了。
一般使用CreatePointFont或CreatePointFontIndirect比使用CreateFont或CreateFontIndirect要更簡(jiǎn)便,因?yàn)榍皟烧邥?huì)自動(dòng)的將字體高度的單位由點(diǎn)轉(zhuǎn)換為邏輯單位。
注:“點(diǎn)”是傳統(tǒng)計(jì)量字大小的單位,是從英文Point來(lái)的,一般用小寫(xiě)p表示,俗稱“磅”。其換算關(guān)系為:1p=0.35146mm≈0.35mm,1英寸=72p。
先簡(jiǎn)單解釋下下面用到的幾個(gè)概念:
設(shè)備上下文是包含某個(gè)設(shè)備(如顯示器、打印機(jī))的繪制屬性信息的Windows數(shù)據(jù)結(jié)構(gòu),有了它就可以在Windows中進(jìn)行與設(shè)備無(wú)關(guān)的繪圖,而不用考慮此設(shè)備是顯示器還是打印機(jī)等。CDC類就是設(shè)備上下文類。
在繪圖時(shí)還經(jīng)常會(huì)提到邏輯和物理,例如邏輯單位、物理單位,通俗點(diǎn)說(shuō),邏輯的就是與具體設(shè)備無(wú)關(guān)的,甚至我們可以自定義,物理的就是由具體設(shè)備決定的了。
CFont類為字體的操作提供了幾個(gè)成員函數(shù),下面是對(duì)其各個(gè)成員函數(shù)的詳細(xì)介紹。
1、CFont( );
構(gòu)造一個(gè)CFont對(duì)象。此對(duì)象在使用之前應(yīng)該先使用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
);
通過(guò)指定的一些特征初始化CFont對(duì)象。下面分別介紹每個(gè)參數(shù):
nHeight:指定字體高度(邏輯單位)。有三種取值:>0,字體映射器將高度值轉(zhuǎn)換為設(shè)備單位,并與可用字體的字符元高度進(jìn)行匹配;=0,字體映射器使用默認(rèn)的高度值;<0,字體映射器將高度值轉(zhuǎn)換為設(shè)備單位,用其絕對(duì)值與可用字體的字符高度進(jìn)行匹配。nHeight轉(zhuǎn)換后的絕對(duì)值不應(yīng)超過(guò)16384個(gè)設(shè)備單位。
nWidth:指定字體中字符的平均寬度(邏輯單位)。
nEscapement:指定偏離垂線和顯示界面X軸之間的角度,以十分之一度為單位。偏離垂線是穿過(guò)一行文本中第一個(gè)字符和最后一個(gè)字符的直線。
nOrientation:指定每個(gè)字符的基線和設(shè)備X軸之間的角度,以十分之一度為單位。
nWeight:指定字體磅數(shù)(每1000點(diǎn)中墨點(diǎn)像素?cái)?shù))。可取0到1000之間的任意整數(shù)值。
bItalic:指定字體是否為斜體。
bUnderline:指定字體是否帶有下劃線。
bStrikeOut:指定字體是否帶有刪除線。
nCharSet:指定字體的字符集。預(yù)定義的字符集:
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。韓國(guó)Windows:JOHAB_CHARSET;中東地區(qū)Windows:HEBREW_CHARSSET,ARABIC_CHARSET;泰國(guó)Windows:THAI_CHARSET。應(yīng)用程序可以使用DEFAULT_CHARSET以允許字體名和大小完全指定邏輯字體,如果指定的字體名不存在則可能會(huì)用任意字符集的字體來(lái)代替,所以為避免不可預(yù)料的結(jié)果,應(yīng)謹(jǐn)慎使用DEFAULT_CHARSET。
nOutPrecision:指定輸出精度。輸出精度定義了輸出與要求的字體高度、寬度、字符方向、移位和間距等的接近程度。它的取值及含義如下(只能取其一): 
OUT_CHARACTER_PRECIS;未用。
OUT_DEFAULT_PRECIS:指定缺省的字體映射器狀態(tài)。
OUT_DEVICE_PRECIS:在當(dāng)系統(tǒng)里有多種字體使用同一個(gè)名字時(shí)指示字體映射器選擇一種設(shè)備字體。
OUT_OUTLINE_PRCIS:在Windows NT中此值指示字體映射器從TrueType和其他基于邊框的字體中選擇。
OUT_RASTER_PRECIS:在當(dāng)系統(tǒng)里有多種字體使用同一個(gè)名字時(shí)指示字體映射器選擇一種光柵字體。
OUT_STRING_PRECIS:此值沒(méi)有被字體映射器使用,但是當(dāng)列舉光柵字體時(shí)它會(huì)被返回。
OUT_STROKE_PRECIS:沒(méi)有被字體映射器使用,但是當(dāng)列舉TrueType字體、其他基于邊框的字體和向量字體時(shí)它會(huì)被返回。
OUT_TT_ONLY_PRECIS:指示字體映射器僅從TrueType字體中選擇,如果系統(tǒng)中沒(méi)有安裝TrueType字體,則字體映射返回缺省狀態(tài)。
OUT_TT_PRECIS:在當(dāng)系統(tǒng)里有多種同名的字體時(shí)指示字體映射器選擇一種TrueType字體。當(dāng)操作系統(tǒng)含有多種與指定名字同名的字體時(shí),應(yīng)用程序可以使用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS和OUT_TT_PRECIS值來(lái)控制字體映射器如何選擇一種字體,例如,如果操作系統(tǒng)含有名字Symbol的光柵和TrueType兩種字體,指定OUT_TT_PRECIS使字體映射器選擇TrueType方式(指定OUT_TT_ONLY_PRECIS強(qiáng)制字體映射器選擇一種TrueType字體,盡管這會(huì)給TrueType字體換一個(gè)名字)。
nClipPrecision:指定裁剪精度。裁剪精度定義了怎樣裁剪部分超出裁剪區(qū)域的字符。它的取值及含義如下(可取一個(gè)或多個(gè)值):
CLIP_DEFAULT_PRECIS:指定缺省裁剪狀態(tài)。
CLIP_CHARACTER_PRECIS:未用。
CLIP_STROKE_PRECIS:未被字體映射器使用,但是當(dāng)列舉光柵字體、向量字體或TrueType字體時(shí)它會(huì)被返回。在Windows環(huán)境下,為保證兼容性,當(dāng)列舉字體時(shí)這個(gè)值總被返回。
CLIP_MASK:未用。
CLIP_EMBEDDED:要使用嵌入式只讀字體必須使用此標(biāo)志。
CLIP_LH_ANGLES:當(dāng)此值被使用時(shí),所有字體的旋轉(zhuǎn)依賴于坐標(biāo)系統(tǒng)的定位是朝左的還是朝右的。如果未使用此值,設(shè)備字體總是逆時(shí)針?lè)较蛐D(zhuǎn),但其他字體的旋轉(zhuǎn)依賴于坐標(biāo)系統(tǒng)的定向。
CLIP_TT_ALWAYS:未用。
nQuality:指定字體的輸出質(zhì)量。輸出質(zhì)量定義了GDI將邏輯字體屬性匹配到實(shí)際物理字體的細(xì)致程度。它的各個(gè)取值及含義如下(取其一):
DEFAULT_QUALITY:字體的外觀不重要。
DRAFT_QUALITY:字體外觀的重要性次于使用PROOF_QUALITY時(shí),對(duì)GDI光柵字體,縮放比例是活動(dòng)的,這意味著多種字體大小可供選擇,但質(zhì)量可能不高,如果有必要,粗體、斜體、下劃線、strikeout字體可被綜合起來(lái)使用。
PROOF_QUALITY:字符質(zhì)量比精確匹配邏輯字體字體屬性更重要。對(duì)GDI掃描字體,縮放比例是活動(dòng)的,并選擇最接近的大小。盡管當(dāng)使用PROOF_QUALITY時(shí),選擇字體大小并不完全匹配,但字體的質(zhì)量很高,并沒(méi)有外觀上的變形。如果有必要,粗體、斜體、下劃線、strikeout字體可被綜合起來(lái)使用。
nPitchAndFamily:指定字體間距和字體族。低2位用來(lái)指定字體的間距,可取下列值中的一個(gè):DEFAULT_PITCH,F(xiàn)IXED_PITCH,VARIABLE_PITCH。高4位指定字體族,取值及含義如下(取其一):
FF_DECORATIVE:新奇的字體,如老式英語(yǔ)(Old English)。
FF_DONTCARE:不關(guān)心或不知道。
FF_MDERN:筆劃寬度固定的字體,有或者無(wú)襯線。如Pica、Elite和Courier New。
FF_ROMAN:筆劃寬度變動(dòng)的字體,有襯線。如MS Serif。
FF_SCRIPT:設(shè)計(jì)成看上去象手寫(xiě)體的字體。如Script和Cursive。
FF_SWISS:筆劃寬度變動(dòng)的字體,無(wú)斜線。如MS Sans Serif。
應(yīng)用程序可以用運(yùn)算符OR將字符間距和字體族組合起來(lái)給nPitchAndFamily賦值。
字體族描述一種字體的普通外觀,當(dāng)所有的精確字樣都不能使用時(shí),可用它們來(lái)指定字體。
lpszFacename:指定字體的字樣名的字符串。此字符串的長(zhǎng)度不應(yīng)超過(guò)30個(gè)字符。Windows函數(shù)EnumFontFamilies可以枚舉出當(dāng)前所有可用字體的字樣名。如果lpszFacename為NULL,則GDI使用一種與設(shè)備無(wú)關(guān)的字體。
返回值:此函數(shù)成功則返回TRUE,否則返回FALSE。
CreateFont函數(shù)初始化CFont對(duì)象后,此字體就能夠被選作任何設(shè)備上下文的字體了。此函數(shù)并不會(huì)創(chuàng)建一個(gè)新的Windows GDI字體,只是從GDI的物理字體中選擇了一個(gè)最匹配的字體。在創(chuàng)建一個(gè)邏輯字體時(shí),大部分參數(shù)可以使用默認(rèn)值,但一般情況下都會(huì)給出參數(shù)nHeight和lpszFacename的指定值,如果沒(méi)有給nHeight和lpszFacename參數(shù)設(shè)定取值,則創(chuàng)建的邏輯字體與設(shè)備相關(guān)。當(dāng)使用CreateFont函數(shù)初始化一個(gè)CFont對(duì)象完成后,就能夠使用CDC::SelectObject函數(shù)來(lái)為設(shè)備上下文選擇字體了,并且還能夠在不再使用此CFont對(duì)象時(shí)刪除它。
3、BOOL CreateFontIndirect(const LOGFONT* lpLogFont);
通過(guò)一個(gè)LOGFONT結(jié)構(gòu)體變量給出的特征來(lái)初始化CFont對(duì)象。參數(shù)lpLogFont是指向LOGFONT結(jié)構(gòu)體變量的指針,此LOGFONT結(jié)構(gòu)體變定義了邏輯字體的特征。LOGFONT結(jié)構(gòu)體的定義可以參見(jiàn)VS2010/MFC編程入門(mén)之十八(對(duì)話框:字體對(duì)話框)。
4、BOOL CreatePointFont(int nPointSize,LPCTSTR lpszFaceName,CDC* pDC = NULL);
此函數(shù)提供了一種由指定字樣和點(diǎn)數(shù)創(chuàng)建字體的簡(jiǎn)單方式。參數(shù)的意義如下:
nPointSize:指定字體高度,以十分之一點(diǎn)為單位。例如,nPointSize為120則表示是12點(diǎn)的字體。
lpszFacename:指定字體的字樣名的字符串。此字符串的長(zhǎng)度不應(yīng)超過(guò)30個(gè)字符。Windows函數(shù)EnumFontFamilies可以枚舉出當(dāng)前所有可用字體的字樣名。如果lpszFacename為NULL,則GDI使用一種與設(shè)備無(wú)關(guān)的字體。
pDC:指向CDC對(duì)象,用來(lái)將nPointSize指定的高度轉(zhuǎn)換為邏輯單位,如果為NULL,則使用屏幕設(shè)備上下文進(jìn)行轉(zhuǎn)換。
5、BOOL CreatePointFontIndirect(const LOGFONT* lpLogFont,CDC* pDC = NULL);
此函數(shù)是通過(guò)指定的字樣和點(diǎn)數(shù)創(chuàng)建字體的間接方式。參數(shù)lpLogFont指向一個(gè)LOGFONT結(jié)構(gòu)體變量,此LOGFONT變量定義了邏輯字體的特征,它的lfHeight成員以十分之一點(diǎn)為單位,而不是邏輯單位。參數(shù)pDC指向CDC對(duì)象,用來(lái)將lfHeight表示的高度轉(zhuǎn)換為邏輯單位,如果為NULL,則使用屏幕設(shè)備上下文進(jìn)行轉(zhuǎn)換。
此函數(shù)與CreateFontIndirect很相似,但區(qū)別是LOGFONT變量中l(wèi)fHeight成員的單位是十分之一點(diǎn)而不是邏輯單位。
6、static CFont* PASCAL FromHandle(HFONT hFont);
由Windows GDI字體的HFONT句柄獲得相應(yīng)的CFont對(duì)象指針。參數(shù)hFont是一個(gè)Windows字體的HFONT句柄。成功則返回CFont對(duì)象的指針,否則返回NULL。
7、int GetLogFont(LOGFONT * pLogFont);
獲取CFont對(duì)象的LOGFONT結(jié)構(gòu)體的拷貝。參數(shù)pLogFont指向用來(lái)接收字體信息的LOGFONT結(jié)構(gòu)體變量。成功則返回非零值,否則返回零。
本節(jié)內(nèi)容稍顯枯燥,首次學(xué)習(xí)可以先大致看下,學(xué)習(xí)了后面的字體使用再回過(guò)來(lái)細(xì)看也是可以的。
轉(zhuǎn)載自:本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: