VC字体接口SDK有点怪异

Posted 柳鲲鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC字体接口SDK有点怪异相关的知识,希望对你有一定的参考价值。

  首先看看字的结构:

字体结构的Baseline/Leading/Ascent/Descent的图示_柳鲲鹏的博客-CSDN博客_ascent descent 字体

  由图中看到, 正常的接口应该是提供相应的访问功能。因为工作原因,了解了一下VC字体的接口,觉得甚是奇怪。

  • 怪异一:获取字体结构信息的办法
	font=CreateMyFont(L"宋体", fontSize);
	SelectObject(hDC,font); //将创建的字体句柄选入设备环境

	TEXTMETRIC tm;
	GetTextMetrics(hDC, &tm);

  有了字体,应该直接从字体中获取信息,为什么要经过HDC?

  • 怪异二:新建字体不能用字号,只能用高度
CreateFont 
(	height,    //字体的高度
	0,       //由系统根据高宽比选取字体最佳宽度值
	0,       //文本的倾斜度为,表示水平
	0,		 //字体的倾斜度为
	FW_HEAVY,			
	0,					//非斜体字
	0,					//无下划线
	0,					//无删除线
	GB2312_CHARSET,     //表示所用的字符集为ANSI_CHARSET
	OUT_DEFAULT_PRECIS,	//输出精度为默认精度
	CLIP_DEFAULT_PRECIS,	   //剪裁精度为默认精度
	DEFAULT_QUALITY,		   //输出质量为默认值
	DEFAULT_PITCH|FF_DONTCARE, //字间距和字体系列使用默认值
	fontName				   //字体名称
	);

  吾想指定的是字号,怎么要指定高度?这不科学啊。吾只知道字号,不知道高度,怎么办?

  有人说字号可以换算为高度,这个想法应该是错的。理由参考下文。

  • 怪异3:实际高度要加上leading

  指定height=1000,结果是:ascent=859,descent=141,leading=141。

  这是怎么回事?吾试了一下JDK,指定字号1000,结果是:ascent=860, descent=141, leading=141。这样一算正好。这可能是接口的定义不同,倒是无所谓了。

  注意ascent,为什么会差一个像素?谁错了?简单分析了一下,可能是JDK算错了。理由就是ascent+leading != 1000。

以上是关于VC字体接口SDK有点怪异的主要内容,如果未能解决你的问题,请参考以下文章

为什么字体颜色属性中的怪异事物会产生真实的颜色? [重复]

[考试反思]0220省选模拟27:怪异

css怪异盒模型样式

标准盒模型和怪异(IE)盒模型

浏览器 标准模式和怪异模式

怪异盒模型