SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Windowsフォームアプリケーションにドラッグ&ドロップ機能を実装する

わずかな手間でユーザビリティがぐっと向上

画像のドラッグ&ドロップ(1)

 同じプロジェクトを使用して、デフォルトのForm1にPictureBoxコントロールをドラッグ&ドロップします(図5を参照)。

図5 Form1に^^PictureBox^^コントロールを追加
図5 Form1に^^PictureBox^^コントロールを追加

 Form1_Loadイベントで、PictureBoxコントロールのプロパティを次のように設定します。

Private Sub Form1_Load( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs) _
  Handles MyBase.Load

  '---set the control to allow drop---
  TextBox1.AllowDrop = True
  '---set the control to allow drop---
  With PictureBox1
     .AllowDrop = True
     .BorderStyle = BorderStyle.FixedSingle
     .SizeMode = PictureBoxSizeMode.StretchImage
  End With
  ...

ドロップの実装

 前の例と同じように、マウスがPictureBoxコントロール上にあるときはマウスポインタが適切に変更されるように、DragEnterイベントにコードを記述します。今回の処理で1つだけ異なるのは、PictureBoxコントロールにドロップされるデータのタイプが画像かどうかをチェックする点です。

Private Sub PictureBox1_DragEnter( _
  ByVal sender As Object, _
  ByVal e As System.Windows.Forms. _
  DragEventArgs) _
  Handles PictureBox1.DragEnter

  '---if the data to be dropped is an image format---
  If (e.Data.GetDataPresent(DataFormats.Bitmap)) Then
     '---determine if this is a copy or move---
     If (e.KeyState And CtrlMask) = CtrlMask Then
        e.Effect = DragDropEffects.Copy
     Else
        e.Effect = DragDropEffects.Move
     End If
     '---change the border style of the control---
     PictureBox1.BorderStyle = BorderStyle.Fixed3D
  End If
End Sub

 DragDropイベントでは、まず、ドロップされたオブジェクトのタイプが画像であることを確認します。画像である場合は、ドロップされた画像をPictureBoxコントロールに割り当てます。

Private Sub PictureBox1_DragDrop( _
  ByVal sender As Object, _
  ByVal e As System.Windows.Forms. _
  DragEventArgs) _
  Handles PictureBox1.DragDrop

  '---if the data to be dropped is a bitmap format---
  If (e.Data.GetDataPresent(DataFormats.Bitmap)) Then
     '---set the control to display
     ' the text being dropped---
     PictureBox1.Image = e.Data.GetData( _
        DataFormats.Bitmap)

  End If
  '---set the border style back to its original---
  PictureBox1.BorderStyle = BorderStyle.FixedSingle
End Sub

 最後にDragLeaveイベントで、PictureBoxの境界線のスタイルを元のスタイルに変更します。

Private Sub PictureBox1_DragLeave( _
  ByVal sender As Object, _
  ByVal e As System.EventArgs) _
  Handles PictureBox1.DragLeave
  '---set the borderstyle back to
  ' its original---
  PictureBox1.BorderStyle = _
     BorderStyle.FixedSingle
End Sub

 F5キーを押してアプリケーションをテストします。Microsoft Wordから画像をドラッグしてPictureBoxコントロールにドロップすると、その画像が表示されます。面白いことに、ワードパッドから画像をドラッグ&ドロップしてもPictureBoxに画像は表示されません。これについては後ほど説明します。

ドラッグの実装

 PictureBoxコントロールに表示された画像を別の場所、例えば別のコントロールやMicrosoft Word(またはワードパッド)にドラッグできるようにするには、もう少しコードを追加する必要があります。

 まず、MouseDownイベントハンドラに次のコードを記述します。PictureBoxコントロールの画像をクリックすると、このイベントが発生します。

Private Sub PictureBox1_MouseDown( _
  ByVal sender As Object, _
  ByVal e As System.Windows.Forms. _
  MouseEventArgs) _
  Handles PictureBox1.MouseDown
  If PictureBox1.Image IsNot _
     Nothing Then
     PictureBox1.DoDragDrop( _
        PictureBox1.Image, _
        DragDropEffects.Move Or _
        DragDropEffects.Copy)
  End If
End Sub

 このコードでは、PictureBoxコントロールに表示された画像をコピーするために、PictureBoxコントロールのDoDragDrop()メソッドを使用します。このメソッドの2番目のパラメータには、生じる可能性のあるドラッグ操作のタイプ(ここでは移動またはコピー)を指定します。

 作業はこれで完了です。この時点で、PictureBoxコントロールに表示された画像を別のコントロールにドラッグ&ドロップできるようになります。今度は、画像をワードパッド上にドラッグできることが分かるはずです。ただし、先ほどとは逆に、Microsoft Word上にはドラッグできません。

 ここまでのアプリケーションの動作をまとめてみましょう。

  • Microsoft Wordから画像をドラッグして、PictureBoxコントロールにドロップできます。しかし、ワードパッドからドラッグ&ドロップすることはできません。
  • PictureBoxコントロールからWord上に画像をドラッグしても、Wordは画像を受け入れません。しかし、同じ画像をワードパッド上にドラッグ&ドロップできます。

 なぜWordからは画像をドロップできて、ワードパッドからはできないのでしょうか。その理由を理解するために、アプリケーションに少し手を加えて、ドロップ操作によってPictureBoxコントロールに渡されるデータのタイプを具体的に確認できるようにしましょう。

次のページ
画像のドラッグ&ドロップ(2)

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Wei-Meng Lee(Wei-Meng Lee)

Microsoft MVP受賞者。Microsoft社の最新テクノロジー実地研修を専門とするDeveloper Learning Solutions社を創設。.NETとワイヤレステクノロジーの開発者、指導者として知られる。国際的なカンファレンスでたびたび講演し、.NET、XML、ワイヤレステクノロジーに関す...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2653 2008/07/18 10:02

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー