none
关于OLE Server 绘图的问题 RRS feed

  • 问题

  • 之前问过一次,感谢微软工作人员的耐心回答,虽然问题并未得到解决。链接如下:

    https://social.msdn.microsoft.com/Forums/zh-CN/1d3a9ba5-6089-4abe-8052-5411f3f275b1/oleword?forum=visualcpluszhchs#ff1e7edf-5177-4c6f-b896-9d513e32ec03

    现在我换一种问法,希望能得到解决。

    我做的是一个 OLE Server 的应用程序,基于 MFC 的 Wizard 生成。

    根据VS的例子,在 XXXSrvrItem::OnDraw(CDC* pDC, CSize& rSize) 这个重载的函数中进行图形的绘制,所有的 GDI 函数都没问题。

    但由于 GDI 的绘图命令比较单一,不能满足要求,所以就考虑使用 GDI+ ,这时候问题出现了,所有 GDI+ 命令都不起作用!!!

    我把这个 OLE 生成的对象嵌入到 MS-WORD 中,然后将 docx 文件解压缩,抽出嵌入的对象,发现这个 OLE 生成的对象图片是以 WMF 的格式存在的。而我按照相同的方式将 EXCEL Chart 嵌入 WORD ,按同样的方式解压 docx 文件,发现嵌入在 WORD 中的 EXCEL 对象是以 EMF ,也即增强型图元存在的! EXCEL 本身也是一种 OLE Server。显然 EXCEL 生成的EMF是具有GDI+绘图特性的。

    基于以上对比,我的问题是:如何能让我自己开发的这个软件生成的图片以 EMF 的格式嵌入在 MS-WORD 中?

    我搜索了很多地方都没找到答案,看起来这是一个比较冷的话题。有劳微软的工程师帮解答一下,非常感谢!





    • 已编辑 Xun Zhou 2016年9月15日 14:04
    2016年9月15日 14:02

全部回复

  • Hi Xun Zhou,

    感谢在MSDN论坛发帖。

    >>但由于 GDI 的绘图命令比较单一,不能满足要求,所以就考虑使用 GDI+ ,这时候问题出现了,所有 GDI+ 命令都不起作用!!!

    在我的理解中,CDC对象并不能直接调用GDI+资源。如果想在你的工程中使用GDI+,需要进行以下几步操作。使用GDI+对象绘制图形。

    1.添加这些到stdafx.h

    #include <gdiplus.h>
    using namespace Gdiplus;
    #pragma comment(lib, "gdiplus.lib")


    2.初始化GDI+资源,将这些成员添加到CWinApp继承的类中。

    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;

    3.在InitInstance()中,添加以下代码。

    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    4.使用结束后,调用下面的函数。

    GdiplusShutdown(gdiplusToken);

    详情参考以下文档。

    http://www.codeproject.com/Articles/2529/GDI-in-ActiveX-Controls-Using-MFC

    >>基于以上对比,我的问题是:如何能让我自己开发的这个软件生成的图片以 EMF 的格式嵌入在 MS-WORD 中?

    GDI+提供了Metafile类,用来记录和显示metafile。在这个类中,你可以使用Image::Save Method (Stream^, ImageFormat^)将图形存储为EMF格式的文件。

    希望对你有所帮助。

    Best Regards,
    Sera Yu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

    2016年9月19日 6:49