【MFC】GDI字体和CFont类
GDI字体和CFont类
所有的CDC文本函数都使用当前选入设备描述表的字体。字体是指一组具有特定尺寸(高度)和字样的字符;字样是指字符共有的属性,如字的粗细度----正常体或黑体。在传统印刷式样中,字体尺寸大小是以point(即点)为单位来度量的。一个点相当于1/72英寸。12-点字体中的字符就有1/6英寸高。
如果想以像素为单位制定字体尺寸,则调用CreateFont或CreateFontIndirect;如果想以点为单位制定字体尺寸,则调用CreatePointFont或CreatePointFontIndirect。
使用CreateFont函数创建一个以点为单位的相同字体尺寸的字体,则需要向设备描述表查询垂直方向上每英寸内像素的逻辑个数。
传递给CreatePointFont的数值是你所期望的点的大小的10倍。这样字体尺寸就可以控制到字体的1/10,考虑到大部分屏幕和其他常见输出设备相对较低的分辨率,对于大多数应用场合,这个精度已经够用了。
不能用CreatePointFont创建一个粗黑、倾斜的字体,但用CreatePointFontIndirect就能达到目的。【上面这一段来自《MFC Windows程序设计(第2版)》】
LOGFONT是一个结构,它的字段定义了字体的所有特性。(下面解释来自百度百科http://baike.baidu.com/link?url=DzHMLGkAgJUYmSMVZax7FFX_oLy4vuvSb9AEbfIocghJF3iF
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的范围为0到1000,正常情况下的字体重量为400,粗体为700。如果lfWeight为0,则使用默认的字体重量。
lfItalic:
当lfItalic为TRUE时使用斜体
lfUnderline:
当lfUnderline为TRUE时给字体添加下划线
lfStrikeOut:
当lfStrikeOut为TRUE时给字体添加删除线
lfCharSet:
指定字符集。可以使用以下预定义的值: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。
其中,OEM_CHARSET 表示字符集依赖本地操作系统。
DEFAULT_CHARSET 表示字符集基于本地操作系统。例如,系统位置是 English (United States),字符集将设置为 ANSI_CHARSET。
lfOutPrecision:
指定输出精度。输出精度定义了输出与所要求的字体高度、宽度、字符方向等的接近程度。它可以为下面的值之一:OUT_CHARACTER_PRECIS、OUT_DEFAULT_PRECIS、OUT_STRING_PRECIS、OUT_STROKE_PRECIS。
lfClipPrecision:
指定剪辑精度。剪辑精度定义了当字符的一部分超过剪辑区域时对字符的剪辑方式,它可以为下列值之一:CLIP_CHARACTER_PRECIS、CLIP_DEFAULT_PRECIS、CLIP_STROKE_PRECIS。
lfQuality:
定义输出质量。输出质量定义了图形设备接口在匹配逻辑字体属性到实际的物理字体的所使用的方式,它可以为下列值之一:DEFAULT_QUALITY (默认质量)、DRAFT_QUALITY (草稿质量)、PROOF_QUALITY (正稿质量)。
lfPitchAndFamily:
指定字体的字符间距和族。最低两位指定字体的字符间距为以下值之一:DEFAULT_PITCH、FIXED_PITCH、VARIABLE_PITCH第4到7位指定字体族为以下值之一:FF_DECORATIVE、FF_DONTCARE、FF_MODERN、FF_ROMAN、FF_SCRIPT、FF_SWISS这些值的具体含义可以参考Visual C++中关于结构LOGFONT的文档。字符间距和字体族可以使用逻辑或(OR)运算符来进行组合。
lfFaceName:
一个指定以NULL结尾的字符串,它指定的所用的字体名。该字符串的长度不得超过32个字符,如果lfFaceName为NULL,图形设备接口将使用默认的字体名。
重点说明:
lfHeight字段:
这个好像是磅值。
百度经常发现这个公式“百度解释:字体高度值和磅值有如下的换算公式”:
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);
运行后,lfHeight与lf.lfHeight的值都等于-11.所以以点为单位度量字体大小的nPointSize与LOGFONT中的lfHeight有一定的转换关系。重点是“以点为单位度量字体大小”时候。
创建字体方法:
如果想以像素为单位制定字体尺寸,则调用CreateFont或CreateFontIndirect;如果想以点为单位制定字体尺寸,则调用CreatePointFont或CreatePointFontIndirect。
(1)
nHeight = -((dc.GetDeviceCaps(LOGPIXELSY) * nPointSize) / 72);
(2)
(3)
CreatePointFont“以点为单位度量字体大小”创建字体,但是传递给CreatePointFont的数值是你所期望的点的大小的10倍。例如nPointSize = 12,要传递的参数应该为120.
(4)
关于中文字号与点单位字体对应表
中文字号 |
点 |
初号 |
42 |
小初 |
36 |
一号 |
26 |
小一 |
24 |
二号 |
22 |
小二 |
18 |
三号 |
16 |
小三 |
15 |
四号 |
14 |
小四 |
12 |
五号 |
10 |
小五 |
9 |
六号 |
7 |
小六 |
6 |
七号 |
5 |
八号 |
5 |
- 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《博瑞博客》。
- 本文网址:http://blog.neacn.com/C/136.html
- 上篇文章:IME消息、函数、命令、需要的数据结构、常量
- 下篇文章:MFC类目录及头文件(转)