본문 바로가기

무언가 만들기 위한 지식/Win32/MFC

MFC 파일경로 찾기(FileDialog 사용)

MFC상에서 그림파일을 얻어와서 다른곳에 저장(DB나 기타 저장소)하려는 시도가 있었는데,
어떻게 할까 고민하다가 FileDialog라는 간단한 방법이 있다는 사실을 알게 되었다.
FileDialog란 윈도우 사용하면 많이 보게 되는,



위와 같은 Dialog 이다.
이런 Dialog를 프로그래머의 의도대로 수정이 가능하다.
그리고 해당 Dialog가 종료되면 원하는 값을 얻어올 수 있다.

void CselecPic::OnBnClickedButton1()
{
	char current_path[MAX_PATH];
	GetCurrentDirectory(MAX_PATH, current_path);
    LPSTR szFilter = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*|";
    CFileDialog FileDialog(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);    
	FileDialog.m_ofn.lpstrTitle = "요리에 첨부할 사진 선택하기";
    if(FileDialog.DoModal() == IDOK)
	{
		CString check=FileDialog.GetFileExt();
		if(check=="bmp") path=FileDialog.GetPathName();
		else path="BMP 파일만 선택해주시길 바랍니다.";
		fileRoot.SetWindowTextA(path);
	}
	SetCurrentDirectory(current_path);
}

위에서 MAX_PATH는 260으로 windef.h에 정의되어 있다.
FileDialog의 생성자 인자 부분에 대한 자세한 설명은 MSDN을 참고하도록 하자.
szFilter부분은 딱보면 직관적으로 알 수 있다. (파일형식부분)
그리고 lpstrTitle부분은 Dialog의 제목표시줄이다.

Dialog가 종료되면 여러 값들이 남아 있다.
FileDialog상에는 여러 정보들이 저장되어 있으니 가져다 사용하면 된다.
예를 들면
GetFileExt()로는 파일형식을 알 수 있고,
GetPathName()로는 파일전체경로를 알 수 있으며,
GetFileName()으로 파일명만 알 수 있다.
그밖에 지원되는 것들이 많으니 Get위주로 찾아보도록 하자.

GetCurrentDirectory를 하는 이유는 마지막에 SetCurrentDirectory를 이용해 원래 Directory를 저장하기 위함으로 보인다.
(그렇지 않으면 Runtime Error - 아마도 Dialog 실행시 CurrentDirectory가 변하기 때문인듯 싶다.)