MFC——字體對話框

3.字體對話框

CFontDialog類的構造函數

3.1構造函數原型如下:

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;

 

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

       我們在字體對話框中選擇了字體後,如何獲取選定的字體呢?我們可以通過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對象了。

3.3 字體對話框應用實例

 

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

修改消息處理函數OnBnClickedFontButton()

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);   

    }   

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章