注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。
PictureBoxコントロールに表示されている画像をワードパッドやWordなどのアプリケーションにドラッグ&ドロップしてデータを渡す方法を紹介します。
ドラッグ&ドロップの操作を開始するには、コントロールのDoDragDropメソッドを使いますが、ワードパッドやWordにドラッグ&ドロップでデータを渡す場合は、DoDragDropメソッドのドラッグするデータに画像のImageオブジェクトやBitmapオブジェクトをそのまま指定するだけで大丈夫のようです。なお、ドラッグ&ドロップの基本的な方法については、「ドラッグ&ドロップを行う」をご覧ください。
例えば、PictureBoxコントロール(PictureBox1)のImageプロパティに設定されている画像をドラッグするためのコードは、次のようになります。ここではPictureBox1のMouseDownイベントハンドラ(PictureBox1_MouseDown)でドラッグを開始しています。
'PictureBox1のMouseDownイベントハンドラ Private Sub PictureBox1_MouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles PictureBox1.MouseDown 'ドラッグを開始する PictureBox1.DoDragDrop(PictureBox1.Image, DragDropEffects.All) End Sub
//PictureBox1のMouseDownイベントハンドラ private void PictureBox1_MouseDown( object sender, System.Windows.Forms.MouseEventArgs e) { //ドラッグを開始する PictureBox1.DoDragDrop(PictureBox1.Image, DragDropEffects.All); }
上の例ではPictureBox.Imageプロパティに設定されている画像をドラッグしていますので、「コントロールのGraphicsオブジェクトを使って、画像を表示する」で表示している画像に対しては効かないことに注意してください。
さらに、画像をアプリケーションにドロップしたときに、画像のイメージに加えさらに画像ファイルのデータを渡すための方法がニュースグループに投稿されています。
この方法によると、まずピクチャボックスに表示されている画像がファイルに保存されていない時はこれをファイルに保存してから、DataObjectオブジェクトのSetDataにより画像ファイルのパスとイメージを格納し、DoDragDropメソッドによりドラッグを行うというものです。
次にこの方法を使った例を示します。前と同様にPictureBoxコントロール(PictureBox1)のImageプロパティに設定されている画像をドラッグするものとし、この画像はすでに"C:\temp.bmp"というファイルに保存されているものとします。画像が保存されていない場合は、あらかじめSaveメソッドにより保存するようにしてください。
'PictureBox1のMouseDownイベントハンドラ Private Sub PictureBox1_MouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles PictureBox1.MouseDown '画像ファイル名の入ったstring型配列を作る Dim fileNames As String() = {"c:\temp.bmp"} 'ファイルドロップ形式でDataObjectオブジェクトを作成する Dim dataObj As New DataObject(DataFormats.FileDrop, fileNames) 'さらにビットマップ形式でも格納する dataObj.SetData(DataFormats.Bitmap, Image.FromFile(fileNames(0))) 'ドラッグを開始する PictureBox1.DoDragDrop(dataObj, DragDropEffects.All) End Sub
//PictureBox1のMouseDownイベントハンドラ private void PictureBox1_MouseDown( object sender, System.Windows.Forms.MouseEventArgs e) { //画像ファイル名の入ったstring型配列を作る string[] fileNames = {"c:\\temp.bmp"}; //ファイルドロップ形式でDataObjectオブジェクトを作成する DataObject dataObj = new DataObject(DataFormats.FileDrop, fileNames); //さらにビットマップ形式でも格納する dataObj.SetData( DataFormats.Bitmap, Image.FromFile(fileNames[0])); //ドラッグを開始する PictureBox1.DoDragDrop(dataObj,DragDropEffects.All); }
この方法でドラッグ&ドロップした場合、ドロップ先がエクスプローラである場合はもちろん、ワードパッドなど多くのアプリケーションへのドロップでも単にファイルのドロップとして扱われてしまうようです。
(この記事は、「.NETプログラミング研究 第37号」で紹介したものです。)