wafuの技術

技術習得の努力メモです。

win32apiでフォルダ選択画面

フォルダ選択画面で遊んでみました。

 

BOOL GetOpenDirectoryName( HWND hwndOwner, LPCTSTR lpszDefaultFolder, LPTSTR lpszBuffer, DWORD dwBufferSize )
{
     BROWSEINFO bi;
     ZeroMemory( &bi, sizeof( BROWSEINFO ));
     bi.hwndOwner = hwndOwner;
     bi.lpfn = NULL;
     bi.lParam = (LPARAM)lpszDefaultFolder; // デフォルトで選択させておくフォルダを指定
     bi.lpszTitle = L"フォルダを選択してください"; // タイトルの指定

     LPITEMIDLIST pidlRoot; // ブラウズのルートPIDL
     pidlRoot = ::ILCreateFromPath(L"c:"); //フォルダ名がPIDLの取得

     bi.pidlRoot = pidlRoot; //2021/03/28
     bi.ulFlags = BIF_NEWDIALOGSTYLE |BIF_BROWSEINCLUDEFILES |BIF_EDITBOX;
     LPITEMIDLIST pidl = SHBrowseForFolder( &bi ); // フォルダダイアログの起動

    if( pidl )
      {
           // 選択されたフォルダ名を取得  
          wchar_t szSelectedFolder[4096];
           SHGetPathFromIDList( pidl, szSelectedFolder );
           ::CoTaskMemFree( pidl );

            if( (DWORD)wcslen(szSelectedFolder) < dwBufferSize )
            {
                       wcsncpy_s( lpszBuffer, dwBufferSize, szSelectedFolder, _TRUNCATE );
                      // フォルダが選択された
                      return TRUE;
             }
       }
      // フォルダは選択されなかった
      return FALSE;
}