To Bianyueliang:
你是想改变文本绘制的行间距吗?也许我能帮你。
首先,你说的 OUTLINETEXTMETRIC ,包括 TEXTMETIRC、NEWTEXTMETRIC 等
这些数据结构,反映的全部是物理字体的属性,作为程序不应该对任何物理字体的
属性进行直接控制,否则就违背了 OS 的封装特性。
一般的做法是:首先建立你希望的理想(Ideal)的字体的描述信息,存放在
LOGFONT 这样一个数据结构中,使用 CreateFontIndirect 建立一个这样的
逻辑字体,然后向操作系统请求把这个逻辑字体选入 DC 中,在 SelectObject
的过程中,操作系统会按照一定的原则在现有字体中寻找最佳匹配的字体,作为将来
描绘文字的真正字体。GetTextMertric、GetOutLineTextMertric 等函数能得到
OS 真正使用的字体的信息,也许和你的预期目标有所差别。
由于 LOGFONT 结构中并没有 ExternalLeading 或是 otmLineGap 等属性,
所以不管是对于一般程序来说,行间距只读的。
要改变行间距,可以使用下述思想:(实际上就是手工分段)
1、确定行宽。
2、使用 Canvas.TextWidth 计算最适合行宽的子串长度,如果你是在写文字
处理程序的话,此过程中可以附带分词(整词分行)。
也可以直接调用 GetTextExtentPoint32 API。Canvas.TextWidth 内部也是
调用这个函数。
注意文本宽度与 SetTextCharacterExtra 等有关。
3、描绘子串,并改变 dY (希望要的行间距)。
至于你所说的 otmMacLineGap ,是用于 Macintosh 的,你真的需要它吗?
如果你想对这方面多研究的话,可以找 MicroSoft 的 TrueType 的专业书籍,
不过我想,精通这方面的人可能不多。
欢迎交流,不当之处,请多指正。
From: BaKuBaKu