Как конвертировать метафайл в изображение, перетаскивая его в Winform - PullRequest
4 голосов
/ 07 декабря 2010

Я разрабатываю приложение Winform с фреймворком .NET 3.5 на C #.Я хотел бы позволить пользователю перетаскивать изображение из Word 2007. По сути, пользователь открывает документ, выбирает изображение и перетаскивает его в свой PictureBox.

Я уже проделал тот же процесс с файлами изображений измой рабочий стол и интернет-страницы, но я не могу решить мою проблему с моим метафайлом.Я провел несколько исследований, но не нашел решений, решающих мою проблему.

Вот что я сделал с моим событием 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), но я не знаю, как преобразовать его в метафайл или лучше в объект Image.

Если у вас есть идея или решение,Я буду рад прочитать это.

Спасибо,

Ответы [ 3 ]

3 голосов
/ 01 июля 2016

Вот рабочий пример Drag n Drop из 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;
    }
}

После этого вы можете использовать изображение. Сохранить, чтобы сохранить изображение, или вы можете использовать его в картинке илидругой контроль.

0 голосов
/ 13 декабря 2010

Я все еще копаюсь в интернете, чтобы попробовать другой способ решения моей проблемы.Надеюсь, я нашел этот оставшийся без ответа поток, рассказывающий о моей проблеме, но без какого-либо ответа.Другой способ - скопировать плавающее изображение (изображение, сохраненное в Shape, а не в InlineShape) с Word 2003 и вставить в мою winform.Я не могу вставить ссылку из второго источника (из-за моей низкой репутации на этом сайте), но я сделаю это, если кто-то запросит.в ваш метафайл, сохраненный в буфере обмена и с помощью Drag & Drop.

Мне все еще нужно понять, как получить мой метафайл с помощью Drag & Drop.

0 голосов
/ 07 декабря 2010

Я думаю, что вам нужно вызвать новый метафайл (поток), так как нет метода. FromStream в Метафайл .

...