彩票走势图

VS2019/MFC编程入门:字体对话框

转帖|使用教程|编辑:鲍佳佳|2021-02-07 09:54:30.147|阅读 602 次

概述:在上一节为大家讲解了文件对话框的使用,本节则主要介绍字体对话框如何应用。字体对话框的作用是用来选择字体。我们也经常能够见到。MFC使用CFontDialog类封装了字体对话框的所有操作。字体对话框也是一种模态对话框。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

点击下载Xtreme Toolkit Pro最新试用版

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

字体对话框的作用是用来选择字体。我们也经常能够见到。MFC使用CFontDialog类封装了字体对话框的所有操作。字体对话框也是一种模态对话框

Xtreme Toolkit Pro:是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。

点击下载Xtreme Toolkit Pro最新试用版

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++代码

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

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

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

转载自:

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP