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()如下:

 

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.最后,编译运行程序。显示结果对话框,点击“字体选择”按钮,将弹出字体对话框,默认选择为“宋体”,我们改而选择“华文彩云”字体点“确定”,编辑框中会像如下显示:
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值