上一节中鸡啄米讲了MFC异常处理,本节的主要内容是字体CFont类。

字体简介

GDI(Graphics Device Interface),图形设备接口,是Windows提供的一些函数和结构,用于在显示器和打印机上显示图形。我们在MFC开发中经常会使用GDI来输出文本或图形图像(当然现在也有了GDI+,本教程主要讲解GDI)。文本实际上就是一种特殊的图形,它只不过是根据事先指定的“字体”绘制出来的图形。

字体通常用来为字符集中每一个字符,如字母、数字、标点符号等,指定其形状等外表特征。窗口创建后,如果没有专门指定,一般会采用系统字体作为默认字体。我们可以使用API函数GetStockObject(SYSTEM_FONT)获得系统字体的句柄。

CFont类

CFont类封装了一个Windows图形设备接口(GDI)字体,并为操作字体提供了成员函数。

为了使用CFont对象,首先构造一个CFont对象,再通过调用CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect将一个Windows字体与此CFont对象关联,然后使用此CFont对象的成员函数就可以操作字体了。

一般使用CreatePointFont或CreatePointFontIndirect比使用CreateFont或CreateFontIndirect要更简便,因为前两者会自动的将字体高度的单位由点转换为逻辑单位。

:“点”是传统计量字大小的单位,是从英文Point来的,一般用小写p表示,俗称“磅”。其换算关系为:1p=0.35146mm≈0.35mm,1英寸=72p。

先简单解释下下面用到的几个概念:

设备上下文是包含某个设备(如显示器、打印机)的绘制属性信息的Windows数据结构,有了它就可以在Windows中进行与设备无关的绘图,而不用考虑此设备是显示器还是打印机等。CDC类就是设备上下文类。

在绘图时还经常会提到逻辑和物理,例如逻辑单位、物理单位,通俗点说,逻辑的就是与具体设备无关的,甚至我们可以自定义,物理的就是由具体设备决定的了。

CFont类为字体的操作提供了几个成员函数,下面是对其各个成员函数的详细介绍。

1、CFont( ); 

构造一个CFont对象。此对象在使用之前应该先使用CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect初始化。

2、

BOOL CreateFont(
   int nHeight,
   int nWidth,
   int nEscapement,
   int nOrientation,
   int nWeight,
   BYTE bItalic,
   BYTE bUnderline,
   BYTE cStrikeOut,
   BYTE nCharSet,
   BYTE nOutPrecision,
   BYTE nClipPrecision,
   BYTE nQuality,
   BYTE nPitchAndFamily,
   LPCTSTR lpszFacename 
);

通过指定的一些特征初始化CFont对象。下面分别介绍每个参数:

nHeight:指定字体高度(逻辑单位)。有三种取值:>0,字体映射器将高度值转换为设备单位,并与可用字体的字符元高度进行匹配;=0,字体映射器使用默认的高度值;<0,字体映射器将高度值转换为设备单位,用其绝对值与可用字体的字符高度进行匹配。nHeight转换后的绝对值不应超过16384个设备单位。

nWidth:指定字体中字符的平均宽度(逻辑单位)。

nEscapement:指定偏离垂线和显示界面X轴之间的角度,以十分之一度为单位。偏离垂线是穿过一行文本中第一个字符和最后一个字符的直线。

nOrientation:指定每个字符的基线和设备X轴之间的角度,以十分之一度为单位。

nWeight:指定字体磅数(每1000点中墨点像素数)。可取0到1000之间的任意整数值。

bItalic:指定字体是否为斜体。

bUnderline:指定字体是否带有下划线。

bStrikeOut:指定字体是否带有删除线。

nCharSet:指定字体的字符集。预定义的字符集:

ANSI_CHARSET;BALTIC_CHARSET;CHINESEBIG5_CHARSET;DEFAULT_CHARSET;EASTEUROPE_CHARSET; GB2312_CHARSET; GREEK_CHARSET;HANGUL_CHARSET; MAC_CHARSET; OEM_CHARSET; RUSSIAN_CHARSET; SHIFTJIS_CHARSET;SYMBOL_CHARSET; TURKISH_CHARSET。韩国Windows:JOHAB_CHARSET;中东地区Windows:HEBREW_CHARSSET,ARABIC_CHARSET;泰国Windows:THAI_CHARSET。应用程序可以使用DEFAULT_CHARSET以允许字体名和大小完全指定逻辑字体,如果指定的字体名不存在则可能会用任意字符集的字体来代替,所以为避免不可预料的结果,应谨慎使用DEFAULT_CHARSET。

nOutPrecision:指定输出精度。输出精度定义了输出与要求的字体高度、宽度、字符方向、移位和间距等的接近程度。它的取值及含义如下(只能取其一):  

OUT_CHARACTER_PRECIS;未用。   
       OUT_DEFAULT_PRECIS:指定缺省的字体映射器状态。   
       OUT_DEVICE_PRECIS:在当系统里有多种字体使用同一个名字时指示字体映射器选择一种设备字体。   
       OUT_OUTLINE_PRCIS:在Windows NT中此值指示字体映射器从TrueType和其他基于边框的字体中选择。   
       OUT_RASTER_PRECIS:在当系统里有多种字体使用同一个名字时指示字体映射器选择一种光栅字体。   
       OUT_STRING_PRECIS:此值没有被字体映射器使用,但是当列举光栅字体时它会被返回。    
       OUT_STROKE_PRECIS:没有被字体映射器使用,但是当列举TrueType字体、其他基于边框的字体和向量字体时它会被返回。 
       OUT_TT_ONLY_PRECIS:指示字体映射器仅从TrueType字体中选择,如果系统中没有安装TrueType字体,则字体映射返回缺省状态。  
       OUT_TT_PRECIS:在当系统里有多种同名的字体时指示字体映射器选择一种TrueType字体。当操作系统含有多种与指定名字同名的字体时,应用程序可以使用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS和OUT_TT_PRECIS值来控制字体映射器如何选择一种字体,例如,如果操作系统含有名字Symbol的光栅和TrueType两种字体,指定OUT_TT_PRECIS使字体映射器选择TrueType方式(指定OUT_TT_ONLY_PRECIS强制字体映射器选择一种TrueType字体,尽管这会给TrueType字体换一个名字)。

nClipPrecision:指定裁剪精度。裁剪精度定义了怎样裁剪部分超出裁剪区域的字符。它的取值及含义如下(可取一个或多个值):

  CLIP_DEFAULT_PRECIS:指定缺省裁剪状态。
       CLIP_CHARACTER_PRECIS:未用。   
       CLIP_STROKE_PRECIS:未被字体映射器使用,但是当列举光栅字体、向量字体或TrueType字体时它会被返回。在Windows环境下,为保证兼容性,当列举字体时这个值总被返回。   
       CLIP_MASK:未用。
       CLIP_EMBEDDED:要使用嵌入式只读字体必须使用此标志。   
       CLIP_LH_ANGLES:当此值被使用时,所有字体的旋转依赖于坐标系统的定位是朝左的还是朝右的。如果未使用此值,设备字体总是逆时针方向旋转,但其他字体的旋转依赖于坐标系统的定向。   
       CLIP_TT_ALWAYS:未用。

nQuality:指定字体的输出质量。输出质量定义了GDI将逻辑字体属性匹配到实际物理字体的细致程度。它的各个取值及含义如下(取其一):

DEFAULT_QUALITY:字体的外观不重要。   
       DRAFT_QUALITY:字体外观的重要性次于使用PROOF_QUALITY时,对GDI光栅字体,缩放比例是活动的,这意味着多种字体大小可供选择,但质量可能不高,如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。   
       PROOF_QUALITY:字符质量比精确匹配逻辑字体字体属性更重要。对GDI扫描字体,缩放比例是活动的,并选择最接近的大小。尽管当使用PROOF_QUALITY时,选择字体大小并不完全匹配,但字体的质量很高,并没有外观上的变形。如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。

nPitchAndFamily:指定字体间距和字体族。低2位用来指定字体的间距,可取下列值中的一个:DEFAULT_PITCH,FIXED_PITCH,VARIABLE_PITCH。高4位指定字体族,取值及含义如下(取其一):

FF_DECORATIVE:新奇的字体,如老式英语(Old English)。
       FF_DONTCARE:不关心或不知道。   
       FF_MDERN:笔划宽度固定的字体,有或者无衬线。如Pica、Elite和Courier New。   
       FF_ROMAN:笔划宽度变动的字体,有衬线。如MS Serif。   
       FF_SCRIPT:设计成看上去象手写体的字体。如Script和Cursive。   
       FF_SWISS:笔划宽度变动的字体,无斜线。如MS Sans Serif。   

应用程序可以用运算符OR将字符间距和字体族组合起来给nPitchAndFamily赋值。   

字体族描述一种字体的普通外观,当所有的精确字样都不能使用时,可用它们来指定字体。

lpszFacename:指定字体的字样名的字符串。此字符串的长度不应超过30个字符。Windows函数EnumFontFamilies可以枚举出当前所有可用字体的字样名。如果lpszFacename为NULL,则GDI使用一种与设备无关的字体。

返回值:此函数成功则返回TRUE,否则返回FALSE。

CreateFont函数初始化CFont对象后,此字体就能够被选作任何设备上下文的字体了。此函数并不会创建一个新的Windows GDI字体,只是从GDI的物理字体中选择了一个最匹配的字体。在创建一个逻辑字体时,大部分参数可以使用默认值,但一般情况下都会给出参数nHeight和lpszFacename的指定值,如果没有给nHeight和lpszFacename参数设定取值,则创建的逻辑字体与设备相关。当使用CreateFont函数初始化一个CFont对象完成后,就能够使用CDC::SelectObject函数来为设备上下文选择字体了,并且还能够在不再使用此CFont对象时删除它。

 3、BOOL CreateFontIndirect(const LOGFONT* lpLogFont);

通过一个LOGFONT结构体变量给出的特征来初始化CFont对象。参数lpLogFont是指向LOGFONT结构体变量的指针,此LOGFONT结构体变定义了逻辑字体的特征。LOGFONT结构体的定义可以参见VS2010/MFC编程入门之十八(对话框:字体对话框)

4、BOOL CreatePointFont(int nPointSize,LPCTSTR lpszFaceName,CDC* pDC = NULL);

此函数提供了一种由指定字样和点数创建字体的简单方式。参数的意义如下:

nPointSize:指定字体高度,以十分之一点为单位。例如,nPointSize为120则表示是12点的字体。

lpszFacename:指定字体的字样名的字符串。此字符串的长度不应超过30个字符。Windows函数EnumFontFamilies可以枚举出当前所有可用字体的字样名。如果lpszFacename为NULL,则GDI使用一种与设备无关的字体。

pDC:指向CDC对象,用来将nPointSize指定的高度转换为逻辑单位,如果为NULL,则使用屏幕设备上下文进行转换。

5、BOOL CreatePointFontIndirect(const LOGFONT* lpLogFont,CDC* pDC = NULL);

此函数是通过指定的字样和点数创建字体的间接方式。参数lpLogFont指向一个LOGFONT结构体变量,此LOGFONT变量定义了逻辑字体的特征,它的lfHeight成员以十分之一点为单位,而不是逻辑单位。参数pDC指向CDC对象,用来将lfHeight表示的高度转换为逻辑单位,如果为NULL,则使用屏幕设备上下文进行转换。

此函数与CreateFontIndirect很相似,但区别是LOGFONT变量中lfHeight成员的单位是十分之一点而不是逻辑单位。

6、static CFont* PASCAL FromHandle(HFONT hFont);

由Windows GDI字体的HFONT句柄获得相应的CFont对象指针。参数hFont是一个Windows字体的HFONT句柄。成功则返回CFont对象的指针,否则返回NULL。

 7、int GetLogFont(LOGFONT * pLogFont);

获取CFont对象的LOGFONT结构体的拷贝。参数pLogFont指向用来接收字体信息的LOGFONT结构体变量。成功则返回非零值,否则返回零。

本节内容稍显枯燥,首次学习可以先大致看下,学习了后面的字体使用再回过来细看也是可以的。鸡啄米也欢迎大家在以后的开发过程中回来温习。

转自:http://www.jizhuomi.com/software/181.html

VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)的更多相关文章

  1. VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)

    上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数. CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户 ...

  2. VS2010/MFC编程入门之四(MFC应用程序框架分析)

    VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html   上一讲鸡啄米讲的是VS2010应用 ...

  3. VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)

    上一节中鸡啄米讲了文档.视图和框架结构中各对象之间的关系,本节主要讲讲在MFC中如何分割窗口. 分割窗口概述       分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或 ...

  4. VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)

    鸡啄米在上一节教程中讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建.停靠与使用. 工具栏的使用 上一节中鸡啄米提到过,一般情况下工具栏中的按钮在菜单栏中都有 ...

  5. VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)

    鸡啄米在上一节中讲了CFont字体类,本节主要讲解文本输出的方法和实例. 文本输出过程 在文本输出到设备以前,我们需要确定字体.字体颜色和输出的文本内容等信息.Windows窗口的客户区由应用程序管理 ...

  6. VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)

    上一节中鸡啄米讲了定时器Timer的用法,本节介绍下文件操作类CFile类的使用. CFile类概述 如果你学过C语言,应该知道文件操作使用的是文件指针,通过文件指针实现对它指向的文件的各种操作.这些 ...

  7. VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)

    上一节中鸡啄米讲了CFile文件操作类,本节主要来说说MFC异常处理. 在鸡啄米C++编程入门系列的最后一节鸡啄米:C++编程入门系列之五十(异常处理)中,鸡啄米讲了C++标准异常的处理机制,如果你还 ...

  8. VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)

    前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后 ...

  9. VS2010/MFC编程入门之四十四:定时器Timer

    前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后 ...

随机推荐

  1. Django---简单模板遍历渲染

    简单路由: urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), path('list/', vi ...

  2. ajax无刷新获取天气信息

    浏览器由于安全方面的问题,禁止ajax跨域请求其他网站的数据,但是可以再本地的服务器上获取其他服务器的信息,在通过ajax请求本地服务来实现: <?php header("conten ...

  3. Mongodb 副本集 数据同步简单测试

    副本集的搭建,请见  CENTOS6.5 虚拟机MONGODB创建副本集 接下来将简单说明下副本集之间的数据同步. 1.首先,进入primary节点 MOGO_PATH/bin/mongo  -por ...

  4. CmD空格转义的三种方法,总有一种会解决问题

    CmD空格转义 在cmd中,如果路径中存在空格报错 可以有三种解决方法: 1.将存在空格的路径用双引号包起来,如:"D:/Program Files/xx"; 2.将存在空格的名称 ...

  5. POJ-1157 LITTLE SHOP OF FLOWERS(动态规划)

    LITTLE SHOP OF FLOWERS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19877 Accepted: 91 ...

  6. HDU 5636 Shortest Path(Floyed,枚举)

    Shortest Path Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tot ...

  7. PyCharm导入tensorflow包报错的问题

    [注]PyCharm导入tensorflow包报错的问题 若是你也遇到这个问题,说明你也没有理解tensorflow到底在哪里. 当安装了anaconda3.6后,在PyCharm中设置interpr ...

  8. 2018No-java面试知识

    1.框架 1. springboot比spring的优点? 2. Springmvc的基本流程? 3. 微服务之间调用不会慢吗? 4. 大图片和大数据库怎么存储? 5. spring事物?四大特征, ...

  9. Set-cookie无效(失效)

    今天做爬虫的时候遇到网站响应response返回的数据中有Set-Cookie,但是使用Linux的curl请求网页保存cookie始终为空,换句话说也就是Set-Cookie设置无效,所以我一直Go ...

  10. sublime安装install package

    通过 https://sublime.wbond.net/Package%20Control.sublime-package 下载packageControl文件 下载完成后,打开sublime te ...