★wingtrace发表于:2009-11-18 10:39:07:
用的是Office自动化编程,日文系统,.NET编程环境。
对Shape.TextFrame设定了AutoSize等属性,
对Shape.TextFrame.TextRange.Text设定了文本,
对Shape.TextFrame.TextRange.Font设定了字体名称、大小、样式等,
※字体为"MS Gothic",12pt,Blue,Underline。
通过Shape.Export函数将文本框导出为EMF文件,
发现只要符合以下条件,原本设定的"MS Gothic"在实际生成的EMF中变成了"PMingLiu"。
1、Vista+Office2007
※Win2K+Office2003无此问题
2、至少包含一个比较复杂的汉字,例如“華”等
※如果都是简单汉字的话无此问题,例如“日”等
3、字数达到或超过6个
据本人猜测,可能是内部GDI函数对文字的字符集或代码页的判断有误,
因为"MS Gothic"针对的是CP932,"PMingLiu"针对的是CP935。。
★tttyd回复于:2009-11-18 11:04:57
mark
这种问题原因多多,尤其是系统环境问题,不好诊断
★wingtrace回复于:2009-11-18 11:08:45
确实,从ms和msdn的网站上也找不出什么有用的信息。
而且通过调查发现,Shape.Export其实是一个没有任何文档记载的函数,
MSDN的forum上有人讨论,宣称它实际上是一个不被支持的函数。。。
★wingtrace回复于:2009-11-18 21:28:20
经过调查意外地解决了。。
无奈之余尝试着DEBUG跟踪TextRange的各种属性,看有没有异样的地方,
发现在调用Shape.TextFrame.TextRange.Text设定文本之后,
TextRange.LanguageID变成了msoLanguageIDTraditionalChinese,
而设定文本前它是正常的msoLanguageIDJapanese。
至于为什么TextRange.Text接收文本之后会改变TextRange.LanguageID,
应该是对设定进来的文本的代码页发生了误判,在全日文系统以及全日文输入
的情况下不应该发生这样的问题才对,或许是PowerPoint2007的BUG,
或许是Vista的BUG,那就不得而知了。。
关于修正方法,只要在设定文本之后强行通过代码将TextRange.LanguageID
设定回msoLanguageIDJapanese就好了,经过观察EMF表现恢复正常。
btw,本次BUG调查中Feng Yuan的《Windows图形编程》一书起了很大作用,
没有它我也不会深入地去了解EMF的构造以及GDI关于字体和文本处理的一些
工作原理,在此聊表谢意吧。
★wingtrace回复于:2009-12-09 09:02:45
很遗憾地说,其实那个办法不能解决问题。。
后来客户去咨询了MS,MS说设定日文字体的时候用Font.Name属性是不对的,
应该用Font.NameFarEase属性,否则就算强行将LanguageID改成日语,
所用的也依然是日语的缺省字体(MS PGothic),而不是代码里面设置的
MS Gothic。MS没说这是个BUG,只是在KB里面也有记录,KB号记不得了。。
※因为MS Gothic和MS PGothic只是等宽与非等宽的区别,在文字比较少,
而且不包含空格的时候,是很难看出来差别的,但是一旦包含大量的空格,
用MS PGothic的总宽度明显要比MS Gothic短得多。。。
★wingtrace回复于:2009-12-09 09:04:32
该问题不仅影响PowerPoint,也影响Excel,
不止在Vista下有问题,在WindowsXP下页有问题。