C++文件、文件夾選擇框(GetOpenFileName,SHBrowseForFolder)

前言

已有之事,後必再有
已行之事,後比再行

背景:

給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;
	}
}
需要注意的地方
  1. 輸出注意編碼問題
  2. 選擇文件設置過濾規則,傳參時需要將char *轉wchar_t *,但是\0在C++中爲空格,在轉化過程中會自動截斷,在轉化過程中需要注意
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章