フォルダーを検索して List Box に表示

VC++ でエクスプローラのようにフォルダーを検索して、格納されているサブフォルダーとファイル一覧を List Box に表示します。
DlgDirList() を使えば簡単なのですが、残念ながら表示できるのはファイルやフォルダーの名前だけです。
サブフォルダーをダブルクリックすることにより、表示するフォルダーを切り替えます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクトから空のプロジェクト(DirList)を作成します。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    [EditControl] と [ListBox] と [Button] を配置して下さい。
    キャプションとIDを次のように設定して下さい。
    BOX キャプション ID
    DialogBox Dialog Folder List DIALOG1
    EditControl IDC_EDIT1
    ListBox IDC_LIST1
    Button OK IDOK
  3. DirList.cpp をフォルダーに格納して [プロジェクト] [既存項目の追加] からプロジェクトに追加します。
    [デバッグ]を選択してビルドに続いて実行を行います。
    あなたのコンピュータの C: ドライブのルートフォルダーが表示されたら完成です。
    サブフォルダーをダブルクリックするとフォルダーが切り替ります。
    親のフォルダーに戻るには「..」をダブルクリックします。

プログラムの説明

ListBox にフォルダーを表示する専用の関数が用意されています。
これを使えばフォルダー一覧を表示するのは非常に簡単です。
  1. WinMain() では DialogBox() を表示するだけです。
        int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR lpCmdLine, int nCmdShow)
        {
            DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc);
            return TRUE;
        }
        
  2. DialogBox() の CALLBACK 関数です。
    WM_INITDIALOG: で DialogBox が初期化されたときの処理を記述します。
    szTmp[255]= { "C:\\*.*" }; が最初に表示されるフォルダーです。
    フォルダーを検索してファイル一覧を List Box に表示するコードは DlgDirList() の一行だけです。
    IDC_LIST1 が List Box のIDで、IDC_EDIT1 がフォルダー名を表示する Edit Box のIDです。
        LRESULT CALLBACK DlgProc( HWND hDlg, UINT uMsg, WPARAM WP, LPARAM LP )
        {   static char szTmp[255]= { "C:\\*.*" };
            switch( uMsg )
            {   case WM_INITDIALOG:
                    DlgDirList(hDlg,szTmp,IDC_LIST1,IDC_EDIT1,DDL_DIRECTORY | DDL_DRIVES );
                    break;
        
  3. ListBox から送られてきたメッセージを受け取ります。
    case WM_COMMAND:
        switch(LOWORD(WP))
        {   case IDC_LIST1:
    
  4. ListBox がダブルクリックされたときの処理です。
    DlgDirSelectEx() でダブルクリックされたアイテムのフォルダー名を取得します。
    フォルダー名の後に "*.*" を連結して DlgDirList() で List Box に登録します。
    エラーのときは MessageBox() を表示しています。
    フォルダー以外をダブルクリックするとこのメッセージが表示されることを確かめて下さい。
        case IDC_LIST1:
            if (HIWORD(WP) == LBN_DBLCLK)
            {   if (DlgDirSelectEx(hDlg,szTmp,sizeof(szTmp),IDC_LIST1))
                {   strcat(szTmp,"*.*");
                    DlgDirList(hDlg,szTmp,IDC_LIST1,IDC_EDIT1,DDL_DIRECTORY | DDL_DRIVES);
                }
                else
                    MessageBox(hDlg,szTmp,"File Selected",MB_OK | MB_ICONINFORMATION);
             }
             break;
        
  5. Dialog Box の OK ボタンがクリックされると処理を終了します。
         case IDOK: 
             EndDialog( hDlg, IDCANCEL );
             break;
        
  6. この命令を使えば、簡単にフォルダー一覧を表示できるのですが、残念ながらエクスプローラのように 日付やサイズなどのファイル属性やファイルのアイコンを表示することはできません。
    本格的な検索と表示は Directry を List View に表示する などを参考にして下さい。

前田稔(Maeda Minoru)の超初心者のプログラム入門