Open/Save 파일폴더 경로얻기
폴더 경로 얻기 |
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM lpData); BOOL BrowseForFolder( WCHAR *pwFolderPath, WCHAR *pwInitialFolder ) { LPMALLOC pMalloc = NULL; WCHAR wszDisplayName [MAX_PATH]; BROWSEINFO bi; BOOL bRet = FALSE; ZeroMemory(&bi, sizeof(bi)); if ( SUCCEEDED(::SHGetMalloc(&pMalloc)) ) { bi.lpszTitle =_T("Title Text"); // 선택된아이템을리턴받을버퍼(폴더명만) bi.pszDisplayName = wszDisplayName; // Parent Window Handle; bi.hwndOwner = NULL; // Callback Function 주소 bi.lpfn = BrowseCallbackProc; // Callback Function으로전달한parameter bi.lParam = (LPARAM)pwInitialFolder; bi.pidlRoot = NULL; // BIF_USENEWUI - 새폴더생성+EditBox // BIF_DONTGOBELOWDOMAIN - nework표시안함 bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.iImage = -1; LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi); if (pidl != NULL) { if ( ::SHGetPathFromIDList(pidl, pwFolderPath) ) // Get Item FullPath { bRet = TRUE; } pMalloc->Free(pidl); } pMalloc->Release(); pMalloc = NULL; } return bRet; } int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM lpData) { if (uMsg == BFFM_INITIALIZED) { //BROWSEINFO.lParam에서 설정 해준 값이 lpData로넘어온다. // LPARAM으로 path를 넘겨주려면 WParam을 TRUE로, // PIDL을 넘겨주려면 FALSE로 넘겨준다. if ( lpData ) } return 0; } |
n 폴더선택창이 팝업될 때 기본 선택 경로를 설정하려면 BROWSEINFO.lpfn를 등록한 후, 위 예제의 BrowseCallbackProc 와 같이 처리하면 된다.
파일 경로 얻기 |
#include <commdlg.h> { OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; // File Filter ofn.lpstrFilter = L"Exe Files (*.exe)\0*.exe\0Dll Files (*.dll)\0*.dll\0\0"; ofn.lpstrInitialDir = pwInitialFolder; // InitialFolder ofn.lpstrFile = pwFilePath; // Default FileName / Output FilePath ofn.nMaxFile = MAX_PATH; // The size, in characters, of the buffer pointed to by lpstrFile ofn.lpstrDefExt = NULL; // The default extension ofn.lpstrTitle = L"파일을선택하세요"; // Title ofn.Flags = OFN_HIDEREADONLY | OFN_EXPLORER | OFN_OVERWRITEPROMPT; //if ( ::GetSaveFileName(&ofn) == FALSE ) – Save 파일이름 얻기 if ( ::GetOpenFileName(&ofn) == FALSE ) // - Open 파일이름 얻기 { DWORD dw = CommDlgExtendedError(); return FALSE; } return TRUE; } |
n GetSaveFileName()/GetOpenFileName()함수의 상세 에러코드는 GetLastError()가 아닌 CommDlgExtendedError() API를 이용해 확인 해야 한다.
n 여기서 주의해야 할점은 OPENFILENAME.lpstrFile 필드는 디폴트 파일명을 셋팅하는데도 사용되며, 디폴트 파일명을 사용하지 않더라도 버퍼의 첫번째 문자는 널 문자로 설정되어야 한다.
그렇지 않을 경우, FNERR_INVALIDFILENAME(0x00003002)가 발생하여 다이얼로그 생성에 실패한다.(즉 해당 버퍼는 반드시 초기화 되어야 한다.)
Windows Vista 이후의 OS에서는 IFileDialog 인터페이스를 통해, 파일/폴더 이름 얻기가 가능하다.
MSDN에서 [Cmmon Item Dialog]을 키워드로 검색하거나 아래 링크를 확인해 보면 자세한 정보가 기술되어 있다.
n http://msdn.microsoft.com/en-us/library/bb776913(v=VS.85).aspx
관련 샘플은 아래의 경로에서도 확인 가능하다.
n C:\Program Files (x86)\Microsoft Visual Studio X.0\VC\atlmfc\src\mfc\dlgfile.cpp
'Windows Programming' 카테고리의 다른 글
[MFC] Templete에 설정된 각 클래스 접근(MDI) (0) | 2011.07.18 |
---|---|
[MFC] Templete에 설정된 각 클래스 접근(SDI) (0) | 2011.07.18 |
WH_MOUSE_LL의 불편(?)한 진실 (0) | 2011.06.21 |
Detour Library (0) | 2011.03.23 |
Dependency Walker(depends.exe) (0) | 2011.03.22 |