この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
ファイルを扱うWindowsアプリケーションでは、エクスプローラからのドラッグ&ドロップ(以下、D&D)に対応することで、対象となるファイルの指定を簡単に行えるようにできる。
エクスプローラからファイルのD&Dを受け付けるようにするには、最低限、次の3つの作業を行えばよい。
以下では、2と3のイベント・ハンドラでの記述内容について解説する。
ちなみに、Visual Studioでフォームにイベント・ハンドラを追加するには、[プロパティ]ウィンドウの[イベント]ボタンをクリックしてイベント一覧を表示し、「DragEnter」や「DragDrop」の欄をマウスでダブルクリックすればよい。
DragEnterイベントは、ファイルをドラッグ中のマウス・カーソルがフォーム上に入ったときに発生する。
このときには、次のリスト1のように、ドラッグ中のデータ(e.Data)の形式がファイル(DataFormats.FileDrop)であることをGetDataPresentメソッドにより確認し、もしそうであれば、受け付けるドロップ操作(e.Effect)としてコピー(DragDropEffects.Copy)を設定する。
private void Form1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
e.Effect = DragDropEffects.Copy;
}
}
Private Sub Form1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles MyBase.DragEnter
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
e.Effect = DragDropEffects.Copy
End If
End Sub
このコードにより、ファイルをドラッグ中のマウス・カーソルには「+」マークが表示され、アプリケーションへのファイルのドロップが可能であることを示すようになる。「e.Effect」の初期値は「DragDropEffects.None」であるが、ここではこれ以外の値を設定しないと後続のDragDropイベントは発生しない。
ただし、リスト1のコードはエクスプローラからフォルダがドロップされた場合にも「+」マークが表示され、ドロップを受け付けてしまう。
厳密にファイルのみをドロップ可能にするには、次のリスト2のようにして、ドラッグ中のデータがすべてファイルかどうかをチェックする必要がある。
private void Form1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
// ドラッグ中のファイルやディレクトリの取得
string[] drags = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string d in drags)
{
if (!System.IO.File.Exists(d))
{
// ファイル以外であればイベント・ハンドラを抜ける
return;
}
}
e.Effect = DragDropEffects.Copy;
}
}
Private Sub Form1_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
' ドラッグ中のファイルやディレクトリの取得
Dim drags() As String = _
CType(e.Data.GetData(DataFormats.FileDrop), String())
For Each d As String In drags
If Not System.IO.File.Exists(d) Then
' ファイル以外であればイベント・ハンドラを抜ける
Return
End If
Next
e.Effect = DragDropEffects.Copy
End If
End Sub
リスト1では、ドラッグ中のデータの形式を確認するのにGetDataPresentメソッドを使用したが、そのデータの内容を取得する場合にはGetDataメソッドを使用する。このメソッドの戻り値の型はObject型だが、データがファイル形式の場合(パラメータにDataFormats.FileDropを指定した場合)には、戻り値はファイルやディレクトリのパス(文字列)の配列となるので、文字列配列へのキャストが必要となる。
Copyright© Digital Advantage Corp. All Rights Reserved.