본문 바로가기

Programming/MFC

[MFC] 버튼 눌러서 윈도우 파일탐색기 열기 (vs 2019)

만약 MFC에서 버튼을 눌러서 윈도우 탐색기를 열고싶다면, 어떻게 해야할까요 ?

한번 알아봅시다. 

Button 생성

[리소스뷰] -> [Dialog] -> [도구상자]-> [Button] 클릭하여 버튼 생성합니다.

Button 이벤트 처리기 추가

[우클릭] -> [이벤트 처리기 추가(A)]를 클릭하여 버튼을 클릭했을 때 이벤트가 일어날 수 있도록 함수를 생성합니다. .

 

이벤트 처리기를 추가할 때 클래스 목록은 본인 main dialog 클래스에,
메시지 유형은 BN_CLICKED로,

함수명은 본인이 원하는 함수명으로 변경해주세요.

 

Button 이벤트 처리기에 파일탐색기 열기

폴더와 파일 탐색을 지원하는 CFileDialog를 사용하여 파일탐색기를 열 수 있습니다. 

앞서 만든 이벤트 처리기 함수 내에 아래와 같이 작성합니다. 

void CtestDlg::OnBnClickedButtonFileExplorer()
{
	// 파일/폴더 선택 다이얼로그 (파일 및 폴더를 포함)
	CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,
		_T("All Files|*.*||"), NULL, 0);

	if (dlg.DoModal() == IDOK)
	{
		UpdateData(FALSE);
	}
}

 

이렇게 간단하게 작성하고 디버깅을 진행하면 바로 버튼을 눌러 파일탐색기를 열 수 있습니다. 

 

파일탐색기 초기 폴더 설정하기

그럼 파일탐색기의 초기 폴더를 설정하는 방법은 뭘까요 ?

아래 strInitPath을 사용해서 초기 폴더를 설정할 수 있습니다. 

void CtestDlg::OnBnClickedButtonFileExplorer()
{
	// 초기 선택 폴더
	CString strInitPath = _T("E:\\test_fold");

	// 파일/폴더 선택 다이얼로그 (파일 및 폴더를 포함)
	CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,
		_T("All Files|*.*||"), NULL, 0);

	// 초기 디렉터리 설정
	dlg.m_ofn.lpstrInitialDir = strInitPath;

	if (dlg.DoModal() == IDOK)
	{
		UpdateData(FALSE);
	}
}


폴더 내에 있는 특정 포맷만 불러오기 

그럼 만약, 해당 폴더 내에 있는 그림파일 ( *.jpg,  *.jpeg,  *.png, *.bmp ...) 만 표시하고 싶으면 어떻게 하면 될까요 ??

그럼 기존의 All Files를 원하는 포맷으로 설정해 주면 됩니다. 

방법은 아래와 같습니다. 

void CtestDlg::OnBnClickedButtonFileExplorer()
{
	// 초기 선택 폴더
	CString strInitPath = _T("E:\\test_fold");

	// 파일/폴더 선택 다이얼로그 (파일 및 폴더를 포함)
	CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,
		_T("Image Files (*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp||"), NULL, 0);

	// 초기 디렉터리 설정
	dlg.m_ofn.lpstrInitialDir = strInitPath;
    
	if (dlg.DoModal() == IDOK)
	{
		UpdateData(FALSE);
	}
}

 

폴더 내에 있는 파일명 불러오기

선택한 파일들의 파일명을 불러오는 방법은 어떻게 하면 될까요 ?

DoModel을 통해서 모달형 파일탐색기에 IDOK가 호출되면 파일명을 불러올 수 있습니다. 

자세한 방법은 아래와 같습니다. 

// cout으로 출력해서 확인해보기 위함.
// CString to std::string 
std::string CtestDlg::CString2string(CString cstr)
{
	std::string str = std::string(CT2CA(cstr));
	return str;
}

void CtestDlg::OnBnClickedButtonFileExplorer()
{
	// 초기 선택 경로
	CString strInitPath = _T("E:\\test_fold");

	// 파일 선택 다이얼로그 설정
	CFileDialog fileDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,
		_T("Image Files (*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp||"), NULL, 0);

	// 초기 경로 설정
	fileDlg.m_ofn.lpstrInitialDir = strInitPath;

	if (fileDlg.DoModal() == IDOK)
	{
		// 선택된 파일 경로를 가져옴
		POSITION pos = fileDlg.GetStartPosition();

		while (pos)
		{
			CString filePath = fileDlg.GetNextPathName(pos);
			CString fileName = filePath.Mid(filePath.ReverseFind(_T('\\')) + 1);

			cout << "===================================" << endl;
			cout << CString2string(filePath) << endl;
			cout << CString2string(fileName) << endl;
		}

		UpdateData(FALSE);
	}
}

 

 

위 사진에서 보시면 filePath와 fileName이 정상적으로 출력되는 것을 확인할 수 있습니다.