【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;

    }

     

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


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

     



    calendar

    S M T W T F S
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
    << November 2017 >>

    profile

    others

    mobile

    qrcode