我們先來(lái)了解CFontDialog類(lèi)。它的常用構造函數原型如下:

CFontDialog(
   LPLOGFONT lplfInitial = NULL,
   DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
   CDC* pdcPrinter = NULL,
   CWnd* pParentWnd = NULL
);

       參數說(shuō)明:

       lplfInitial:指向LOGFONT結構體數據的指針,可以通過(guò)它設置字體的一些特征。

       dwFlags:指定選擇字體的一個(gè)或多個(gè)屬性,詳情可在MSDN中查閱。

       pdcPrinter:指向一個(gè)打印設備上下文的指針。

       pParentWnd:指向字體對話(huà)框父窗口的指針。

       上面的構造函數中第一個(gè)參數為L(cháng)OGFONT指針,LOGFONT結構體中包含了字體的大部分特征,包括字體高度、寬度、方向、名稱(chēng)等等。下面是此結構體的定義:

typedef struct tagLOGFONT {
    LONG lfHeight;
    LONG lfWidth;
    LONG lfEscapement;
    LONG lfOrientation;
    LONG lfWeight;
    BYTE lfItalic;
    BYTE lfUnderline;
    BYTE lfStrikeOut;
    BYTE lfCharSet;
    BYTE lfOutPrecision;
    BYTE lfClipPrecision;
    BYTE lfQuality;
    BYTE lfPitchAndFamily;
    TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;

       獲取字體對話(huà)框中所選字體

       我們在字體對話(huà)框中選擇了字體后,如何獲取選定的字體呢?我們可以通過(guò)CFontDialog類(lèi)的成員變量m_cf間接獲得選定字體的CFont對象。m_cf是CHOOSEFONT類(lèi)型的變量,CHOOSEFONT結構體定義如下:

typedef struct {
    DWORD lStructSize;
    HWND hwndOwner;
    HDC hDC;
    LPLOGFONT lpLogFont;
    INT iPointSize;
    DWORD Flags;
    COLORREF rgbColors;
    LPARAM lCustData;
    LPCFHOOKPROC lpfnHook;
    LPCTSTR lpTemplateName;
    HINSTANCE hInstance;
    LPTSTR lpszStyle;
    WORD nFontType;
    INT nSizeMin;
    INT nSizeMax;
} CHOOSEFONT, *LPCHOOSEFONT;

       CHOOSEFON結構體中有個(gè)成員lpLogFont,它是指向LOGFONT結構體變量的指針,就像上面所說(shuō),LOGFONT中包含了字體特征,例如,我們可以通過(guò)LOGFONT的lfFaceName得知字體名。

       我們最終要獲得的是所選擇字體的CFont對象,有了字體的LOGFONT怎樣獲得對應的CFont對象呢?使用CFont類(lèi)的成員函數CreateFontIndirect可以達到此目的。函數原型如下:

       BOOL CreateFontIndirect(const LOGFONT* lpLogFont );

       參數是LOGFONT指針類(lèi)型,我們可以傳入CFontDialog類(lèi)成員變量m_cf的lpLogFont成員,就可以得到所選字體的CFont對象了。

       字體對話(huà)框應用實(shí)例

       雞啄米給大家做一個(gè)字體對話(huà)框的實(shí)例。先介紹此實(shí)例要實(shí)現的功能,生成一個(gè)對話(huà)框,對話(huà)框中放置一個(gè)“字體選擇”按鈕和一個(gè)編輯框。點(diǎn)擊“字體選擇”按鈕將彈出字體對話(huà)框。編輯框用于顯示所選字體名,并以選定的字體來(lái)顯示字體名字符串,例如,如果選擇了宋體,則在編輯框中以宋體顯示字符串“宋體”。

       以下是創(chuàng )建此實(shí)例的步驟:

       1.創(chuàng )建一個(gè)基于對話(huà)框的MFC工程,名字為“Example18”。

       2.在自動(dòng)生成的主對話(huà)框IDD_EXAMPLE18_DIALOG的模板中,刪除“TODO: Place dialog controls here.”靜態(tài)文本框,添加一個(gè)按鈕,ID設為IDC_FONT_BUTTON,Caption設為“字體選擇”,用于顯示字體對話(huà)框來(lái)選擇字體,再添加一個(gè)編輯框,ID設為IDC_FONT_EDIT,用來(lái)以所選字體顯示字體名字符串。

       3.在Example18Dlg.h中為CExample18Dlg類(lèi)添加private成員變量:CFont m_font;,用來(lái)保存編輯框中選擇的字體。

       4.為按鈕IDC_FONT_BUTTON添加點(diǎn)擊消息的消息處理函數CExample18Dlg::OnBnClickedFontButton()。

       5.修改消息處理函數CExample18Dlg::OnBnClickedFontButton()如下:

C++代碼
  1. void CExample18Dlg::OnBnClickedFontButton()   
  2. {   
  3.     // TODO: Add your control notification handler code here   
  4.     CString strFontName;    // 字體名稱(chēng)   
  5.     LOGFONT lf;             // LOGFONT變量   
  6.   
  7.     // 將lf所有字節清零   
  8.     memset(&lf, 0, sizeof(LOGFONT));   
  9.   
  10.     // 將lf中的元素字體名設為“宋體”   
  11.     _tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("宋體"));   
  12.        
  13.     // 構造字體對話(huà)框,初始選擇字體名為“宋體”   
  14.     CFontDialog fontDlg(&lf);   
  15.   
  16.     if (IDOK == fontDlg.DoModal())     // 顯示字體對話(huà)框   
  17.     {   
  18.         // 如果m_font已經(jīng)關(guān)聯(lián)了一個(gè)字體資源對象,則釋放它   
  19.         if (m_font.m_hObject)   
  20.         {   
  21.             m_font.DeleteObject();   
  22.         }   
  23.         // 使用選定字體的LOGFONT創(chuàng )建新的字體   
  24.         m_font.CreateFontIndirect(fontDlg.m_cf.lpLogFont);   
  25.         // 獲取編輯框IDC_FONT_EDIT的CWnd指針,并設置其字體   
  26.         GetDlgItem(IDC_FONT_EDIT)->SetFont(&m_font);   
  27.   
  28.         // 如果用戶(hù)選擇了字體對話(huà)框的OK按鈕,則獲取被選擇字體的名稱(chēng)并顯示到編輯框里   
  29.         strFontName = fontDlg.m_cf.lpLogFont->lfFaceName;   
  30.         SetDlgItemText(IDC_FONT_EDIT, strFontName);   
  31.     }   
  32. }  

       6.最后,編譯運行程序。顯示結果對話(huà)框,點(diǎn)擊“字體選擇”按鈕,將彈出字體對話(huà)框,默認選擇為“宋體”,我們改而選擇“華文彩云”字體點(diǎn)“確定”,編輯框中會(huì )像如下顯示: