{
switch (uMsg) {
case BFFM_INITIALIZED:
::SendMessage( hwnd, BFFM_SETSELECTION, TRUE, lpData );
break;
}
return 0;
}위와 같은 callback function을 cpp 파일의 위쪽에 정의해 주고,
HANDLE hFile = CreateFile("path.txt",GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
TCHAR *pFolderName = NULL;
int size = GetFileSize(hFile,NULL);
DWORD len = 0;
if(size>1){
pFolderName = new TCHAR[size+1];
ReadFile(hFile,pFolderName,size,&len,NULL);
// callback에서 메모리로 접근하기 때문에 뒤에 널이 있어야 한다.
pFolderName[size] = NULL;
CloseHandle(hFile);
}
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = this->GetSafeHwnd();
bi.pidlRoot = NULL;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
if(size > 1){
bi.lpfn =MyBrowseCallBackProc;
}
LPITEMIDLIST
pidl = SHBrowseForFolder(&bi);
if(pidl == NULL){
// stop here.
}
TCHAR szPath[MAX_PATH] = {0};
if(SHGetPathFromIDList(pidl, szPath)){
m_DestPath
= szPath; // 수정 필요. 내 코드에서만 필요했던 부분.
SetDlgItemText(IDC_DEST,szPath); // 수정 필요. 내 코드에서만 필요했던 부분.
}
// 파일에 저장된 경로 update.
hFile = CreateFile("path.txt",GENERIC_READ | GENERIC_WRITE, 0, NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,szPath,_tcslen(szPath),&len,NULL);
CloseHandle(hFile); delete pFolderName;를 하면 된다. 변수 이름은 적당히 바꿀 것.
BFFM_INITIALIZED 폴더 선택 대화 상자의 초기화가 끝났다는 것을 알려 준다. 콜백 함수로 넘기는 인자 중 lParam 값이 0 이다.
ulFlags에 BIF_USENEWUI 사용하지 않을 경우. |
ulFlags에 BIF_USENEWUI 사용 경우. |
ps. 선택된 경로를 파일로 저장하는 부분은 좀 엉성한데, 어차피 이 루틴에서는 읽어갈 때 문자열로 읽어가기 때문에 널 뒤에 뭐가 있든 잘리기 때문에 그냥 저렇게 하였다. 실제로 path.txt 파일을 열어 보면 뒤에 지저분한 것이 있을 수 있다. 만약 이것이 문제가 된다면 아예 파일을 지우고 다시 쓰는 것이 나을 것이다. (코드 수정함)
또한, unicode 를 사용할 경우, 기존에 경로를 저장한 파일을 불러 와서 [pFolderName]에 설정하는 부분에서 약간의 작업을 더 해 주어야 한다. 즉, 기존 경로를 저장했던 text file 의 size 는 byte 수인데, unicode 의 경우 한 글자가 2 byte 라서
위와 같이 해주어야 한다.
'컴퓨터 > MFC_API' 카테고리의 다른 글
Report 형식의 CListCtrl 에 자료 넣기 (3) | 2009.12.27 |
---|---|
title bar의 '제목 없음' 없애기 (0) | 2009.12.27 |
MSFlexGrid 사용하기 (0) | 2009.12.27 |
Resize ScrollView (0) | 2009.12.27 |
CTreeCtrl 에서 check box를 집어 넣고 다루기 (1) | 2009.12.27 |