ぴぐノート

Good code is its own best documentation.

MFC

【MFC入門】ダイアログにファイルをドラッグアンドドロップしよう【Visual C++】

投稿日:

ファイル操作を行うツールなどを作成する際には、ファイルをドラッグアンドドロップできると便利です。

ファイルがどこにあるか分からない場合などは参照させることも多いと思いますが、プログラムやファイルの検証をする場合、ファイルの配置がわかっていることも多いので必要な機能になるのではないでしょうか。

この記事ではダイアログベースのプログラムを作成し、リストボックスを一つ追加します。
そしてダイアログにファイルをドラッグアンドドロップするとリストにファイルパスが表示されるようなプログラムを作成してみましょう。

リストボックスを配置しよう

プロジェクトの作成方法:無料のVisual StudioをインストールしてMFCを動かそう

プロジェクトを作成したら早速リストボックスを配置しましょう。

  1. ツールボックスよりList Boxをクリックし、ダイアログをクリック。
    リストボックスのサイズは任意に調整します。
    mfc_drop_001
  2. リストボックスはデフォルトでリストのソートを行いますが、ドロップした順番が分からなくなるので、自動ソートはFalse(OFF)にします。
    mfc_drop_002
  3. リストボックスにメンバー変数を追加します。
    リストボックスを選択し、[右クリック] – [変数の追加]をクリックします。
    [アクセス]:private
    [変数の種類]:CListBox
    [コントロール変数]:チェック
    [カテゴリ]:Control
    [変数名]:m_List
  4. 次にダイアログにドラッグアンドドロップされた際に、メッセージが飛ぶようにメッセージを追加します。
    ダイアログ全体が選択されている状態で、[右クリック] – [クラスウィザード]をクリックします。
  5. クラスウィザード画面より、[メッセージ]タブをクリック。
    メッセージ一覧からWM_DROPFILESをクリック。
    ハンドラーの追加をクリックし、[OK]ボタンを押下します。
    mfc_drop_003

これで外観は完成です。

動作をコーディングしよう。

まずは、Dlg::OnInitDialog()で「ドラッグアンドドロップを受け付ける」関数を呼び出します。

8行目でDragAcceptFiles()の呼び出しを追加しています。

続いて前項で追加したイベントハンドラーに処理を記述します。

DragQueryFile()は第2引数に何を渡すかで戻り値が変わります。

  • -1を指定した場合:
    ドロップされたファイル数
  • 0~ドロップされたファイルの総数未満を指定し第3引数でNULLを指定した場合:
    ドロップしたファイル名を格納するのに必要なバッファーサイズ(文字単位)
    ※4行目で使用しているパターンです。
  • 0~ドロップされたファイルの総数未満を指定し第3引数でバッファーを指定した場合:
    格納した文字数が返ります。
    ※7行目はこのパターンです。

たったこれだけで完成です。簡単でしたね。
では実行して動作を確認してみてくださいね。
mfc_drop_004

まとめ

今回はリストボックスに単に表示させるだけですが、ファイルパスが分かればそのファイルを開いて書き込んだり編集なども可能になりますね。
実務上で使うプログラムのテストツールとしても利用価値の高い方法です。

テキストボックスなどを配置し、ドラッグアンドドロップしたファイルの情報などを表示させてみるのも面白いかもしれませんね。

スポンサーリンク

スポンサーリンク

-MFC

執筆者:

関連記事

【MFC】フォルダー選択ダイアログの表示【Visual C++】

出力先の指定などフォルダー選択のダイアログを表示させたいことがあります。 フォルダー選択ダイアログを表示させるためには、SHBrowseForFolder関数を使います。 SHBrowseForFol …

【MFC】マルチスレッドでプログレスバーを実装しよう その1

実は今回紹介する方法は、もしかしたら正しくないのかもしれません。 ダイアログベースのプログラムで以下の条件を満たし、プログレスバーを表示したいと考えました。 スレッド実行中はモーダルダイアログを表示さ …

【MFC入門】エディットコントロールの使い方【Visual C++】

前回はボタンが押された際のイベントハンドラーを実装しました。 今回はボタンと同じく利用機会の多いEdit Controlについて実装してみましょう。 ダイアログエディターからEdit Controlを …

【Visual C++】フルパスを指定してフォルダー階層を作成する。

MFCなどでファイル走査などのプログラミングを行っていると、D&D(ドラッグアンドドロップ)されたフォルダー内の全ファイル(サブフォルダー含め)に何か処理を行い、同じような階層を維持したまま別 …

【MFC入門】ツリーコントロールでフォルダ内のファイルを表示しよう【Visual C++】

エクスプローラーのディレクトリー構成などツリーコントロールの活用場面は多いです。 ドラッグアンドドロップされたフォルダーに格納されている、フォルダー/ファイルを表示できれば、どのファイルにアクセスする …