前言
已有之事,後必再有
已行之事,後比再行
背景:
給Java調用(這也許就是C++吧)
環境:
VS2017
一、選擇文件
#include <iostream>
#include <ShlObj.h>
#include <windows.h>
#include <Commdlg.h>
void openFileDialog()
{
OPENFILENAME ofn; // 公共對話框結構
TCHAR szFile[MAX_PATH]; // 保存獲取文件名稱的緩衝區
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0Image\0*.PNG;*.JPG\0"; //過濾規則
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = L"C:\\Program Files"; //指定默認路徑
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn))
{
//顯示選擇的文件。
wchar_t * t = ofn.lpstrFile;
// 將wchar_t轉化爲char輸出
std::cout << wcharTochar(t) << std::endl;
}
}
char * wcharTochar(const wchar_t * _wchar)
{
char * _char;
int len = WideCharToMultiByte(CP_ACP, 0, _wchar, (int)wcslen(_wchar), NULL, 0, NULL, NULL);
_char = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, _wchar, (int)wcslen(_wchar), _char, len, NULL, NULL);
_char[len] = '\0';
return _char;
}
二、選擇文件夾
void openFolderDialog()
{
TCHAR path[MAX_PATH] = { 0 };
BROWSEINFO bi;
bi.hwndOwner = 0;
bi.pidlRoot = NULL;
bi.pszDisplayName = path;
bi.pszDisplayName[0] = '\0';
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
LPMALLOC pMalloc;
LPITEMIDLIST pidl;
pidl = SHBrowseForFolder(&bi);
if (pidl != NULL)
{
SHGetPathFromIDList(pidl, path);
wchar_t * qsFile = bi.pszDisplayName;
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
pMalloc->Free(pidl);
pMalloc->Release();
}
std::cout << wcharTochar(qsFile) << std::endl;
}
}
需要注意的地方
- 輸出注意編碼問題
- 選擇文件設置過濾規則,傳參時需要將char *轉wchar_t *,但是\0在C++中爲空格,在轉化過程中會自動截斷,在轉化過程中需要注意