Last Updated 2002/09/27
Programming Tips Visual C++ API  索 引 
SHBrowseForFolder(フォルダ選択ダイアログ)
2002/09/27

フォルダ選択ダイアログを表示する.

    BROWSEINFO      bi;
    LPSTR           lpBuffer;
    LPITEMIDLIST    pidlRoot;      // ブラウズのルートPIDL
    LPITEMIDLIST    pidlBrowse;    // ユーザーが選択したPIDL
    LPMALLOC        lpMalloc = NULL;

    HRESULT hr = SHGetMalloc(&lpMalloc);
    if(FAILED(hr)) return;

    // ブラウズ情報受け取りバッファ領域の確保
    if ((lpBuffer = (LPSTR) lpMalloc->Alloc(_MAX_PATH)) == NULL) {
        return;
    }
    // ダイアログ表示時のルートフォルダのPIDLを取得
    // ※以下はデスクトップをルートとしている。デスクトップをルートとする
    //   場合は、単に bi.pidlRoot に0を設定するだけでもよい。その他の特
    //   殊フォルダをルートとする事もできる。詳細はSHGetSpecialFolderLoca
    //   tionのヘルプを参照の事。
    if (!SUCCEEDED(SHGetSpecialFolderLocation(  hWnd,
                                                CSIDL_DESKTOP,
                                                &pidlRoot)) { 
        lpMalloc->Free(lpBuffer);
        return;
    }
    // BROWSEINFO構造体の初期値設定
    // ※BROWSEINFO構造体の各メンバの詳細説明もヘルプを参照
    bi.hwndOwner = hWnd;
    bi.pidlRoot = pidlRoot;
    bi.pszDisplayName = lpBuffer;
    bi.lpszTitle = "フォルダを選択して下さい";
    bi.ulFlags = 0;
    bi.lpfn = 0;
    bi.lParam = 0;
    // フォルダ選択ダイアログの表示 
    pidlBrowse = SHBrowseForFolder(&bi);
    if (pidlBrowse != NULL) {  
        // PIDL形式の戻り値のファイルシステムのパスに変換
        if (SHGetPathFromIDList(pidlBrowse, lpBuffer)) {
            // 取得成功
                 ・
                 ・
                 ・
        }
        // SHBrowseForFolderの戻り値PIDLを解放
        lpMalloc->Free(pidlBrowse);
    }
    // クリーンアップ処理
    lpMalloc->Free(pidlRoot); 
    lpMalloc->Free(lpBuffer);
    lpMalloc->Release();



ダイアログ表示時に特定のフォルダを選択状態にするには,コールバック関数を定義して,BROWSEINFO 構造体の初期設定を以下のようにする.

int CALLBACK callback(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) {
    if(uMsg == BFFM_INITIALIZED) {
        SendMessage(hWnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
    }
    return 0;
}

    // BROWSEINFO構造体の初期値設定
          ・
          ・
          ・
    bi.lpfn = callback; // コールバック関数のアドレスを設定
    bi.lParam = (LPARAM)"C:\\HogeHoge";  // 指定したいパスを設定


現在指定されているパスを取得するには,コールバック関数にて BFFM_SELCHANGED を処理する.
    if( uMsg == BFFM_SELCHANGED ) {
        if( SHGetPathFromIDList((LPCITEMIDLIST)lParam, lpPath) ) {
            SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)lpPath);
        }
    }
とすれば lpPath にパスが取得される.


OK ボタンのキャプションを変更するには,BFFM_INITIALIZED にて
    SetWindowText( GetDlgItem( hwnd, IDOK), "OKOK");
などとする.
(BFFM_SETOKTEXT というメッセージもある)


参照
クラス内コールバック関数
フォルダ選択ダイアログにてフォルダの作成
SHBrowseForFolder(フォルダ選択ダイアログ)にボタン追加
SHBrowseForFolderでルートフォルダの指定
前後のTips
SHBrowseForFolder(フォルダ選択ダイアログ)

DSS ProgrammingTipsCGI Ver2.02