Program Languege/WinAPI

공통 대화상자 - 1

Frozen0113 2014. 5. 5. 00:23

공통 대화상자(Common Dialog)

 

 공통 대화상자란 말 그대로 모든 윈도우즈용 프로그램들이 공통으로 사용하는 대화상자이다. 자주 사용되기 때문에 이 대화상자들은

아예 윈도우즈가 운영체제 차원에서 제공하며 응용 프로그램들은 윈도우즈의 서비스만 받으면 이 대화상자를 쉽게 사용할 수 있다.

 

 파일 입출력 방법 자체는 프로그램마다 다르겠지만 대상 파일의 이름과 위치를 얻어오는 작업은 어떤 프로그램이나 동일하다. 그런데

파일의 이름과 위치를 사용자로부터 입력받는 작업은 보통 이상으로 어렵다. 파일이 저장되는 디스크는  계층적인 디렉토리 구조를 이루고 있으며 또 여러개의 디스크가 존재하기도 하고 원하는 파일만 보여줄 수 있도록 필터 처리도 해야한다. 게다가 네트워크 지원까지 신경쓰려면 결코 간단하지가  않다.

 

 그래서 이런 어렵고 복잡한 작업을 피하기 위해 운영체제는 공통 대화상자라는 것을 제공하며 프로그램이 파일 이름을 입력받을 때는

이 대화상자를  사용한다. 약간의 옵션을 설정한 후 대화상자를 호출하기만 하면 파일 이름을 얻기까지의 모든 처리가 대화상자 내에서

이루어지며 그 결과로 사용자가 선택한 파일의 이름만 돌려주므로 아주 편리하게 사용할 수 있다.

 

 BOOL GetOpenFileName(LPOPENFILENAME lpofn);

 BOOL GetSaveFileName(LPOPENFILENAME lpofn);

 

 GetOpenFileName의 경우 읽을 파일명을 선택하는 것이고 GetSaveFileName은 저장할 파일명을 선택하는 것이다.

 

 매개변수는 OPENFILENAME이라는 구조체의 포인터 하나만을 취하며 파일을 제대로 입력받았으면 0이 아닌 값을 리턴하고 사용자가 입력을 취소했을 경우 0을 리턴한다.

 

 typeef struct tagOFN

{

DWORD         lStructSize;

HWND           hWndOwner;

HINSTANCE   hInstance;

LPCTSTR      lpstrFilter;

LPTSTR        lpstrCustomFilter;

DWORD         nMaxCustFilter;

DWORD         nFilterIndex;

LPTSTR        lpstrFile;

DWORD         nMaxFile;

LPTSTR        IpstrFileTitle;
DWORD         nMaxFileTitle;
LPCTSTR      IpstrlnitialDir;
LPCTSTR      IpstrTitle;
DWORD        Flags;
WORD          nFileOffset;
WORD          nFileExtension;
LPCTSTR     IpstrDefExt;
LPARAM      ICustData;
LPOFNHOOKPROC IpfnHook;
LPCTSTR     IpTemplateName;
#if LWIN32_WINNT >= Ox0500)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // LWIN32_WINNT >= Ox0500)

} OPENFILENAME, *LPOPENFILENAME;

 

 

 

 다음은 Flags 멤버에 줄 수 있는 플래그들인데 모두 OFN_으로 시작된다. 다음 표에서는 OFN_는 생략하고 기록되어있다.

 

 

※ 주의할 점

 lpstrFile은 충분한 길이의 버퍼를 제공해야한다. 이 버퍼는 파일열기 대화상자가 사용자로부터 입력 받은 파일명을 리턴하는데 사용되기 때문이다. 최소한 MAX_PATH정도 되는 길이를 할당하고 넘겨줘야한다. 만약 부족한 경우 공통 대화상자가 닫히기 전에 프로그램이 다운될 수 있다. nMaxFile는 lpstrFile의 크기를 지정하여 버퍼 오버런을 방지한다. 또한 lpstrFile 버퍼는 반드시 빈 문자열로 초기화 되어있여하는데 초기화 되어있지 않으면 대화상자가 열리지 않는다.

 

 

 

 

 

 대화상자가 닫힌 후 lpstrFile에 사용자가 어떤 파일을 선택했는지 알 수 있다. lpstrFile에 리턴되는 파일명은 드라이브와 디렉토리 경로가 포함된 완전 경로로 곧바로 파일 입출력 함수에 사용할 수 있다. 파일의 이름만 입력받고자 할 때는 lpstrFileTitle를 활용하면 된다.

 

 

 

 

 

 

출처 - 윈도우즈 API 정복