EMF/WMF形式のイメージをドラッグ&ドロップでWORDやEXCELに貼り付ける
通常のオブジェクトの場合の方法は、「ドラッグ & ドロップを実装したい」で示しました。
しかしその方法はEMF/WMF形式のイメージの場合うまくいきません。.NET FrameworkのDataObjectクラスがEMF/WMFをサポートしていないためです。
正攻法は、Windows Native APIを用いて、IDataObject COMインターフェースをサポートした独自のDataObjectを実装することです。
しかし、これはかなりやっかいです。簡便な代替方法として、ファイル経由で実現する方法を紹介します。
次のように、一時的にEMF/WMFファイルを生成し、それを利用します。
※ WORDは問題ないのですが、なぜかEXCELはBitmapも含めていないとうまくいかない模様。理由は不明です。
// ドラッグ元: ドラッグを開始する
private void srcPictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
string tempPath = System.IO.Path.GetTempPath() + "temp.emf";
Bitmap bitmap = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(bitmap);
IntPtr hDC = g.GetHdc();
RectangleF rect = stampInfo.GetFrameRect(pixelSize);
Metafile meta = new Metafile(tempPath, hDC, rect, MetafileFrameUnit.Pixel, EmfType.EmfPlusDual);
:
: (Metafileの描画処理)
:
pictureBox.Image = meta;
g.ReleaseHdc();
g.Dispose();
bitmap.Dispose();
meta.Dispose();
DataObject dataObj = new DataObject("");
string[] fileNames = { tempPath };
dataObj.SetData(DataFormats.FileDrop, fileNames);
dataObj.SetData(new Bitmap(meta));
((PictureBox)sender).DoDragDrop(dataObj, DragDropEffects.Copy);
}
}