Directory 경로 얻기
초기화 경로를 lParam으로 전달하고
Callback함수를 등록하면
SHBrowseForFolder 함수 호출 후 Callback 함수가 호출된다.
경로는 callback의 lParam으로 전달되고 그 전달된 값을
BFFM_SETSELECTION 메시지 이용해 보낸다.
이렇게 해야 초기 진입 시 원하는 디렉토리가 선택된 모습을 볼 수 있다.
int CALLBACK CDialog_BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { switch (uMsg) { case BFFM_INITIALIZED: SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData); break; case BFFM_SELCHANGED: break; } return 0; } void CDialog::OnBnClickedButtonSetPath() { ITEMIDLIST *pidlBrowse; TCHAR pszPathname[MAX_PATH]; // Make browse information BROWSEINFO bi; memset(&bi, 0x00, sizeof(bi)); bi.hwndOwner = GetSafeHwnd(); bi.pidlRoot = NULL; bi.pszDisplayName = pszPathname; bi.lpszTitle = _T("Select Directory"); bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = CDialog_BrowseCallbackProc; // if current path is not set, get current path and make it initial directory size_t bufSize = 1024; CString curDir; LPTSTR pCurDir = NULL; ((CEdit*)GetDlgItem(IDC_EDIT_PATH))->GetWindowText(curDir); if (curDir.GetLength() == 0) { pCurDir = curDir.GetBuffer(bufSize); GetCurrentDirectory(bufSize, pCurDir); } else { pCurDir = curDir.GetBuffer(bufSize); } bi.lParam = (LPARAM)pCurDir; // Show directory browser pidlBrowse = ::SHBrowseForFolder(&bi); if (pidlBrowse != NULL) { // Get path by ID list SHGetPathFromIDList(pidlBrowse, pszPathname); // Set directory to edit control ((CEdit*)GetDlgItem(IDC_EDIT_PATH))->SetWindowText(pszPathname); } curDir.ReleaseBuffer(); }
'Windows' 카테고리의 다른 글
Obtaining the title of another application (0) | 2017.01.25 |
---|---|
[VisualStudio] stl::map insert vs operator[]. Which is faster? (0) | 2016.06.22 |
VC6 Static control double click 처리하기 (0) | 2016.06.22 |
[MFC] Double buffering (0) | 2016.05.27 |
[MFC] Draw Text (0) | 2016.05.27 |