準・究極の選択

Windows APIに関する質問です。
GetOpenFileNameを使うとファイルを選択するコモンダイアログボックスが使えますが、ファイルではなくディレクトリ(フォルダー)を選択するコモンダイアログボックというのは存在するのでしょうか?

A 回答 (2件)

★シェル関数『SHBrowseForFolder』を使う


・下にサンプルを載せます。

●実装例
static int CALLBACK FuncCallBackProc( HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData )
{
 if ( uMsg == BFFM_INITIALIZED ){
  if ( HIWORD(lpData) ){
   SendMessage( hWnd, BFFM_SETSELECTION, (WPARAM)TRUE, (LPARAM)lpData );
  }
 }
 UNREFERENCED_PARAMETER( lParam );
 return( 0 );
}

extern BOOL FuncSelectFolder( HWND hWnd, LPTSTR lpGetPath, LPCTSTR lpDefPath, LPCTSTR lpTitle )
{
 ITEMIDLIST *lpIDlist;
 LPMALLOC lpMalloc;
 BROWSEINFO bi;
 
 if ( SUCCEEDED(SHGetMalloc(&lpMalloc)) ){
  if ( HIWORD(lpDefPath) ){
   bi.pidlRoot = NULL;
  }
  else{
   bi.pidlRoot = (LPCITEMIDLIST)lpDefPath;
  }
  bi.hwndOwner = hWnd;
  bi.pszDisplayName = NULL;
  bi.lpszTitle = lpTitle;
  bi.ulFlags = BIF_RETURNONLYFSDIRS;
  bi.lpfn = FuncCallBackProc;
  bi.lParam = (LPARAM)lpDefPath;
  bi.iImage = 0;
  
  if ( (lpIDlist = SHBrowseForFolder(&bi)) != NULL ){
   SHGetPathFromIDList( lpIDlist, lpGetPath );
   lpMalloc->Free( lpIDlist );
   lpMalloc->Release();
   return( TRUE );
  }
  lpMalloc->Release();
 }
 lstrcpy( lpGetPath, "" );
 return( FALSE );
}

最後に:
・『FuncSelectFolder( hWnd, szBuff, (LPCTSTR)(INT64)CSIDL_FAVORITES, TEXT("お気に入り") );』
 とすると『お気に入り』フォルダの選択画面になるよ。
・『hWnd』にウインドウ・ハンドルを指定
・『lpGetPath』に選択フォルダ名を取得
・『lpDefPath』に初期フォルダ名を指定
・『lpTitle』にタイトル文字列を指定
・戻り値は選択されれば TRUE、キャンセルならば FALSE を返す。
・以上。おわり。
    • good
    • 0
この回答へのお礼

ありがとうございました!サンプルも参考になりました。

お礼日時:2007/02/01 07:58

SHBrowseForFolder()でフォルダ選択が可能です。



参考URL:http://msdn2.microsoft.com/en-gb/library/ms64766 …
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2007/01/31 18:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報