처음 시작 폴더를 지정해 준 후, 폴더 선택 다이얼로그를 띄우는 방법. 종종 기존에 선택했던 경로가 선택된 상태로 폴더 선택 대화 상자를 열고 싶을 때가 있는데, 그 때 사용한다.
{
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 이다.
|
ps. 선택된 경로를 파일로 저장하는 부분은 좀 엉성한데, 어차피 이 루틴에서는 읽어갈 때 문자열로 읽어가기 때문에 널 뒤에 뭐가 있든 잘리기 때문에 그냥 저렇게 하였다. 실제로 path.txt 파일을 열어 보면 뒤에 지저분한 것이 있을 수 있다. 만약 이것이 문제가 된다면 아예 파일을 지우고 다시 쓰는 것이 나을 것이다. (코드 수정함)
또한, unicode 를 사용할 경우, 기존에 경로를 저장한 파일을 불러 와서 [pFolderName]에 설정하는 부분에서 약간의 작업을 더 해 주어야 한다. 즉, 기존 경로를 저장했던 text file 의 size 는 byte 수인데, unicode 의 경우 한 글자가 2 byte 라서
pFolderName[size>>1] = NULL;
위와 같이 해주어야 한다.
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
[Scrollbar] Scrollbar message handler 처리하기 (0) | 2011.03.29 |
---|---|
[Grid] MSFlexGrid 사용하기 (0) | 2011.03.29 |
[Tree] CTreeCtrl 에 디렉토리 표시하기 (0) | 2011.03.29 |
[MessageBox] 메시지 상자 사용법 (0) | 2011.03.27 |
[List] 리스트 컨트롤에 다른 컨트롤 넣기 (1) | 2011.03.27 |
댓글