ファイル操作を行うツールなどを作成する際には、ファイルをドラッグアンドドロップできると便利です。
ファイルがどこにあるか分からない場合などは参照させることも多いと思いますが、プログラムやファイルの検証をする場合、ファイルの配置がわかっていることも多いので必要な機能になるのではないでしょうか。
この記事ではダイアログベースのプログラムを作成し、リストボックスを一つ追加します。
そしてダイアログにファイルをドラッグアンドドロップするとリストにファイルパスが表示されるようなプログラムを作成してみましょう。
リストボックスを配置しよう
プロジェクトの作成方法:無料のVisual StudioをインストールしてMFCを動かそう
プロジェクトを作成したら早速リストボックスを配置しましょう。
- ツールボックスよりList Boxをクリックし、ダイアログをクリック。
リストボックスのサイズは任意に調整します。
- リストボックスはデフォルトでリストのソートを行いますが、ドロップした順番が分からなくなるので、自動ソートはFalse(OFF)にします。
- リストボックスにメンバー変数を追加します。
リストボックスを選択し、[右クリック] – [変数の追加]をクリックします。
[アクセス]:private
[変数の種類]:CListBox
[コントロール変数]:チェック
[カテゴリ]:Control
[変数名]:m_List - 次にダイアログにドラッグアンドドロップされた際に、メッセージが飛ぶようにメッセージを追加します。
ダイアログ全体が選択されている状態で、[右クリック] – [クラスウィザード]をクリックします。 - クラスウィザード画面より、[メッセージ]タブをクリック。
メッセージ一覧からWM_DROPFILESをクリック。
ハンドラーの追加をクリックし、[OK]ボタンを押下します。
これで外観は完成です。
動作をコーディングしよう。
まずは、Dlg::OnInitDialog()で「ドラッグアンドドロップを受け付ける」関数を呼び出します。
1 2 3 4 5 6 7 8 9 10 11 |
BOOL CDragAndDropDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // ... 中略 // TODO: 初期化をここに追加します。 DragAcceptFiles(); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } |
8行目でDragAcceptFiles()の呼び出しを追加しています。
続いて前項で追加したイベントハンドラーに処理を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void CDragAndDropDlg::OnDropFiles(HDROP hDropInfo) { // TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。 UINT length = DragQueryFile(hDropInfo, 0, NULL, 0); CString csfile; DragQueryFile(hDropInfo, 0, csfile.GetBuffer(length + 1), length + 1); csfile.ReleaseBuffer(); m_List.AddString(csfile); CDialogEx::OnDropFiles(hDropInfo); } |
DragQueryFile()は第2引数に何を渡すかで戻り値が変わります。
- -1を指定した場合:
ドロップされたファイル数 - 0~ドロップされたファイルの総数未満を指定し第3引数でNULLを指定した場合:
ドロップしたファイル名を格納するのに必要なバッファーサイズ(文字単位)
※4行目で使用しているパターンです。 - 0~ドロップされたファイルの総数未満を指定し第3引数でバッファーを指定した場合:
格納した文字数が返ります。
※7行目はこのパターンです。
たったこれだけで完成です。簡単でしたね。
では実行して動作を確認してみてくださいね。
まとめ
今回はリストボックスに単に表示させるだけですが、ファイルパスが分かればそのファイルを開いて書き込んだり編集なども可能になりますね。
実務上で使うプログラムのテストツールとしても利用価値の高い方法です。
テキストボックスなどを配置し、ドラッグアンドドロップしたファイルの情報などを表示させてみるのも面白いかもしれませんね。