1. 程式人生 > >VS2010-MFC(對話框:字體對話框)

VS2010-MFC(對話框:字體對話框)

text 能夠 param truct 修改 lag 定義 技術 dir

轉自:http://www.jizhuomi.com/software/175.html

字體對話框的作用是用來選擇字體。我們也經常能夠見到。MFC使用CFontDialog類封裝了字體對話框的所有操作。字體對話框也是一種模態對話框。

CFontDialog類的構造函數

我們先來了解CFontDialog類。它的常用構造函數原型如下:

CFontDialog(
LPLOGFONT lplfInitial = NULL,
DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
CDC* pdcPrinter = NULL,


CWnd* pParentWnd = NULL
);

參數說明:

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

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

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

pParentWnd:指向字體對話框父窗口的指針。

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

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;

獲取字體對話框中所選字體

我們在字體對話框中選擇了字體後,如何獲取選定的字體呢?我們可以通過CFontDialog類的成員變量m_cf間接獲得選定字體的CFont對象。m_cf是CHOOSEFONT類型的變量,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結構體中有個成員lpLogFont,它是指向LOGFONT結構體變量的指針,就像上面所說,LOGFONT中包含了字體特征,例如,我們可以通過LOGFONT的lfFaceName得知字體名

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

BOOL CreateFontIndirect(const LOGFONT* lpLogFont );

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

字體對話框應用實例

雞啄米給大家做一個字體對話框的實例。先介紹此實例要實現的功能,生成一個對話框,對話框中放置一個“字體選擇”按鈕和一個編輯框。點擊“字體選擇”按鈕將彈出字體對話框。編輯框用於顯示所選字體名,並以選定的字體來顯示字體名字符串,例如,如果選擇了宋體,則在編輯框中以宋體顯示字符串“宋體”。

以下是創建此實例的步驟:

1.創建一個基於對話框的MFC工程,名字為“Example18”。

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

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

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

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

C++代碼
void CExample18Dlg::OnBnClickedFontButton()   
{   
    // TODO: Add your control notification handler code here   
    CString strFontName;    // 字體名稱   
    LOGFONT lf;             // LOGFONT變量   
  
    // 將lf所有字節清零   
    memset(&lf, 0, sizeof(LOGFONT));   
  
    // 將lf中的元素字體名設為“宋體”   
    _tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("宋體"));   
       
    // 構造字體對話框,初始選擇字體名為“宋體”   
    CFontDialog fontDlg(&lf);   
  
    if (IDOK == fontDlg.DoModal())     // 顯示字體對話框   
    {   
        // 如果m_font已經關聯了一個字體資源對象,則釋放它   
        if (m_font.m_hObject)   
        {   
            m_font.DeleteObject();   
        }   
        // 使用選定字體的LOGFONT創建新的字體   
        m_font.CreateFontIndirect(fontDlg.m_cf.lpLogFont);   
        // 獲取編輯框IDC_FONT_EDIT的CWnd指針,並設置其字體   
        GetDlgItem(IDC_FONT_EDIT)->SetFont(&m_font);   
  
        // 如果用戶選擇了字體對話框的OK按鈕,則獲取被選擇字體的名稱並顯示到編輯框裏   
        strFontName = fontDlg.m_cf.lpLogFont->lfFaceName;   
        SetDlgItemText(IDC_FONT_EDIT, strFontName);   
    }   
}  

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

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

到此,我們又學會了字體對話框的使用,對於以後在界面開發中控制顯示的字體很有幫助。

VS2010-MFC(對話框:字體對話框)