본문 바로가기
컴퓨터/MFC_API

저장하기 대화 상자 열기

by adnoctum 2009. 12. 14.
CFileDialog instance의 생성자로 false 를 주면 '저장하기' 대화 상자가 열린다. CFileDialog의 생성자로 지정할 수 있는 옵션은 MSDN 을 참고하면 다음과 같다.

CFileDialog::CFileDialog(
  BOOL bOpenFileDialog, // true  이면 '열기', false 이면 '저장' 대화 상자
  LPCTSTR lpszDefaultExtention = NULL, // 기본 확장자
  LPCTSTR lpszDefaultFileName = NULL, // 기본 파일 이름
  DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, // 옵션
  LPCTSTR lpszFilter = NULL, // 파일 확장자 필터
  CWnd* pParentWnd = NULL, // 파일 대화 상자에 대한 부모 윈도우
  DWORD dwSize = 0 // 0 으로 사용하면 MFC가 알아서 해 줌.
);


사용 예를 보면 다음과 같다.

TCHAR current_path[MAX_PATH] = "";
GetCurrentDirectory(MAX_PATH, current_path); // 현재 경로 저장

CFileDialog dlg(false, "txt", FileNameCandidate,
                       OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
                      "Text File(*.txt)|*.txt||");

if(dlg.DoModal() == IDOK){ // OK 를 하는 순간 현재 경로가 변경된다.
    // 여기서 파일 저장 작업.
    // 여기서 얻는 dlg.GetFileName() 함수는 상대 경로로의 파일 이름을 반환해 준다.
}
SetCurrentDirectory(current_path); // 원래 경로로 돌아 간다.


CFileDialog 의 생성자로
+ false 를 입력해 줌으로써 '다른 이름으로 저장' 하기 대화 상자가 열린다.
+ "txt" 를 설정함으로써 파일 명에 대한 기본 확장자는 txt 가 된다. 만약 사용자가 대화 상자의 '파일 이름' 부분에 확장자를 적지 않으면 알아서 txt 를 붙여 주는 기능을 한다.
+ FileNameCandidate 코드 앞 부분에서 설정해 주는 값으로, 미리 파일 이름 부분을 이 값으로 채워 넣는다.
+ OFN_HIDEREADONLY | OFN_OVERWIRTEPROMPT : 읽기 전용 파일을 보이지 않고, 덮어 쓰기를 할 경우 덮어 쓴다는 경고 메세지를 보여 준다.
+ "Text File(*.txt)|*.txt|| : filter, 파일 형식 부분에 나올 텍스트와 실제로 사용될 필터이다.

필터의 경우, caption1|filter1|caption2|filter2|| (가장 마지막은 세로바가 두 개) 형식으로 사용된다. 즉, caption은 화면에 표시되는 값을 의미할 뿐 필터로서의 기능을 전혀 하지 않으며 filter1 이 caption1 에 대한 필터가 된다. 따라서,

Text File (*.txt)|*.xls|

와 같이 적는다면, 화면에 보이는 것은 Text File (*.txt) 이지만 실제로 파일 대화 상자에 나타나는 파일들은 *.xls 에 해당하는 엑셀 파일들이다. 왜냐 하면 실제로 필터값은 *.xls 로 설정되어 있기 때문이다. caption 부분에 설정해 놓은 (*.txt) 는 단순히 보여지는 것에 불과하다.

또한, 필터의 가장 마지막은 세로바가 두 개 ( || ) 라는 것을 명심해야 한다. 위와 같이 설정해서 파일 대화 상자를 열었을 때의 실제 예는 다음과 같다.



파일 이름(N): 부분에 FileNameCandidate 변수로 설정해 둔 GSE14323.group.config.txt 가 기본적으로 설정되어 있는 것을 볼 수 있다.
파일 형식(T): 부분에는 filter 로 걸어 둔 Text File(*.txt) 파일이 설정되어 있는 것을 볼 수 있다. 또한 파일 리스트는 text 파일, 즉 *.txt 에 해당하는 파일만이 나열되어 있는데, 이것은 Text File(*.txt)|*.txt|| 처럼 필터로 *.txt 를 걸어 두었기 때문이다. 앞 쪽의 (*.txt)와는 상관이 없다.


또한 초보자가 쉽게 실수 하는 것 하나는, 위처럼 파일 대화 상자를 열 경우, 프로그램이 사용하는 '현재 경로'가 변경된다는 것이다. 프로그램은 실행되는 동시에 '현재 경로'를 저장하고 있으며, 이 값은 GetCurrentDirectory 함수를 이용해 얻어갈 수 있다. 그런데 위처럼 파일 대화 상자를 열어서 IDOK 에 해당하는 작업을 하게 되면 GetCurrentDirectory 로 반환되는 값은 파일 대화 상자가 가장 최근에 작업한 경로로 설정이 된다. 만약 특별히 그래야 할 이유가 없다면 파일 대화 상자를 열기 전의 경로로 돌아 가는 것이 좋다. 따라서 파일 대화 상자를 열기 전에 현재 경로를 저장해 둔 후, 작업이 끝난 후 원래의 경로로 돌아가는 것이 좋다. 이 일은 SetCurrentDirectory 함수를 이용한다. (MAX_PATH는 파일 경로(파일 이름 포함)가 가질 수 있는 최대 길이이다. linux 환경에서는 PATH_MAX로 define 되어 있으며, 이 값은 주로 255 이다. 즉, 윈도우즈 환경에서 파일의 절대 경로의 최대 길이는 255 자 이다.)