行间距(300分)

  • 主题发起人 主题发起人 Bianyueliang
  • 开始时间 开始时间
B

Bianyueliang

Unregistered / Unconfirmed
GUEST, unregistred user!
请教高手:使用DrawText换行打印时(DT_WORDBREAK)如何改变行间距?如何使用OUTLINETEXTMETRIC的otmMacLineGap域?
 
这东西我没用过,回去试下看看。
 
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
 
我总觉得行间距与字体没有太大关系, 实际上是不知道它的
显示原理。
 
TextMetric属性是描述字体的物理特征的,这在“DELPHI4编程技术内幕”里有。
可好象编程时不太对?
 
不能指望用一个函数把这种事情搞定,总是要自己进行计算定位的,一个最小的
字处理程序的要求都是很严格的。
标准的 API 中没有类似的方法做行间距,也许 TrueType API 中有。
From: BaKuBaKu
 
Mr. BaKuBaKu:

目前我使用的方法就是你所介绍的方法。

我想是否有能够偷懒的方法。

问题中otmLineGap误为otmMacLineGap。


 
应该没有,而且即使有,也无法进行精细控制,这就像语言越高级,越不容易
控制底层细节一样。
再说,这个方法也不复杂啊。
From: BaKuBaKu
 
这个问题已经很长时间了。感谢大家的脑细胞。有机会多向大家学习。

Mr. BaKuBaKu,be a friend? bianyl@public1.sz.js.cn
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部