본문 바로가기

Windows

[MFC] Directory Dialog

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();
}