博瑞博客

青春是一个充满活力的季节,即便是我们失去了天使的翅膀,只要我们还有一颗青春的心,那么我们的生活依然能够如阳光般灿烂!......
现在位置:首页 > C/C++ > 【MFC】GDI字体和CFont类

【MFC】GDI字体和CFont类

江湖    C/C++    2021-1-14    759    0评论

GDI字体和CFont

所有的CDC文本函数都使用当前选入设备描述表的字体。字体是指一组具有特定尺寸(高度)和字样的字符;字样是指字符共有的属性,如字的粗细度----正常体或黑体。在传统印刷式样中,字体尺寸大小是以point(即点)为单位来度量的。一个点相当于1/72英寸。12-点字体中的字符就有1/6英寸高。

如果想以像素为单位制定字体尺寸,则调用CreateFontCreateFontIndirect;如果想以点为单位制定字体尺寸,则调用CreatePointFontCreatePointFontIndirect

使用CreateFont函数创建一个以点为单位的相同字体尺寸的字体,则需要向设备描述表查询垂直方向上每英寸内像素的逻辑个数。

传递给CreatePointFont的数值是你所期望的点的大小的10倍。这样字体尺寸就可以控制到字体的1/10,考虑到大部分屏幕和其他常见输出设备相对较低的分辨率,对于大多数应用场合,这个精度已经够用了。

不能用CreatePointFont创建一个粗黑、倾斜的字体,但用CreatePointFontIndirect就能达到目的。【上面这一段来自《MFC Windows程序设计(第2版)》】

 

LOGFONT是一个结构,它的字段定义了字体的所有特性。(下面解释来自百度百科http://baike.baidu.com/link?url=DzHMLGkAgJUYmSMVZax7FFX_oLy4vuvSb9AEbfIocghJF3iFJXeYT9YAg18rwfyNvPZMtuVtZ7KGqxHF1QON9a)

typedef struct tagLOGFONT

{ // lf 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;

lfHeight

以逻辑单位指定字体字符元(character cell)或字符的高度。字符高度值为字符元高度值减去内部行距(internal-leading)值。lfHeight大于0时,字体映射程序将该值转换为设备单位,并将它与可用字体的字符元高度进行匹配;当该参数为0时,字体映射程度将使用一个匹配的默认高度值;如果参数的值小于0,则将其转换为设备单位,并将其绝对值与可用字体的字符高度进行匹配。对于任何一种情况,字体映射程度最终得到的字体高度值不会超过所指定的值。以MM_TEXT映射模式下,字体高度值和磅值有如下的换算公式:lfHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

 

lfWidth

以逻辑单位指定字体字符的平均宽度。如果lfWidth的值为0,则根据设备的纵横比从可用字体的数字转换纵横中选取最接近的匹配值,该值通过比较两者之间的差异的绝对值得出。

lfEscapement

以十分之一度为单位指定每一行文本输出时相对于页面底端的角度。

lfOrientation

以十分之一度为单位指定字符基线相对于页面底端的角度。

lfWeight

指定字体重量。在Windows中,字体重量这个术语用来指代字体的粗细程度。lfWeight的范围为01000,正常情况下的字体重量为400,粗体为700。如果lfWeight0,则使用默认的字体重量。

lfItalic

lfItalicTRUE时使用斜体

lfUnderline

lfUnderlineTRUE时给字体添加下划线

lfStrikeOut

lfStrikeOutTRUE时给字体添加删除线

lfCharSet

指定字符集。可以使用以下预定义的值:ANSI_CHARSETBALTIC_CHARSETCHINESEBIG5_CHARSETDEFAULT_CHARSETEASTEUROPE_CHARSETGB2312_CHARSETGREEK_CHARSETHANGUL_CHARSETMAC_CHARSETOEM_CHARSETRUSSIAN_CHARSETSHIFTJIS_CHARSETSYMBOL_CHARSETTURKISH_CHARSET

其中,OEM_CHARSET 表示字符集依赖本地操作系统。

DEFAULT_CHARSET 表示字符集基于本地操作系统。例如,系统位置是 English (United States),字符集将设置为 ANSI_CHARSET

lfOutPrecision

指定输出精度。输出精度定义了输出与所要求的字体高度、宽度、字符方向等的接近程度。它可以为下面的值之一:OUT_CHARACTER_PRECISOUT_DEFAULT_PRECISOUT_STRING_PRECISOUT_STROKE_PRECIS

lfClipPrecision

指定剪辑精度。剪辑精度定义了当字符的一部分超过剪辑区域时对字符的剪辑方式,它可以为下列值之一:CLIP_CHARACTER_PRECISCLIP_DEFAULT_PRECISCLIP_STROKE_PRECIS

lfQuality

定义输出质量。输出质量定义了图形设备接口在匹配逻辑字体属性到实际的物理字体的所使用的方式,它可以为下列值之一:DEFAULT_QUALITY (默认质量)DRAFT_QUALITY (草稿质量)PROOF_QUALITY (正稿质量)

lfPitchAndFamily

指定字体的字符间距和族。最低两位指定字体的字符间距为以下值之一:DEFAULT_PITCHFIXED_PITCHVARIABLE_PITCH47位指定字体族为以下值之一:FF_DECORATIVEFF_DONTCAREFF_MODERNFF_ROMANFF_SCRIPTFF_SWISS这些值的具体含义可以参考Visual C++中关于结构LOGFONT的文档。字符间距和字体族可以使用逻辑或(OR)运算符来进行组合。

lfFaceName

一个指定以NULL结尾的字符串,它指定的所用的字体名。该字符串的长度不得超过32个字符,如果lfFaceNameNULL图形设备接口将使用默认的字体名。

 

 

重点说明:

lfHeight字段:

        铺垫:在传统印刷式样中,字体尺寸大小是以point(即点)为单位来度量的。一个点相当于1/72英寸。12-点字体中的字符就有1/6英寸高。在Windows中的一些软件中,有些字体大小是用阿拉伯数字表示的,8,9,10等等。

这个好像是磅值。

百度经常发现这个公式“百度解释:字体高度值和磅值有如下的换算公式”:

lfHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

PointSize指的就是“字体尺寸大小是以point(即点)为单位来度量的”。

 

测试代码如下:

int nPointSize = 8;

int lfHeight = -MulDiv(nPointSize, GetDeviceCaps(dc.GetSafeHdc(), LOGPIXELSY), 72);

CFont font;

LOGFONT lf;

font.CreatePointFont(80, _T("Times New Roman"));

font.GetLogFont(&lf);

运行后,lfHeightlf.lfHeight的值都等于-11.所以以点为单位度量字体大小nPointSizeLOGFONT中的lfHeight有一定的转换关系。重点是以点为单位度量字体大小时候。

 

创建字体方法:

如果想以像素为单位制定字体尺寸,则调用CreateFontCreateFontIndirect;如果想以点为单位制定字体尺寸,则调用CreatePointFontCreatePointFontIndirect

(1)      CreateFont创建字体,使用的参数字体高度是以像素为单位,它与nPointSize有一个转换关系;

nHeight = -((dc.GetDeviceCaps(LOGPIXELSY) * nPointSize) / 72);

(2)     CreateFontIndirect方法使用参数虽然也是结构体LOGFONT但是此时结构体中lfHeight,如果为负值,它将由公式int lfHeight = -MulDiv(nPointSize, GetDeviceCaps(dc.GetSafeHdc(), LOGPIXELSY), 72)匹配一个对应点单位的字体;如果为正值,转为设备单位,应该就是像素。

(3)     

CreatePointFont以点为单位度量字体大小创建字体,但是传递给CreatePointFont的数值是你所期望的点的大小的10倍。例如nPointSize = 12,要传递的参数应该为120.

(4)     CreatePointFontIndirect以点为单位度量字体大小,在初始化LOGFONT结构体变量时,lfHeight需要传递为nPointSize * 10.

 

关于中文字号与点单位字体对应表

中文字号

初号

42

小初

36

一号

26

小一

24

二号

22

小二

18

三号

16

小三

15

四号

14

小四

12

五号

10

小五

9

六号

7

小六

6

七号

5

八号

5


评论一下分享本文赞助博瑞

赞助博瑞X

扫码赞助博瑞
联系站长
博瑞博客
挤眼亲亲咆哮开心想想可怜糗大了委屈哈哈小声点右哼哼左哼哼疑问坏笑赚钱啦悲伤耍酷勾引厉害握手耶嘻嘻害羞鼓掌馋嘴抓狂抱抱围观威武给力
提交评论

清空信息
关闭评论