文字对话框

字体对话框的作用是用来选择字体。MFC使用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工程,FontDlg。
2.在自动生成的主对话框中,添加一个按钮,ID设为IDC_BTN_FONT,Caption设为“选择”,用于显示字体对话框来选择字体,再添加一个编辑框,ID设为IDC_EDT_FONT,用来以所选字体显示字体名字符串。
3.在FontDlg.h中为FontDlg类添加private成员变量:CFont m_font;,用来保存编辑框中选择的字体。
4.为按钮IDC_BTN_FONT添加点击消息的消息处理函数void CFontDlgDlg::OnBnClickedBtnFont()
5.修改消息处理函数CFontDlgDlg::OnBnClickedBtnFont()如下:

void CFontDlgDlg::OnBnClickedBtnFont()
{
    {  
     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_BTN_FONT)->SetFont(&m_font);
             // 如果用户选择了字体对话框的OK按钮,则获取被选择字体的名称并显示到编辑框里     
             strFontName = fontDlg.m_cf.lpLogFont->lfFaceName;
       SetDlgItemText(IDC_EDT_FONT, strFontName);
         }
     }
}

6.最后,编译运行程序。显示结果对话框:

。。。。。。。。。。。。。。。。。。。。。。。。。结束。。。。。。。。。。。。。。。。。。

 

posted @ 2017-05-14 16:19  gd_沐辰  阅读(898)  评论(0编辑  收藏  举报