ぴぐノート

Good code is its own best documentation.

MFC

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

投稿日:

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

今回の記事では、ダイアログベースのアプリケーションにフォルダをドラッグアンドドロップすると、ツリーコントロールにフォルダ構成を表示するプログラムを作成します。

関連リンク:【MFC入門】ダイアログにファイルをドラッグアンドドロップしよう【Visual C++】
関連リンク:無料のVisual StudioをインストールしてMFCを動かそう

ツリーコントロールを配置しよう。

まずはリソースエディターからツリーコントロールをダイアログに配置しましょう。

  1. ダイアログベースのプロジェクトを作成。
    関連リンク:無料のVisual StudioをインストールしてMFCを動かそう
  2. ツールボックスからTree Controlを選択し、ダイアログに配置。
    mfc_tree_001
  3. 展開されているか、折りたたまれているか、親子関係の確認など外観を設定します。
    Tree Controlのプロパティから以下の設定を変更しましょう。

    :展開されていれば[-]ボタンが、折りたたまれていれば[+]ボタンを表示します。
    [Has Buttons] – True
    :親から子にラインが表示されます。
    [Has Lines] – True

  4. 次にTree Controlの状態を保持するCTreeCtrlメンバー変数を宣言します。
    Tree Controlを選択し、[右クリック] – [変数の追加]をクリックし、メンバー変数の追加ウィザードを表示します。

    [アクセス] – Private
    [変数の種類] – CTreeCtrl
    [変数名] – m_xcTree
    [コントロール変数チェックボックス] – チェック
    [カテゴリ] – Control

これでツリーコントロールを使用する準備が整いました。

ドラッグアンドドロップできるようにクラスウィザードを設定しよう。

次にドラッグアンドドロップを受け付けるようにダイアログのクラスウィザードを設定します。

  1. ダイアログが選択された状態で、[右クリック] – [クラスウィザード]をクリックします。
  2. メッセージタブから、[WM_DROPFILES]を選択し、[ハンドラーの追加]ボタンをクリックします。
  3. [OK]ボタンをクリックし、クラスウィザードを閉じます。
  4. ドラッグアンドドロップを受け付けるようにOnInitDialog()を編集します

    DragAcceptFiles()を呼び出します。

ソースコードを編集しよう

では、いよいよコーディングしていきます。
ドラッグアンドドロップされたファイルパスの取得は以前のコードと同じです。

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

初めに、前項で追加したWM_DROPFILESイベントハンドラーを編集します。

MSDN:CTreeCtrl クラス
MSDN:CTreeCtrl::InsertItem

CTreeCtrl::InsertItemには、第一引数にアイテム名、第二引数にどこに配置するかを指定します。
TVI_ROOTは最上位であるルートを指定しています。

続いて、DirectoryScannerは指定されたフォルダ内のフォルダー/ファイルを走査し、追加したルートに子アイテムを作ります。

フォルダー内にフォルダーがあれば、再帰的に呼び出して、同じ走査を繰り返します。
第二引数でどのアイテムの子として追加するかを渡しているので、ツリーコントロール上にも正しく表示されるはずです。

さて、実行して動作を確認してみましょう。

mfc_tree_003

まとめ

ファイルを走査する際にリストなどでファイルパスを取得しておけば、見つけたファイルに何か手を加える場合も簡単にできそうですね。
多数のファイルをチェックする場合など、アローキーだけでファイルを移動できるためツリーコントロールはとても便利に扱えます。

スポンサーリンク

スポンサーリンク

-MFC

執筆者:

関連記事

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

ファイル操作を行うツールなどを作成する際には、ファイルをドラッグアンドドロップできると便利です。 ファイルがどこにあるか分からない場合などは参照させることも多いと思いますが、プログラムやファイルの検証 …

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

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

【MFC入門】メッセージボックスにエラーコードを表示させよう

ライブラリなどを使用していると、戻り値にエラーコードを返す関数は比較的多いです。 GetLastError関数(最新のエラーコードを取得する関数)がライブラリに含まれていることもありますが、そうでない …

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

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

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

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