DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

PictureBoxに表示されている画像をドラッグ&ドロップする

注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。

PictureBoxコントロールに表示されている画像をワードパッドやWordなどのアプリケーションにドラッグ&ドロップしてデータを渡す方法を紹介します。

ドラッグ&ドロップの操作を開始するには、コントロールのDoDragDropメソッドを使いますが、ワードパッドやWordにドラッグ&ドロップでデータを渡す場合は、DoDragDropメソッドのドラッグするデータに画像のImageオブジェクトやBitmapオブジェクトをそのまま指定するだけで大丈夫のようです。なお、ドラッグ&ドロップの基本的な方法については、「ドラッグ&ドロップを行う」をご覧ください。

例えば、PictureBoxコントロール(PictureBox1)のImageプロパティに設定されている画像をドラッグするためのコードは、次のようになります。ここではPictureBox1のMouseDownイベントハンドラ(PictureBox1_MouseDown)でドラッグを開始しています。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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メソッドにより保存するようにしてください。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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);
}

この方法でドラッグ&ドロップした場合、ドロップ先がエクスプローラである場合はもちろん、ワードパッドなど多くのアプリケーションへのドロップでも単にファイルのドロップとして扱われてしまうようです。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。