BOOL TWin::CreateU8(LPCSTR className, LPCSTR title, DWORD style, DWORD exStyle, HMENU hMenu) { Wstr className_w(className, BY_UTF8); Wstr title_w(title, BY_UTF8); return CreateW(className_w.s(), title_w.s(), style, exStyle, hMenu); }
/* ディレクトリダイアログ用汎用ルーチン */ BOOL BrowseDirDlg(TWin *parentWin, const char *title, const char *defaultDir, char *buf) { IMalloc *iMalloc = NULL; BROWSEINFOW brInfo; LPITEMIDLIST pidlBrowse; BOOL ret = FALSE; Wstr buf_w(MAX_PATH), defaultDir_w(MAX_PATH), title_w(title); if (!SUCCEEDED(SHGetMalloc(&iMalloc))) return FALSE; U8toW(defaultDir, defaultDir_w.Buf(), MAX_PATH); brInfo.hwndOwner = parentWin->hWnd; brInfo.pidlRoot = 0; brInfo.pszDisplayName = buf_w.Buf(); brInfo.lpszTitle = title_w; brInfo.ulFlags = BIF_RETURNONLYFSDIRS; brInfo.lpfn = BrowseDirDlgProc; brInfo.lParam = (LPARAM)defaultDir_w.Buf(); brInfo.iImage = 0; if ((pidlBrowse = SHBrowseForFolderV((BROWSEINFO *)&brInfo))) { ret = SHGetPathFromIDListV(pidlBrowse, buf_w.Buf()); iMalloc->Free(pidlBrowse); if (ret) WtoU8(buf_w, buf, MAX_PATH_U8); } iMalloc->Release(); return ret; }
BOOL GetOpenFileNameU8Core(LPOPENFILENAME ofn, BOOL (WINAPI *ofn_func)(OPENFILENAMEW*)) { OPENFILENAMEW ofn_w; Wstr filter_w(MAX_PATH), cfilter_w(ofn->nMaxCustFilter), file_w(ofn->nMaxFile), ftitle_w(ofn->nMaxFileTitle), idir_w(MAX_PATH), title_w(MAX_PATH), defext_w(MAX_PATH), template_w(MAX_PATH); memcpy(&ofn_w, ofn, sizeof(OPENFILENAME)); WCHAR *wp=filter_w.Buf(); for (const char *p=ofn->lpstrFilter; p && *p; p+=strlen(p)+1) { wp += U8toW(p, wp, (int)(MAX_PATH - (wp - filter_w.Buf()))) + 1; } *wp = 0; U8toW(ofn->lpstrCustomFilter, cfilter_w.Buf(), ofn->nMaxCustFilter); U8toW(ofn->lpstrFile, file_w.Buf(), ofn->nMaxFile); U8toW(ofn->lpstrFileTitle, ftitle_w.Buf(), ofn->nMaxFileTitle); U8toW(ofn->lpstrInitialDir, idir_w.Buf(), MAX_PATH); U8toW(ofn->lpstrTitle, title_w.Buf(), MAX_PATH); U8toW(ofn->lpstrDefExt, defext_w.Buf(), MAX_PATH); U8toW(ofn->lpTemplateName, template_w.Buf(), MAX_PATH); if (ofn->lpstrFilter) ofn_w.lpstrFilter = filter_w.s(); if (ofn->lpstrCustomFilter) ofn_w.lpstrCustomFilter = cfilter_w.Buf(); if (ofn->lpstrFile) ofn_w.lpstrFile = file_w.Buf(); if (ofn->lpstrFileTitle) ofn_w.lpstrFileTitle = ftitle_w.Buf(); if (ofn->lpstrInitialDir) ofn_w.lpstrInitialDir = idir_w.s(); if (ofn->lpstrTitle) ofn_w.lpstrTitle = title_w.s(); if (ofn->lpstrDefExt) ofn_w.lpstrDefExt = defext_w.s(); if (ofn->lpTemplateName) ofn_w.lpTemplateName = template_w.s(); BOOL ret = ofn_func(&ofn_w); if (ofn->lpstrCustomFilter) { WtoU8(cfilter_w.s(), ofn->lpstrCustomFilter, ofn->nMaxCustFilter); } if (ofn->lpstrFileTitle) { WtoU8(ftitle_w.s(), ofn->lpstrFileTitle, ofn->nMaxFileTitle); } if (ofn->lpstrFile) { if (ofn_w.Flags & OFN_ALLOWMULTISELECT) { const WCHAR *wp=file_w.s(); char *p; for (p=ofn->lpstrFile; wp && *wp; wp+=wcslen(wp)+1) { p += WtoU8(wp, p, (int)(ofn->nMaxFile - (p - ofn->lpstrFile))) + 1; } *p = 0; } else { WtoU8(file_w.s(), ofn->lpstrFile, ofn->nMaxFile); } } // if (ofn_w.lpstrFile[ofn_w.nFileOffset]) ofn->nFileOffset = ::WideCharToMultiByte(CP_UTF8, 0, ofn_w.lpstrFile, ofn_w.nFileOffset, 0, 0, 0, 0); return ret; }