【MFC】MFC改變對話框中靜態文本的字體大小


MFC改變對話框中靜態文本的字體大小
2010/08/09 11:30

 

VC的對話框字體設置對所有控件都有效,你不能單獨地改變某個靜態文本的字體。對於你的問題,需要首先用CreateFont來建立一個字體對象,然后調用控件的SetFont,就可以了。 
例子: 
1、改靜態文體的ID,如:IDC_STATIC1 
2、添加一個Edit控件,建立一個關聯的控件m_editControl。 
3、在OnInitDialog中添加如下代碼: 
CFont * f; 
f = new CFont; 
f->CreateFont(16,            // nHeight 
     0,           // nWidth 
     0,           // nEscapement 
     0,           // nOrientation 
     FW_BOLD,     // nWeight 
     TRUE,        // bItalic 
     FALSE,       // bUnderline 
     0,           // cStrikeOut 
     ANSI_CHARSET,              // nCharSet 
     OUT_DEFAULT_PRECIS,        // nOutPrecision 
     CLIP_DEFAULT_PRECIS,       // nClipPrecision 
     DEFAULT_QUALITY,           // nQuality 
     DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
     _T("Arial"));              // lpszFac

m_editControl.SetFont(f); 
m_editControl.SetWindowText("問專家"); 
GetDlgItem(IDC_STATIC1)->SetFont(f);

運行結果如下圖所示,下載完整例子 CtrlFont.zip

需要注意的是,這里我們使用的是CFont指針,而不是普通的CFont局部變量,如果把程序改成下面這樣: 
CFont f; 
f.CreateFont(16,             // nHeight 
     0,           // nWidth 
     0,           // nEscapement 
     0,           // nOrientation 
     FW_BOLD,     // nWeight 
     TRUE,        // bItalic 
     FALSE,       // bUnderline 
     0,           // cStrikeOut 
     ANSI_CHARSET,              // nCharSet 
     OUT_DEFAULT_PRECIS,        // nOutPrecision 
     CLIP_DEFAULT_PRECIS,       // nClipPrecision 
     DEFAULT_QUALITY,           // nQuality 
     DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
     _T("Arial"));

m_editControl.SetFont(&f); 
m_editControl.SetWindowText("問專家"); 
GetDlgItem(IDC_STATIC1)->SetFont(&f);

運行后就得不到想要的效果了,因為OnInitDialog函數執行完畢,CFont f就會被清除。必須保證SetFont設置的字體對象在對話框關閉前一直有效。所以通常是使用指針或類成員的方式來保存所建立的字體對象。 
非MFC程序,首先用CreateFont來建立一個字體句柄,然后再用SendMessage發給控件WM_SETFONT消息,將建立的字體句柄賦值過去,就可以了。

cHeight是字體的高度。
cWidth是字體的寬度。
cEscapement是字體的傾斜角。
cOrientation是字體的傾斜角。
cWeight是字體的粗細。
bItalic是字體是否斜體。
bUnderline是字體是否有下划線。
bStrikeOut是字體是否有刪除線。
iCharSet是字體使用的字符集。
iOutPrecision是指定如何選擇合適的字體。
iClipPrecision是用來確定裁剪的精度。
iQuality是怎么樣跟選擇的字體相符合。

iPitchAndFamily是間距標志和屬性標志。

pszFaceName是字體的名稱。

CreateFont()函數的MSDN翻譯

函數功能:該函數創建一種有特殊性的邏輯字體,此邏輯字體可以在后面被任何設備選擇。

    函數原型:HFONT CreateFont(int nHeight, 
                           int nWidth, 
                           int nEscapement, 
                           int nOrientation, 
                           int fnWeight, 
                           DWORD fdwltalic, 
                           DWORD fdwUnderline, 
                           DWORD fdwStrikeOut, 
                           DWORD fdwCharSet, 
                           DWORD fdwOutputPrecision, 
                           DWORD fdwClipPrecision, 
                           DWORD fdwQuality, 
                           DWORD fdwPitchAndFamily, 
                           LPCTSTR lpszFace);

    nHeight:指定字體的字符單元或字符的邏輯單位高度,字符的高度值(也被稱為em高度)是指字符單元高度值減去內部標頭值。字體映射器以如下方式解釋nHeight指定的值,各值含義為:

    >0:字體映射器轉換這個值以設備單位,並和已有字體的單元高度相匹配。

    0:字體映射器轉換在選擇匹配時用一個缺省的高度值。

    <0:字體映射器轉換這個值到設備單位,並將它的絕對值和已有字體的字符高度相匹配。

    比較所有的高度,字體映射器選擇不超過要求大小的最大字體。

    此映射當字體第一次被使用時發生。

    對於MM_TEXT映射方式,可以用下面的公式為一種指定了點大小的字體確定高度:

    nHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY),72)

    nWidth:指定所要求字體的字符的邏輯單位的平均寬度。如果此值為0,字體映射器選擇一個closest match值,closest match值是由比較當前設備的特征系數與可使用字體的數字化特征系數之差的絕對值而確定的。

    nEscapement:指定移位向量和設備X軸之間的一個角度,以十分之一度為單位。移位向量平行於正文行的基線。

    Windows NT:當圖形設備設置為GM_ADVANCED時,可以不依賴字符串的字符的定位角而指定字符串的移位角。

    當圖形模式被設置為GM_COMPATIBLE時,nEscapement同時指定移位角和定位角,可以設置nEscapement和nOrientation為相同的值。

    Windows 95:nEscapement同時指定移位角和定位角,可設置nEscapement和nOrientation為相同的值。

    nOrientation:指定每個字符的基線和設備X軸之間的角度。

    FnWeight:在0到1000之間指定字體的權值,如400表示標准體,700表示黑(粗)體,如果此值為0,則使用缺省的權值。

    為方便定義,可使用如下值:

    FW_DONTCARE:0;FW_THIN;100;FW_EXTRALIGHT;200;FW_ULTRALIGHT;200;FW_LIGHT;300;

    FW_NORMAL:400;FW_REGULAR;400;FW_MEDIUM;500;FW_SEMIBOLD;600;FW_DEMIBOLD;600;

    FW_BOLD:700;FW_EXTRABOLD;800;FW_ULTRABOLD;800;FW_HEAVY;900;FW_BLACK;900。

    fdwItalic:如果設置為TRUE則指定斜體。

    fdwUnderline:如果設置為TRUE,則指定加下划線的字全。

    fdwStrikeOut:如果設置為TRUE,則strikeout指定字體。

    fdwCharSet:指定字符集,下列值是預定義的:

    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;

    中東地區Windows:HEBREW_CHARSSET; ARABIC_CHARSET

    泰國Windows:THAI_CHARSET

    OEM_CHARSET指定的字符集與操作系統有關。

    可以使用DEFAULT_CHARSET值來允許字體的名字和大小來充分描述邏輯字體。如果指定的字體名不存在,任何字符集的字體都可以替代指定的字體,所以應該小心地用DEFAULT_CHARSET來避免不期望的結果出現。

    操作系統中存在其他字符集的字體。如果一個應用程序用一種未知字符集的字體,則應用程序不會試圖去翻譯或解釋用那種字體寫出來的字符串。

    在字體映射過程中此參數很重要。為確保獲得一致的結果,指定一個特殊的字符集。如果在lpszFace參數中指定了一個字體名,確定fdwCharSet值與由lpszFace指定的字體字符集是否匹配。

    fdwOutputPrecision:指定輸出精度,輸出精度義輸出與要求的字體高度、寬度、字符定位、移位、字符間距和字符類型的匹配程序,它可取下列值之一:

    OUT_CHARACTER_PRECIS;未用。

    OUT_DEFAULT_PRECIS:指定缺省的字體映射器狀態。

    OUT_DEVICE_PRECIS:指示字體映射器在當系統里有多種字體使用同一個字體使用同一個名字時選擇一種設備字體。

    OUT_OUTLINE_PRCIS:在Windows NT中此值指示字體映射器從TrueType和其他基於邊框的字體中選擇。

    OUT_RASTER_PRECIS:指示字體映射器在當系統里有多種字體使用同一個名字時選擇一種光柵字體。

    OUT_STRING_PRECIS:此值沒有被字全映射器使用,但是當掃描字體被列舉時作為返回值。

    OUT_STROKE_PRECIS:在Windows NT中此值沒有被字體映射器使用,但是當TrueType字體、其他基於邊框的字體和向量字體被列舉時,作為返回值。

    Windows 95:此值沒有被字體映射器使用,但是當TrueType字體或向量字體被列舉時,作為返回值。

    OUT_TT_ONLY_PRECIS:指示字體映射器僅從TrueType字體中選擇,如果系統中沒有安裝TrueType字體,則字體映射返回缺省狀態。、

    OUT_TT_PRECIS:指示字體映射器在當系統里有多種同名的字體時選擇一種TrueType字體。

    當操作系統含有多種與指定名字同名的字體時,應用程序可以使用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS和OUT_TT_PRECIS值來控制字體映射器如何選擇一種字體,例如,如果操作系統含有名字Symbol的光柵和TrueType兩種字體,指定OUT_TT_PRECIS使字體映射器選擇TrueType方式。指定OUT_TT_ONLY_PRECIS使字體映射器選擇一種TrueType字體,盡管這會給TrueType字體換一個名字。

    fdwClipPrecision;指定裁剪精度,裁剪精度定義如何裁剪部分超出裁剪區的字符,它可取一個或多個下列值:

    CLIP_DEFAULT_PRECIS:指定缺省裁剪狀態。CLIP_CHARACTER_PRECIS:未用。

    CLIP_STROKE_PRECIS:未被字體映射器使用,但是當光柵字體、向量字體或TrueType字體被列舉時作為返回值。在Windows環境下,為保證兼容性,當列舉字體時這個值總被返回。

    CLIP_MASK:未用。CLIP_EMBEDDED:要使用嵌入式只讀字體必須使用此標志。

    CLIP_LH_ANGLES:當此值被使用時,所有字體的旋轉依賴於坐標系統的定位是朝左的還是朝右的。

    如果未使用此值,設備字體總是逆時針方向旋轉,但其他字體的旋轉依賴於坐標系統的定向。要得到更多關於坐標系統定向的信息,參見參數orientation。

    CLIP_TT_ALWAYS:未用。

    fdwQuality:指向輸出質量,輸出質量定義GDI如何仔細地將邏輯字體屬性與實際物理字體屬性相匹配。它可取下列值之一:

    DEFAULT_QUALITY:字體的外觀不重要。

    DRAFT_QUALITY:字體外觀的重要性次於使用PROOF_QUALITY時,對GDI光柵字體,縮放比例是活動的,這意味着多種字體大小可供選擇,但質量可能不高,如果有必要,粗體、斜體、下划線、strikeout字體可被綜合起來使用。

    PROOF_QUALITY:字符質量比精確匹配邏輯字體字體屬性更重要。對GDI掃描字體,縮放比例是活動的,並選擇最接近的大小。盡管當使用PROOF_QUALITY時,選擇字體大小並不完全匹配,但字體的質量很高,並沒有外觀上的變形。如果有必要,粗體、斜體、下划線、strikeout字體可被綜合起來使用。

    fdwPitchAndFamily:指定字體間距和字體族,低端二位指定字體的字符間距,它可取下列值之一:

    DEFAULT_PITCH;FIXED_PITCH; VARIABLE_PITCH

    高端四位指定字體族,可取下列值之一:

    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將字符間距和字體族組合起來給fdwPitchAndFamily賦值。

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

    lpszface:指向指定字體的字樣名的、以/0結束的字符串指針,字符串的長度不能超過32個字符(包括字符/0),函數EnumFontFamilies可用來列舉所有當前可用字體的字樣名。

    如果lpszFace為NULL或指向一個空串,GDI使用能匹配其他屬性的第一種字體。

    返回值:如果函數調用成功,返回值是一種邏輯字體句柄;如果函數調用失敗,返回值為NULL。

    Windows NT:若想獲得更多錯誤信息,請調用GetLastError函數。

    備注:當一種字體不再使用時,可用DeleteObject來刪除。

    為保護那些提供字體給Windows和Windows NT的賣主的版權,基於Win32的應用程序總是列出所選擇字體的准確名字。由於不同的系統會使用不同的字體,不要認為所選擇字體就是要求的字體。例如,如果要求名叫Palatino的字體,但系統沒提供那樣一種字體,則字體映射器將會以一種不同名但有相似屬性的字體取而代之。系統總是將用戶選擇的字體名報告出來。

    速查:Windows NT:3.1及以上版本;Windows


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM