zoukankan      html  css  js  c++  java
  • (转载)VS2010/MFC编程入门之十八(对话框:字体对话框)

    鸡啄米在上一节为大家讲解了文件对话框的使用,本节则主要介绍字体对话框如何应用。

           字体对话框的作用是用来选择字体。我们也经常能够见到。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++代码
    1. void CExample18Dlg::OnBnClickedFontButton()   
    2. {   
    3.     // TODO: Add your control notification handler code here   
    4.     CString strFontName;    // 字体名称   
    5.     LOGFONT lf;             // LOGFONT变量   
    6.   
    7.     // 将lf所有字节清零   
    8.     memset(&lf, 0, sizeof(LOGFONT));   
    9.   
    10.     // 将lf中的元素字体名设为“宋体”   
    11.     _tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("宋体"));   
    12.        
    13.     // 构造字体对话框,初始选择字体名为“宋体”   
    14.     CFontDialog fontDlg(&lf);   
    15.   
    16.     if (IDOK == fontDlg.DoModal())     // 显示字体对话框   
    17.     {   
    18.         // 如果m_font已经关联了一个字体资源对象,则释放它   
    19.         if (m_font.m_hObject)   
    20.         {   
    21.             m_font.DeleteObject();   
    22.         }   
    23.         // 使用选定字体的LOGFONT创建新的字体   
    24.         m_font.CreateFontIndirect(fontDlg.m_cf.lpLogFont);   
    25.         // 获取编辑框IDC_FONT_EDIT的CWnd指针,并设置其字体   
    26.         GetDlgItem(IDC_FONT_EDIT)->SetFont(&m_font);   
    27.   
    28.         // 如果用户选择了字体对话框的OK按钮,则获取被选择字体的名称并显示到编辑框里   
    29.         strFontName = fontDlg.m_cf.lpLogFont->lfFaceName;   
    30.         SetDlgItemText(IDC_FONT_EDIT, strFontName);   
    31.     }   
    32. }  

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

    VS2010/MFC编程入门之十八(对话框:字体对话框)

           到此,我们又学会了字体对话框的使用,对于以后在界面开发中控制显示的字体很有帮助。有问题欢迎在鸡啄米留言。

    原文地址:http://www.jizhuomi.com/software/175.html

  • 相关阅读:
    C# Json数组序列化和反序列总结
    从Excel文件中读取内容
    JS replace()用法实现replaceAll
    JS 缓存
    JS 从HTML页面获取自定义属性值
    根据IP和端口号异步短时间判断服务器是否链接
    时间戳与时间相互转换(13位)(转)
    JS enter事件及数据不完整阻止下一步操作
    JS 检测浏览器中是否安装了特定的插件
    C# Cache 缓存
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/6705866.html
Copyright © 2011-2022 走看看