2010-12-07 17 views
4

Je développe une application Winform avec le framlework .NET 3.5 en C#. Je voudrais permettre à l'utilisateur de faire glisser & déposer une image à partir de Word 2007. Fondamentalement, l'utilisateur ouvre le docx, sélectionnez une image et faites glisser & déposez-les dans mon PictureBox.Comment faire pour convertir un métafichier en image par Drag'n'Droping dans un Winform

J'ai déjà effectué le même processus avec des fichiers d'image de mon bureau et de pages Internet, mais je ne peux pas résoudre mon problème avec mon métafichier. J'ai fait quelques recherches mais je n'ai trouvé aucune solution pour résoudre mon problème.

Voici ce que je l'ai fait sur mon Drag & événement 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));  
    } 
    } 

Je peux obtenir un flux avec ce code: (flux) e.Data.GetData (DataFormats.MetafilePict) mais je ne Je ne sais pas comment le convertir en un métafichier ou mieux un objet Image.

Si vous avez une idée ou une solution, je serai heureux de le lire.

Merci,

Répondre

0

Je pense que vous devez appeler nouveau Metafile (flux) car il n'y a pas de méthode .FromStream dans Metafile.

+0

Oui, c'est vrai. J'ai essayé votre chemin mais j'ai une erreur dans le GDI +. Comment pourrais-je savoir quel type d'objet est mon flux? – Joss

+0

Jetez un oeil à la documentation MetaFilePict ici: http://msdn.microsoft.com/en-us/library/system.windows.forms.dataformats.metafilepict.aspx - peut-être c'est votre cas. Sinon, devrait fonctionner ... –

0

Je suis toujours en train de creuser dans le web pour essayer de différentes façons de résoudre mon problème. Espérons que j'ai trouvé ce fil sans réponse parler de mon problème, mais sans réponse: Get glisser & déposer une image MS Word + DataFormats.EnhancedMetafile & METAFILEPICT:

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

Je travaille autour avec un autre io pouvoir copier une image flottante (image stockée dans Shape et non InlineShape) avec Word 2003 et coller dans ma winform. Je ne peux pas coller le lien de la deuxième source (à cause de ma mauvaise réputation sur ce site) mais je le ferai si quelqu'un le demande.

Donc apparemment il y a un problème commun avec le fait que vous ne pouvez pas accéder à votre Metafile stocké dans le Presse-papiers et par glisser & Drop.

Je dois encore comprendre comment obtenir mon métafichier par Drag & Drop.

2

Voici un exemple de travail de Drag n drop à partir de Word (pas pour PowerPoint et 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; 
    } 
} 

Après cela, vous pouvez utiliser image.Save pour enregistrer l'image ou vous pouvez l'utiliser sur picturebox ou autre contrôle.