4

我在 C# 中使用框架 .NET 3.5 开发了一个 Winform 应用程序。我想允许用户从 Word 2007 中拖放图片。基本上,用户打开 docx,选择一张图片并将它们拖放到我的 PictureBox 中。

我已经用我的桌面和 Internet 页面上的图片文件完成了相同的过程,但我无法解决我的 Metafile 问题。我做了很少的研究,但我没有找到任何解决我的问题的解决方案。

这是我在 Drag&Drop 事件中所做的:

 private void PictureBox_DragDrop(object sender, DragEventArgs e)
 {
    if (e.Data.GetDataPresent(DataFormats.MetafilePict)){
        Image image = new Metafile((Stream)e.Data.GetData(DataFormats.MetafilePict));     
     }
  }

我可以使用以下代码获取流: (Stream)e.Data.GetData(DataFormats.MetafilePict) 但我不知道如何将其转换为 Metafile 或更好的 Image 对象。

如果您有任何想法或解决方案,我很乐意阅读。

谢谢,

4

3 回答 3

3

这是一个从 Word 拖放的工作示例(不适用于 PowerPoint 和 Excel):

    static Metafile GetMetafile(System.Windows.Forms.IDataObject obj)
    {
        var iobj = (System.Runtime.InteropServices.ComTypes.IDataObject)obj;
        var etc = iobj.EnumFormatEtc(System.Runtime.InteropServices.ComTypes.DATADIR.DATADIR_GET);
        var pceltFetched = new int[1];
        var fmtetc = new System.Runtime.InteropServices.ComTypes.FORMATETC[1];
        while (0 == etc.Next(1, fmtetc, pceltFetched) && pceltFetched[0] == 1)
        {
            var et = fmtetc[0];
            var fmt = DataFormats.GetFormat(et.cfFormat);
            if (fmt.Name != "EnhancedMetafile")
    {
                continue;
            }
            System.Runtime.InteropServices.ComTypes.STGMEDIUM medium;
            iobj.GetData(ref et, out medium);
            return new Metafile(medium.unionmember, true);
        }
        return null;
    }



private void Panel_DragDrop(object sender, DragEventArgs e)
 {

    if (e.Data.GetDataPresent(DataFormats.EnhancedMetafile) & e.Data.GetDataPresent(DataFormats.MetafilePict))
    {
                    Metafile meta = GetMetafile(e.Data);
                    Image image = meta;
    }
}

在此之后您可以使用 image.Save 来保存图片,或者您可以在图片框或其他控件上使用它。

于 2016-07-01T13:49:46.490 回答
0

我认为您需要调用 new Metafile(stream) ,因为 Metafile 中没有方法.FromStream

于 2010-12-07T10:01:32.280 回答
0

我仍在挖掘他的网络以尝试不同的方式来解决我的问题。希望我发现这个未回答的线程谈论我的问题但没有任何回应:获取拖放 MS Word 图像 + DataFormats.EnhancedMetafile 和 MetafilePict:

http://www.codeguru.com/forum/showthread.php?t=456722

我与另一个 io 一起工作,能够使用 Word 2003 复制浮动图像(存储在 Shape 中而不是 InlineShape 中的图像)并粘贴到我的 winform 中。我不能粘贴第二个来源的链接(因为我在这个网站上的声誉很低),但如果有人要求我会这样做。

因此,显然存在一个常见问题,即您无法通过拖放访问存储在剪贴板中的元文件。

我仍然需要了解如何通过拖放来获取我的元文件。

于 2010-12-13T15:56:31.353 回答