フォルダ選択ダイアログを Unicode版に置き換え
- doSelectFolderW()を使用するよう変更
@@ -1079,7 +1079,7 @@ | ||
1079 | 1079 | // |
1080 | 1080 | // cf. http://homepage2.nifty.com/DSS/VCPP/API/SHBrowseForFolder.htm |
1081 | 1081 | // |
1082 | -int CALLBACK setDefaultFolder(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) | |
1082 | +static int CALLBACK setDefaultFolder(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) | |
1083 | 1083 | { |
1084 | 1084 | if(uMsg == BFFM_INITIALIZED) { |
1085 | 1085 | SendMessage(hwnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData); |
@@ -1114,10 +1114,10 @@ | ||
1114 | 1114 | bi.lpfn = setDefaultFolder; |
1115 | 1115 | bi.lParam = (LPARAM)def; |
1116 | 1116 | // フォルダ選択ダイアログの表示 |
1117 | - pidlBrowse = SHBrowseForFolder(&bi); | |
1117 | + pidlBrowse = SHBrowseForFolderA(&bi); | |
1118 | 1118 | if (pidlBrowse != NULL) { |
1119 | 1119 | // PIDL形式の戻り値のファイルシステムのパスに変換 |
1120 | - if (SHGetPathFromIDList(pidlBrowse, buf)) { | |
1120 | + if (SHGetPathFromIDListA(pidlBrowse, buf)) { | |
1121 | 1121 | // 取得成功 |
1122 | 1122 | strncpy_s(path, pathlen, buf, _TRUNCATE); |
1123 | 1123 | ret = TRUE; |
@@ -83,6 +83,7 @@ | ||
83 | 83 | void get_lang_msgW(const char *key, wchar_t *buf, int buf_len, const wchar_t *def, const char *iniFile); |
84 | 84 | int get_lang_font(PCHAR key, HWND dlg, PLOGFONT logfont, HFONT *font, const char *iniFile); |
85 | 85 | DllExport BOOL doSelectFolder(HWND hWnd, char *path, int pathlen, const char *def, const char *msg); |
86 | +BOOL doSelectFolderW(HWND hWnd, wchar_t *path, int pathlen, const wchar_t *def, const wchar_t *msg); | |
86 | 87 | DllExport void OutputDebugPrintf(const char *fmt, ...); |
87 | 88 | void OutputDebugPrintfW(const wchar_t *fmt, ...); |
88 | 89 | DllExport DWORD get_OPENFILENAME_SIZEA(); |
@@ -127,14 +128,12 @@ | ||
127 | 128 | void SetDlgMenuTexts(HMENU hMenu, const DlgTextInfo *infos, int infoCount, const char *UILanguageFile); |
128 | 129 | int GetMonitorDpiFromWindow(HWND hWnd); |
129 | 130 | |
131 | +#define get_OPENFILENAME_SIZE() get_OPENFILENAME_SIZEA() | |
132 | + | |
130 | 133 | #if defined(_UNICODE) |
131 | -#define doSelectFolderT(p1, p2, p3, p4, p5) doSelectFolderW(p1, p2, p3, p4, p5) | |
132 | 134 | #define get_lang_msgT(p1, p2, p3, p4, p5) get_lang_msgW(p1, p2, p3, p4, p5) |
133 | -#define get_OPENFILENAME_SIZE() get_OPENFILENAME_SIZEW() | |
134 | 135 | #else |
135 | -#define doSelectFolderT(p1, p2, p3, p4, p5) doSelectFolder(p1, p2, p3, p4, p5) | |
136 | 136 | #define get_lang_msgT(p1, p2, p3, p4, p5) get_lang_msg(p1, p2, p3, p4, p5) |
137 | -#define get_OPENFILENAME_SIZE() get_OPENFILENAME_SIZEA() | |
138 | 137 | #endif |
139 | 138 | |
140 | 139 | /* |
@@ -290,4 +290,56 @@ | ||
290 | 290 | _OutputDebugStringW(tmp); |
291 | 291 | } |
292 | 292 | |
293 | +static int CALLBACK setDefaultFolder(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) | |
294 | +{ | |
295 | + if(uMsg == BFFM_INITIALIZED) { | |
296 | + SendMessage(hwnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData); | |
297 | + } | |
298 | + return 0; | |
299 | +} | |
300 | + | |
301 | +BOOL doSelectFolderW(HWND hWnd, wchar_t *path, int pathlen, const wchar_t *def, const wchar_t *msg) | |
302 | +{ | |
303 | + BROWSEINFOW bi; | |
304 | + LPITEMIDLIST pidlRoot; // ブラウズのルートPIDL | |
305 | + LPITEMIDLIST pidlBrowse; // ユーザーが選択したPIDL | |
306 | + wchar_t buf[MAX_PATH]; | |
307 | + BOOL ret = FALSE; | |
308 | + | |
309 | + // ダイアログ表示時のルートフォルダのPIDLを取得 | |
310 | + // ※以下はデスクトップをルートとしている。デスクトップをルートとする | |
311 | + // 場合は、単に bi.pidlRoot に0を設定するだけでもよい。その他の特 | |
312 | + // 殊フォルダをルートとする事もできる。詳細はSHGetSpecialFolderLoca | |
313 | + // tionのヘルプを参照の事。 | |
314 | + if (!SUCCEEDED(SHGetSpecialFolderLocation(hWnd, CSIDL_DESKTOP, &pidlRoot))) { | |
315 | + return FALSE; | |
316 | + } | |
317 | + | |
318 | + // BROWSEINFO構造体の初期値設定 | |
319 | + // ※BROWSEINFO構造体の各メンバの詳細説明もヘルプを参照 | |
320 | + bi.hwndOwner = hWnd; | |
321 | + bi.pidlRoot = pidlRoot; | |
322 | + bi.pszDisplayName = buf; | |
323 | + bi.lpszTitle = msg; | |
324 | + bi.ulFlags = 0; | |
325 | + bi.lpfn = setDefaultFolder; | |
326 | + bi.lParam = (LPARAM)def; | |
327 | + // フォルダ選択ダイアログの表示 | |
328 | + pidlBrowse = _SHBrowseForFolderW(&bi); | |
329 | + if (pidlBrowse != NULL) { | |
330 | + // PIDL形式の戻り値のファイルシステムのパスに変換 | |
331 | + if (_SHGetPathFromIDListW(pidlBrowse, buf)) { | |
332 | + // 取得成功 | |
333 | + wcsncpy_s(path, pathlen, buf, _TRUNCATE); | |
334 | + ret = TRUE; | |
335 | + } | |
336 | + // SHBrowseForFolderの戻り値PIDLを解放 | |
337 | + CoTaskMemFree(pidlBrowse); | |
338 | + } | |
339 | + // クリーンアップ処理 | |
340 | + CoTaskMemFree(pidlRoot); | |
341 | + | |
342 | + return ret; | |
343 | +} | |
344 | + | |
293 | 345 | /* vim: set ts=4 sw=4 ff=dos : */ |
@@ -1422,15 +1422,15 @@ | ||
1422 | 1422 | |
1423 | 1423 | case IDC_DEFAULTPATH_PUSH | (BN_CLICKED << 16): |
1424 | 1424 | // ログディレクトリの選択ダイアログ |
1425 | - get_lang_msg("FILEDLG_SELECT_LOGDIR_TITLE", ts.UIMsg, sizeof(ts.UIMsg), | |
1426 | - "Select log folder", ts.UILanguageFile); | |
1427 | 1425 | { |
1428 | - char buf[MAX_PATH]; | |
1429 | - char buf2[MAX_PATH]; | |
1430 | - GetDlgItemTextA(IDC_DEFAULTPATH_EDITOR, buf, sizeof(buf)); | |
1431 | - if (doSelectFolder(GetSafeHwnd(), buf2, sizeof(buf2), buf, ts.UIMsg)) { | |
1432 | - SetDlgItemTextA(IDC_DEFAULTPATH_EDITOR, buf2); | |
1426 | + wchar_t *title = TTGetLangStrW("Tera Term", "FILEDLG_SELECT_LOGDIR_TITLE", L"Select log folder", ts.UILanguageFile); | |
1427 | + wchar_t buf[MAX_PATH]; | |
1428 | + wchar_t buf2[MAX_PATH]; | |
1429 | + GetDlgItemTextW(IDC_DEFAULTPATH_EDITOR, buf, _countof(buf)); | |
1430 | + if (doSelectFolderW(GetSafeHwnd(), buf2, _countof(buf2), buf, title)) { | |
1431 | + SetDlgItemTextW(IDC_DEFAULTPATH_EDITOR, buf2); | |
1433 | 1432 | } |
1433 | + free(title); | |
1434 | 1434 | } |
1435 | 1435 | |
1436 | 1436 | return TRUE; |
@@ -1659,17 +1659,17 @@ | ||
1659 | 1659 | |
1660 | 1660 | BOOL CCygwinPropPageDlg::OnCommand(WPARAM wParam, LPARAM lParam) |
1661 | 1661 | { |
1662 | - char buf[MAX_PATH], buf2[MAX_PATH]; | |
1662 | + wchar_t buf[MAX_PATH], buf2[MAX_PATH]; | |
1663 | 1663 | |
1664 | 1664 | switch (wParam) { |
1665 | 1665 | case IDC_SELECT_FILE | (BN_CLICKED << 16): |
1666 | 1666 | // Cygwin install ディレクトリの選択ダイアログ |
1667 | - get_lang_msg("DIRDLG_CYGTERM_DIR_TITLE", ts.UIMsg, sizeof(ts.UIMsg), | |
1668 | - "Select Cygwin directory", ts.UILanguageFile); | |
1669 | - GetDlgItemTextA(IDC_CYGWIN_PATH, buf, sizeof(buf)); | |
1670 | - if (doSelectFolder(GetSafeHwnd(), buf2, sizeof(buf2), buf, ts.UIMsg)) { | |
1671 | - SetDlgItemTextA(IDC_CYGWIN_PATH, buf2); | |
1667 | + wchar_t *title = TTGetLangStrW("Tera Term", "DIRDLG_CYGTERM_DIR_TITLE", L"Select Cygwin directory", ts.UILanguageFile); | |
1668 | + GetDlgItemTextW(IDC_CYGWIN_PATH, buf, _countof(buf)); | |
1669 | + if (doSelectFolderW(GetSafeHwnd(), buf2, _countof(buf2), buf, title)) { | |
1670 | + SetDlgItemTextW(IDC_CYGWIN_PATH, buf2); | |
1672 | 1671 | } |
1672 | + free(title); | |
1673 | 1673 | return TRUE; |
1674 | 1674 | } |
1675 | 1675 |
@@ -323,9 +323,9 @@ | ||
323 | 323 | if (CheckVar("inputstr", &ValType, &VarId) && |
324 | 324 | (ValType == TypString)) { |
325 | 325 | BringupWindow(GetHWND()); |
326 | - TCHAR buf[MAX_PATH]; | |
327 | - if (doSelectFolderT(GetHWND(), buf, _countof(buf), tc::fromUtf8(InitDir), tc::fromUtf8(Title))) { | |
328 | - const char *bufU8 = ToU8T(buf); | |
326 | + wchar_t buf[MAX_PATH]; | |
327 | + if (doSelectFolderW(GetHWND(), buf, _countof(buf), wc::fromUtf8(InitDir), wc::fromUtf8(Title))) { | |
328 | + const char *bufU8 = ToU8W(buf); | |
329 | 329 | SetInputStr((PCHAR)bufU8); |
330 | 330 | free((void *)bufU8); |
331 | 331 | ret = 1; |