FrontPage

フォルダ指定ダイアグラムの使用

ファイルでなく、フォルダを選択するダイアグラムを使用する。

制約

.NET関数・MFCを使用しないこと。

以下のソースファイルは、ファイルハンドル、フォルダ名格納先アドレスを引数とする副関数を仮想して記述している。
プリプロセッサ部は参考までに

#include <shlobj.h>                                              // for SHBrowseForFolder                          //
#include <stdio.h>                                               // for snprintf                                   //
                                                                 //                                                //
#define         RET_OK              0                            //                                                //
#define         RET_NG              -1                           //                                                //
                                                                 //                                                //
char FolderDlg( HWND hWnd, TCHAR* de_folderName )                 //                                                //
{                                                                //                                                //
    LPMALLOC    lpMalloc = NULL;                                 // for SHGetMalloc                                //
    if( !SUCCEEDED(SHGetMalloc( &lpMalloc ) ) )                  // LPITEMIDLISTの解放                             //
    {                                                            // SHGetMallocに失敗                              //
        return ( RET_NG );                                       // 処理終了                                       //
    }                                                            //                                                //
                                                                 //                                                //
    char            di_folderName[_MAX_PATH];                    // ショートフォルダ名                             //
    BROWSEINFO      info = { 0 };                                // for SHBrowseForFolder                          //
    info.hwndOwner      = hWnd;                                  // 親ウィンドウのハンドル                         //
    info.pidlRoot       = CSIDL_DESKTOP;                         // ダイアログの初期指定ディレクトリ               //
    info.pszDisplayName = di_folderName;                         // ショートフォルダ名の受け取り                   //
    info.lpszTitle      = "StyleMod";                            // ダイアログのタイトル                           //
    info.ulFlags        = BIF_EDITBOX | BIF_STATUSTEXT |         // オプション                                     //
                            BIF_RETURNONLYFSDIRS | BIF_RETURNFSANCESTORS; //                                       //
    info.lpfn           = FDlgProc;                              // プロシージャのアドレス                         //
                                                                 //                                                //
    LPITEMIDLIST   itemList = SHBrowseForFolder( &info );        // フォルダ指定ダイアログの呼び出し               //
    if( NULL == itemList )                                       // 戻り値判定                                     //
    {                                                            // キャンセルされた場合                           //
        lpMalloc->Release();                                     // LPITEMIDLISTを解放する                         //
        return(RET_NG);                                          // 処理終了                                       //
    }                                                            //                                                //
                                                                 //                                                //
    char          lName[_MAX_PATH];                              // ロングフォルダ名                               //
    if( SHGetPathFromIDList( itemList, lName ) )                 // ロングフォルダ名の取得                         //
    {                                                            //                                                //
        snprintf( de_folderName, strlen(lName), lName );         // char型でセキュリティ重視。改良の余地あり       //
    }                                                            //                                                //
    else                                                         //                                                //
    {                                                            // ロングフォルダ名の取得に失敗した場合           //
        return ( RET_NG );                                       // 処理終了                                       //
//      snprintf(de_folderName, strlen(di_folderName), di_folderName); // または、ショートフォルダ名を返す         //
    }                                                            //                                                //
                                                                 //                                                //
    lpMalloc->Free( itemList );                                  // LPITEMIDLISTの領域を解放する                   //
    lpMalloc->Release();                                         //                                                //
                                                                 //                                                //
    return ( RET_OK );                                           // 正常終了                                       //
}

int  CALLBACK FDlgProc(HWND  hwnd, UINT  msg, LPARAM  lParam, LPARAM  lpData) // フォルダ指定用プロシージャ        //
{                                                                //                                                //
    switch(msg){                                                 // メッセージにより分岐                           //
    case BFFM_INITIALIZED:                                       // ダイアログ初期化時                             //
        break;                                                   //                                                //
                                                                 //                                                //
    case BFFM_SELCHANGED:                                        // フォルダ選択時                                 //
        {                                                        //                                                //
            char        selected[MAX_PATH];                      // 選択中フォルダのロングフォルダ名               //
                                                                 //                                                //
            if( SHGetPathFromIDList( ( LPITEMIDLIST ) lParam, selected ) ) // 選択中フォルダのロング名を取得する   //
            {                                                    // SHGetPathFromIDListに成功した場合              //
                SendMessage( hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)selected ); // ダイアログに表示                  //
            }                                                    //                                                //
            else                                                 //                                                //
            {                                                    // ロングパス取得に失敗した場合                   //
                EnableWindow( GetDlgItem( hwnd, IDOK ), FALSE ); // OKボタンを押せなくする                         //
                break;                                           // 再選択待ち                                     //
            }                                                    //                                                //
        }                                                        //                                                //
    }                                                            //                                                //
                                                                 //                                                //
    return ( RET_OK );                                           // 正常終了                                       //
}

参考ページ

http://kwi.cocolog-nifty.com/blog/2006/03/bcb_case_83d1.html


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-08 (月) 02:08:07 (5191d)