MFC 파일과 폴더 선택 다이얼로그 띄우기

Develop2018. 11. 1. 10:52



MFC에서 파일과 폴더를 선택할 수 있는 다이얼로그를 띄우는 소스코드 입니다. 파일 선택 다이얼로그는 싱글 선택과 멀티 선택으로 구분되며, 폴더 선택 다이얼로그는 두 가지 스타일로 구분됩니다. 자주 사용되기에 정리해둘 목적으로 기본형 코드로 작성합니다. 




파일 선택 다이얼로그 - 싱글 선택

싱글 파일 선택 다이얼로그 띄우기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
TCHAR szFilter[] = _T("Image(*.png, *.gif, *.jpg)|*.png;*.gif;*.jpg|All Files(*.*)|*.*||");
CFileDialog dlg(TRUE, NULLNULL, OFN_HIDEREADONLY, szFilter);
if (IDOK == dlg.DoModal())
{
    //
    // 선택 파일정보 얻기
    // strPathName      "C:/Images/Picture1.jpg"
    // strFileName      "Picture1.jpg"
    // strFolderPath    "C:/Images"
 
    CString strPathName = dlg.GetPathName();
    CString strFileName = dlg.GetFileName();
    CString strFolderPath = dlg.GetFolderPath();
}
cs




파일 선택 다이얼로그 - 멀티 선택

멀티 파일 선택 다이얼로그 띄우기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TCHAR szFilter[] = _T("Image(*.png, *.gif, *.jpg)|*.png;*.gif;*.jpg|All Files(*.*)|*.*||");
CFileDialog dlg(TRUE, NULLNULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT, szFilter);
if (IDOK == dlg.DoModal())
{
    //
    // 선택 파일정보 얻기
    POSITION pos = dlg.GetStartPosition();
 
    while (pos != NULL)
    {
        CString strPathName = dlg.GetNextPathName(pos);
 
        // 경로(strPathName)를 이용하여 이후작업 추가
    }
}
cs





폴더 선택 다이얼로그 - 파일 선택 유사 스타일

폴더 선택 다이얼로그 띄우기 (파일 선택 다이얼로그와 같은 선택 방식)

1
2
3
4
5
6
7
8
9
10
11
12
// 초기 선택 폴더
CString strInitPath = _T("C:\\");
 
// 폴더 선택 다이얼로그
CFolderPickerDialog Picker(strInitPath, OFN_FILEMUSTEXIST, NULL0);
if (Picker.DoModal() == IDOK)
{
    // 선택된 폴더 경로얻음
    CString strFolderPath = Picker.GetPathName();
 
    // 경로(strFolderPath)를 이용하여 이후작업 추가
}
cs




폴더 선택 다이얼로그 - 폴더 트리 스타일

폴더 선택 다이얼로그 띄우기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//
// 폴더선택 다이얼로그를 구현하기 위해 사용되는 사용자정의 Callback 함수
//
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    switch (uMsg) {
        // 폴더선택 다이얼로그의 초기화가 끝난 경우
    case BFFM_INITIALIZED:
        SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
        break;
    }
    return 0;
}
 
//
// 폴더선택 다이얼로그
//
void SelectFolder()
{
    ITEMIDLIST  *pidlBrowse;
    WCHAR       pszPathname[MAX_PATH];
 
    BROWSEINFO  BrInfo;
    BrInfo.hwndOwner = GetSafeHwnd();
    BrInfo.pidlRoot = NULL;
 
    memset(&BrInfo, 0x00sizeof(BrInfo));
    BrInfo.pszDisplayName = pszPathname;
    BrInfo.lpszTitle = _T("Select folder");
    BrInfo.ulFlags = BIF_RETURNONLYFSDIRS;
 
    // 이벤트에 대한 사용자정의 함수
    BrInfo.lpfn = BrowseCallbackProc;
 
    // 사용자정의 함수에 넘겨질 인자로 사용자가 설정하고자 하는 경로를 설정한다.
    // 예를들어 초기폴더경로를 C드라이브로 설정하는 경우
    CString strInitPath = _T("C:\\");
    BrInfo.lParam = (LPARAM)strInitPath.GetBuffer();
 
    pidlBrowse = ::SHBrowseForFolder(&BrInfo);
    if(pidlBrowse != NULL)
    {
        // 선택된 폴더 경로얻음
        SHGetPathFromIDList(pidlBrowse, pszPathname);
         
        // 경로(pszPathname)를 이용하여 이후작업 추가
    }
}
cs


작성자

Posted by GLORY PAPA

관련 글

댓글 영역