字体对话框)

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

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

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

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

VS2010/MFC对话框:字体对话框的更多相关文章

  1. VS2010/MFC:模态对话框及其弹出过程

    模态对话框及其弹出过程 加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益.趁热打铁,这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎 ...

  2. VS2010/MFC编程(对话框:模态对话框及其弹出过程)

    讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出. 一.模态对话框和非模态对话框 Windows对话框分为两类:模态对话框和非模态对话框. 模态对话框是这样的对话框,当它弹出后,本应用程序其 ...

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

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

  4. VS2010/MFC编程入门之十九(对话框:颜色对话框)

    鸡啄米在上一节中为大家讲解了字体对话框的使用方法,熟悉了字体对话框,本节继续讲另一种通用对话框--颜色对话框. 颜色对话框大家肯定也不陌生,我们可以打开它选择需要的颜色,简单说,它的作用就是用来选择颜 ...

  5. VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)

    鸡啄米在上一讲中介绍了MFC的消息映射机制,属于原理方面的知识.对于VC++编程入门学习者来说可能有些抽象,鸡啄米会把消息映射的知识渗透到后面的教程中.本节开始为大家讲解偏应用的知识-创建对话框. 对 ...

  6. 【VS开发】VS2010 MFC中控件、对话框等背景颜色动态修改的方法

    [VS开发]VS2010 MFC中控件.对话框等背景颜色动态修改的方法 标签(空格分隔):[VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明: ...

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

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

  8. 【转】VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下, ...

  9. VS2010/MFC对话框:颜色对话框

    颜色对话框 在上一节中为大家讲解了字体对话框的使用方法,熟悉了字体对话框,本节继续讲另一种通用对话框--颜色对话框. 颜色对话框大家肯定也不陌生,我们可以打开它选择需要的颜色,简单说,它的作用就是用来 ...

随机推荐

  1. QF——对不同尺寸屏幕的适配(自动布局:AutoLayout)

    对不同尺寸设备UI的适配: 很多时候,我们的App可能运行在不同尺寸的设备上,或者横竖屏时,呈现方法应该也不一样.这样便要求UI里各控件的位置和大小不能写死. 对于不同尺寸UI的适配,一般有三种对策: ...

  2. 关于三星手机照相机调用适配问题Android

    因为三星手机在照相的时候,会自动将自动转化为为横屏. 这里的话 就不讲具体怎么实现的,因为在网络上是有相关的代码. 主要的是在你拍完照返回的时候,先前的界面可能会重绘,所以会导致一些问题. 我暂时的办 ...

  3. Docker的C/S模式详解

    Docker的C/S模式 Docker的C/S模式 Docker Client通过Remote API与Docker Server通信: RESTful风格API STDIN.STDOUT.STDER ...

  4. 如何将js与HTML完全脱离

    先举出一个例子: var sound='Roar!'; function myOrneryBeast(){ alert(this); this.style.color='green';//this指代 ...

  5. struts2笔记03-ActionContext

    1.概念 ActionContext是action的上下文,它包括action执行所需要的对象.struts2对每一个action都会创建一个新的ActionContext实例,同Action一样,是 ...

  6. tiny4412学习笔记-将uboot、zImage、文件系统烧到emmc中

    1.首先还是要将u-boot写入SD卡中从SD卡启动. 使用读卡器将SD插入电脑中,使用umount卸载u盘, fdisk -l显示其挂载点为 /dev/sdb1 切换到/home/bunfly/im ...

  7. MMC卡是什么

    MMC卡(Multimedia Card) 翻译成中文为“多媒体卡”.是一种快闪存储器卡标准.在1997年由西门子及SanDisk共同开发,技术基于东芝的NAND快闪记忆技术,因此较早期基于Intel ...

  8. 图文:TF卡和SD卡的区别及什么是TF卡?什么是SD卡

    小型存储设备凭借低廉的价格.多样化的品种.实用等特性大量充斥在大家身边,比如智能手机手机上.数码照相机上.游戏机上(一般是掌机)等都小型电子设备都频繁的使用到这种统称为SD的产品,比如TF卡和SD卡( ...

  9. Microsoft Office 2010 Pro VOL简体中文正式版

    网友们期待的Microsoft Office Professional Plus 2010 VOL简体中文正式版.所谓的“VOL”,即是Volume Licensing for Organizatio ...

  10. Qt for Linux:环境搭建(CentOS 6.5 32位)——完全从零安装

    正文开始前,我们假设,用户可以操作终端 拥有root权限,以下所有操作也均由root完成 可以上网 安装了CentOS 6.5 32位 注:红色部分,每个人可能都不一样 话不多说,列出本章大致流程 1 ...