Office自动化,PowerPoint将Shape导出为EMF之后,字体发生变化,何解?

★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下页有问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值