特別なコントロールにドラッグ&ドロップを実装
ほとんどのWindows Formsコントロールは、この記事で説明したドラッグ&ドロップ操作のためのイベント一式(またはその一部)をサポートします。しかし、ドラッグ&ドロップを可能にしたいコントロールが、標準的なイベントをサポートしていない場合はどうすればよいでしょうか。良い例がWindows Media Player ActiveXコントロールです。WindowsアプリケーションにWindows Media Playerコントロールを埋め込めばユーザーがメディアファイルをドラッグ&ドロップしただけで再生できるようになると思うかもしれませんが、残念ながら、Windows Media Player ActiveXコントロールはDragEnterやDragDropのようなイベントをサポートしていません。従って、直接ドラッグ&ドロップを実装する簡単な方法はありません。
この問題に対処するには、ユーザーコントロールを使用してActiveXコントロールをラッピングします。そのためには、現在のプロジェクトにユーザーコントロールを新たに追加します(ソリューションエクスプローラでプロジェクト名を右クリックして[Add]→[New Item]を選択して、[User Control]を選択)。そのファイルに「MediaPlayer.vb」という名前を付けます。
ツールボックスにWindows Media Playerを追加します。そのためには、ツールボックスを右クリックして、[Choose Items]を選択します。[Choose Toolbox Items]ダイアログボックスで、[COM Components]タブをクリックして、[Windows Media Player]のチェックボックスをオンにします(図10を参照)。[OK]をクリックすると、ツールボックスにWindows Media Playerコントロールが追加されます。
ツールボックスからWindows Media Playerコントロールをドラッグして、MediaPlayer.vbのデザイン画面上にドロップします(図11を参照)。

これで、MediaPlayerユーザーコントロールがツールボックスに表示されるはずです(図12を参照)。

Form1にMediaPlayerユーザーコントロールをドラッグ&ドロップします(図13を参照)。

MediaPlayer.vbのコードビューで、次のコードを追加します。
Public Class MediaPlayer Private _URL As String Public Property URL() As String Get Return _URL End Get Set(ByVal value As String) _URL = value AxWindowsMediaPlayer1. _ URL = _URL End Set End Property End Class
原則的に、再生するメディアファイルのURLはユーザーに設定させるため、URLプロパティを公開します。
Form1のコードビハインド(分離コード)に移って、MediaPlayerユーザーコントロールのDragEnterイベントに次のようなコードを記述します。
Private Sub MediaPlayer1_DragEnter( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs) _ Handles MediaPlayer1.DragEnter '---if the data to be dropped is ' an filedrop format--- If (e.Data.GetDataPresent( _ DataFormats.FileDrop)) 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 End If End Sub
最後に、ユーザーがドロップしたメディアファイルを再生するためのコードをDragDropイベントに記述します。
Private Sub MediaPlayer1_DragDrop( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms. _ DragEventArgs) _ Handles MediaPlayer1.DragDrop If (e.Data.GetDataPresent( _ DataFormats.FileDrop)) Then Dim files() As String '---get all the file names--- files = e.Data.GetData( _ DataFormats.FileDrop) If files.Length > 0 Then '---load only the first file--- files(0) = UCase(files(0)) If files(0).EndsWith(."WMV") Then '---get the media player to play the ' first file--- MediaPlayer1.URL = files(0) End If End If End If End Sub
このコントロールには複数のファイルをドロップできるので、MediaPlayerコントロールでは最初のファイルだけをロードする点に注意してください。
図14は、Windowsフォームの中にあるMediaPlayerコントロールが、ドロップされたファイルを再生しているところを示しています。


