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 |