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

    }   

}

猜你喜欢

转载自blog.csdn.net/qq_38149046/article/details/81118050