Programming/MFC2008. 9. 4. 19:53
CFileDialog사용시 경로관련 주의사항

[질문 내용]

안녕하세요.

TipsWare 3번째 인터페이스를 사용중입니다. 다이얼로그 베이스로 개발중인데..
기본 다이얼로그 박스에서 버튼을 누르면 또 새로운 다이얼로그 박스가 뜨거든요.
근데 이 새로운 다이얼로그박스가 첨 뜰때는 이미지(로고, 체크박스, 라디오버튼 같은..)가 잘뜨는데..
기본 다이얼로그 박스에서 CFileDialog 박스로 어떤 파일을 하나 열고나면 새로운 다이얼로그박스에서
이미지들이(image 폴더에 있는) 나오지를 않네요..

제 생각에는 대충 CFileDialog에서 파일 경로가 변경되서 그런거 같은데..
어떻게 해결 해야 하는지 답변 부탁드립니다..^^;

[답변 내용]

안녕하세요~!

CFileDialog를 사용하면 내부 작업 경로가 변경되어서 이미지 파일을 정확하게 읽어 오지 못합니다.
따라서 CFileDialog를 사용하기 전에 

GetCurrentPath

함수를 이용하여 현재 작업 경로를 배열에 기억시킨후에, CFileDialog 작업이 끝난후,

SetCurrentPath

함수를 이용하여 기억시킨 경로를 다시 설정해주면 됩니다.

정리하면, GetCurrentPath는 CFileDialog 를 선언하기 전에 사용해야 하구...
SetCurrentPath는 CFileDialog를 DoModal 한 이후에 사용해야 합니다.

그럼, 즐거운 하루되세요~!

[추가답변-즐거운악몽님이 답변하신 내용입니다.]

보통 CFileDialog 대화상자를 사용하다보면 간간히 경로 변경 문제로 인해 원치 않는 결과를 얻게
되기도 합니다. 일반적으로 프로그램 즉 aa.exe 를 실행 시키면 그 파일이 실행된 폴더의 위치가
작업경로가 됩니다.

예로 c:\\work\\a.exe 를 실행 시켰다면 작업경로는 c:\\work\\ 가 되죠. 이때 CFileDialog 대화상자를
이용하면 이 작업경로가 변경되곤합니다.

CFileDialog 대화상자를 DoModal() 한 후 이리저리 폴더를 움직이고나서 OK 버튼을 누르면......
그 마지막 경로가 작업경로로 지정됩니다.

예로 CFileDialog 대화상자를 호출한 후 c:\\sample\\ 이동, 그리고 OK버튼을 눌렀다면 이제부터
작업 경로는 c:\\work\\ 가 아니라 c:\\sample\\ 인 것입니다. 이때 이후부터는 상대경로를 사용한
코드를 만나게 되면 문제가 발생되는것이죠 프로그래머가 .\\\\image\\\\aa.bmp 를 로드하는 코드를
넣었다면 원래는 c:\\work\\image\\aa.bmp 를 로드 해야 하는데 CFileDialog 대화상자로 인해 작업
경로가 변경되었으니 c:\\sample\\image\\aa.bmp 를 로드 하려 시도하게 된다는 것입니다...따라서
원치 않는 작업이 이루어 지게됩니다.

따라서 CFileDialog 대화상자를 호출하는 부분에 코드에 아래와 같이 변경해 보시길 바랍니다.

 char path[MAX_PATH] = {0};
 //현재의 작업경로를 얻어와 저장 한다.
 GetCurrentDirectory(MAX_PATH, path);

 CFileDialog dlg(FALSE);
 if(dlg.DoModal()==IDOK){
    // 가장 마지막에 저장해 두었던 작업경로로 다시금 세팅한다.
    SetCurrentDirectory(path);

    // 하고픈 작업코드.....
 }

혹 이미 위의 코드를 사용중이신데도 문제가 발생되는것이라면 좀더 자세한 설명 부탁드립니다...
그리고 새로이 추가하신 대화상자의 속성이 STYLE 탭에서 ......style -> POPUP 지정,
border -> None 을 지정하셨는지, 그리고 모든 CDialog 를 StandardDialog 로 변경하셨는지 체크해
보시길 바랍니다..

그럼 즐거운 하루되세요!!!

Posted by skensita