前一阵,在一项目中需要使用cad的图纸,但dwg太过复杂了,后来又研究了dxf,但有一些复杂点的dwg转换到了dxf,dxf变得很庞大,本来就是要在cad图间不停切换,这使的程序性能受到一点影响,后面在无意中发现cad能导出wmf文件,网上一查,wmf是Microsoft Windows中常见的一种图元文件格式,它具有文件短小、图案造型化的特点,心里一直高兴,心想终于找到好方法了。决定将wmf弄到项目里,结果却出现了一大堆的问题,首先发现Qt不支持wmf,既然不支持哪就自己用GDI来操作吧,一翻查资料后找到PlayEnhMetaFile API函数,结果运行PlayEnhMetaFile显示刚才从cad导出的wmf文件,结果不得行。难道windows也放弃了wmf?又在google里找了半天,发现由于windows 2000之后就不再提供对16位gdi函数的支持。所以播放WMF文件都是将其转换为EMF文件来播放的。普通的WMF文件只需要调用SetWinMetaFileBits方法即可顺利转换为EMF播放。但是由于Placeable WMF包含了映射和缩放信息,我们必须在转换的时候要将这些信息保存到EMF中去,朋友们可参照网上的转换方法,这里就不介绍了。
转换成功后,终于能用PlayEnhMetaFile显示wmf文件了,心里一直高兴啊。但高兴劲还没过了几分钟,又发现问题了,我将wmf显示到一个widget中,widget周围还有一些widget,在缩放wmf的时候,发现wmf显示到widget外面去了,这怎么能行啊。这次在网上找了很久也没找到解决办法,自己也试了很多次,结果在一个老外写的文章里找到了解决问题的方法。那就是重载paintEngine,然后返回NULL,然后在paintEvent里使用GDI显示wmf即正常了。