【VC++】フォルダ選択ダイアログを表示する

0

    <機能>
    フォルダ選択ダイアログを表示してエディットボックスにパスを表示します

    <使い方>

    1. MFCアプリケーションのダイアログベースでプロジェクトを作成
    2. パスを表示するエディットボックス(IDC_EDITPATH)、フォルダ選択ボタン(IDC_BTNSEL)を配置
    3. エディットボックスにCString型のメンバ変数(m_csPath)を追加
      メンバ変数を追加、フォルダ選択、ダイアログ、VC、VC++
    4. 構成プロパティ > 全般 > 文字セット で「マルチバイト文字セットを使用する」を選択
      マルチバイト文字セットを使用する、フォルダ選択、ダイアログ、VC、VC++


    <イメージ>
    BROWSEINFO構造体にBIF_NEWDIALOGSTYLE(新規フォルダ作成できる)を指定した場合とBIF_RETURNONLYFSDIRS(ファイルシステムのディレクトリのみ選択できる)を指定した場合のダイアログ
    新しいフォルダの作成、フォルダ選択、ダイアログ、VC、VC++

    ファイルシステム選択のみ、フォルダ選択、ダイアログ、VC、VC++
    他にもいろいろオプションがありますので試してみてください
    msdnは英語ページしかないみたいです
     

    //ヘッダーファイルかどこかでプロトタイプ宣言する
    //プロトタイプ宣言

    BOOL SelectFolder(HWND hWnd, LPCTSTR lpDefFolder, LPTSTR lpSelectPath, UINT iFlg, CString ttl);
    int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData);

     

    //InitDialogでエディットボックスの初期化を行う
    BOOL CSelectFolderTestDlg::OnInitDialog()
    {
        //~省略~

     

        //エディットボックスの初期化
        m_csPath = "";
        UpdateData(FALSE);
        //~省略~
    }

     

    /*******************************************************
    [フォルダ選択]ボタン押下イベント
    *******************************************************/

    void CSelectFolderTestDlg::OnBnClickedBtnsel()
    {
        char cDirSel[MAX_LEN] = { '¥0' };
        UpdateData(TRUE);

     

        //フォルダ選択ダイアログオプション:
        //BIF_NEWDIALOGSTYLE(新規フォルダ作成できる)
        //BIF_RETURNONLYFSDIRS(ファイルシステムのディレクトリのみ選択できる)

        if (SelectFolder(this->m_hWnd, m_csPath, cDirSel, BIF_RETURNONLYFSDIRS, "XXXフォルダーを選択してください"))
        {
            m_csPath = cDirSel;
            UpdateData(FALSE);
        }
    }

     

    /*******************************************************
    フォルダを指定(SelectFolder)
    引数(IN):
     hWnd ウインドウハンドル
     lpDefFolder デフォルトで表示するフォルダパス
     iFlg ダイアログオプション
     ttl ダイアログのタイトルテキスト
    引数(OUT):
     lpSelectPath 選択されたフォルダパス
    *******************************************************/

    BOOL SelectFolder(HWND hWnd, LPCTSTR lpDefFolder, LPTSTR lpSelectPath, UINT iFlg, CString ttl)
    {
        LPMALLOC    pMalloc;
        BOOL        brtn = FALSE;

     

        //IMallocインターフェイスへのポインタを取得
        if (SUCCEEDED(SHGetMalloc(&pMalloc)))
        {
            BROWSEINFO        brows;
            ITEMIDLIST        *pIDlist;
            //BROWSEINFO構造体の初期化
            memset(&brows, NULL, sizeof(brows));
            //BROWSEINFO構造体に値をセット
            brows.hwndOwner = hWnd;
            brows.pszDisplayName = lpSelectPath;
            brows.lpszTitle = ttl;
            brows.lParam = (LPARAM)lpDefFolder;
            brows.pidlRoot = NULL;
            brows.ulFlags = iFlg;
            brows.lpfn = &BrowseCallbackProc;
            brows.iImage = (int)NULL;
            //フォルダ選択ダイアログの表示
            pIDlist = SHBrowseForFolder(&brows);
            if (pIDlist == NULL)
                //何も選択されなければデフォルトフォルダを返す
                strcpy_s(lpSelectPath, MAX_LEN, lpDefFolder);
            else {
                //ITEMIDLIST からフルパスを得る
                SHGetPathFromIDList(pIDlist, lpSelectPath);
                brtn = TRUE;
                //ITEMIDLIST の開放
                pMalloc->Free(pIDlist);
            }
            pMalloc->Release();
        }
        return    brtn;
    }
    int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
    {
        switch (uMsg)
        {
        case BFFM_INITIALIZED:
            //初期化処理(初期表示フォルダ指定)
            SendMessage(hWnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
            break;
        case BFFM_SELCHANGED:
            //フォルダ選択ダイアログでフォルダが選択された時に処理が必要であればここに記載
            TRACE("フォルダが選択されました¥r¥n");
            break;
        }
        return 0;
    }

     

    よろしければポチッと押してください


    プログラマー ブログランキングへ

     



    selected entries

    categories

    calendar

    S M T W T F S
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
    << November 2018 >>

    profile

    others

    archives