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

时间:2024-07-17 08:36:50

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

  字体对话框的作用是用来选择字体。我们也经常能够见到。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 IStructSize;

    HWND hwndOwner;

    HDC hDC;

    LPLOGFONT lpLogFont;

    INT iPointSize;

    DWORD Flags;

    COLORREF rgbColors;

    LPARAM ICustData;

    LPCFHOOKPROC lpfnHook;

    LPCTSTR lpTemplateName;

    HINSTANCE hInstance;

    LPTSTR lpszStyle;

    WORD nFontType;

    INT nSi*;

    INT nSizeMax;

  } CHOOSEFONT, *LPCHOOSEFONT;

  CHOOSEFONT结构体有个成员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:Palce 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++代码:

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

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

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

  到此,我们又学会了字体对话框的使用,对于以后在界面开发中控制显示的字体很有帮助。