IT/Windows API

파일 대화상자

KSI 2005. 6. 24. 05:36

메모장 같은 프로그램을 실행해서 파일을 저장할때나 불러올때 보면 파일을 선택할 수 있는 다이얼로그 창이 있습니다. 이 다이얼로그 창은 겉보기엔 파일을 조작하는 기능을 할것 같지만 실제론 단순히 파일 이름만을 읽어들이는 기능을 합니다.

 

가령 예를들어 메모장에서 바탕화면에 있는 'aaa.txt'라는 파일을 파일 대화상자로 불러들였다면 파일대화상자는 단지 aaa.txt의 파일 위치, 즉 경로만을 리턴해주는 역할을 합니다. 물론 파일을 다루는건 CreateFile이나 ReadFile같은 함수죠.

 

 

함수 원형

BOOL GetOpenFileName( LPOPENFILENAME lpofn );

 

매개변수

lpofn : OPENFILENAME 구조체변수의 포인터

 

 

이 함수는 OPENFILENAME이라는 구조체만 인수로 받고 있고 BOOL형을 리턴하는데 사용자가 파일을 선택했을때는 TRUE를 리턴하고 취소를 눌렀거나 기타 에러가 발생했을때는 FALSE가 리턴됩니다.

 

 

typedef struct tagOFN {
  DWORD         lStructSize;
  HWND          hwndOwner;
  HINSTANCE     hInstance;
  LPCTSTR       lpstrFilter;
  LPTSTR        lpstrCustomFilter;
  DWORD         nMaxCustFilter;
  DWORD         nFilterIndex;
  LPTSTR        lpstrFile;
  DWORD         nMaxFile;
  LPTSTR        lpstrFileTitle;
  DWORD         nMaxFileTitle;
  LPCTSTR       lpstrInitialDir;
  LPCTSTR       lpstrTitle;
  DWORD         Flags;
  WORD          nFileOffset;
  WORD          nFileExtension;
  LPCTSTR       lpstrDefExt;
  LPARAM        lCustData;
  LPOFNHOOKPROC lpfnHook;
  LPCTSTR       lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
  void *        pvReserved;
  DWORD         dwReserved;
  DWORD         FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;

 

위는 OPENFILENAME구조체의 멤버입니다. 참 복잡하지만 어려울건 없습니다.

대게는 간단하게 몇개의 멤버만 사용되니까요.

 

lStructSize : 해당 구조체의 크기. OPENFILENAME의 크기를 대입해주면 됨

 

hwndOwner : 해당 메시지를 받을 윈도우의 핸들

 

lpstrFile : 파일이름 부분에 나타날 파일명을 지정한다. 필요없을땐 NULL을 지정한다. 그리고 사용자가 최종적으로 선택한 파일을 담는 용도로도 사용.

 

nMaxFile : lpstrFile 멤버의 크기. 최소크기가 MAX_PATH(256)이며 그 이하는 에러다.

 

lpstrFilter : 파일형식 콤보박스에 나타날 필터들. 가령 텍스트 파일만 필터링 할려면 "텍스트파일\0*.txt\0" 와같은 형식으로 대입해준다

 

Flags : 대화상자의 옵션을 지정하는 플래그

 

그 밖의 멤버에 대해선 레퍼런스를 참고하시길 바라며..

 

이 구조체를 사용할땐 반드시 모든 멤버를 ZeroMemory 등으로 초기화 시켜주어야 합니다.

아래는 간단히 사용자에게 파일을 여는 다이얼로그를 출력하고 사용자가 선택한 최종 파일을 메시지박스로 출력하는 예제입니다.

 

OPENFILENAME    ofn;

char                     pszFileName[MAX_PATH];

 

// 반드시 모든 멤버를 초기화 시켜주어야 함

ZeroMemory( &ofn, sizeof( OPENFILENAME ) );

ofn.lStructSize = sizeof( OPENFILENAME );

ofn.lpstrFilter = "모든파일 \0*.*\0텍스트파일 \0*.txt\0";

ofn.lpstrFile = pszFileName;

ofn.nMaxFile = MAX_PATH;

 

pszFileName[0] = '\0';   // 반드시 초기화 해주어야 함

if( TRUE ==GetOpenFileName( &ofn ))

    MessageBox( NULL, pszFileName, "NOTICE", MB_OK );

 

 

 

위와는 반대로 파일을 저장할때 쓰이는 파일대화상자는 GetSaveFileName 함수로 띄울 수 있습니다. 위와 거의 동일하게 사용하시면 됩니다. 간단히 예제를 보여드리자면..

 

OPENFILENAME   ofn;

char                    pszFileName[MAX_PATH];

 

ZeroMemory( &ofn, sizeof( OPENFILENAME ) );

ofn.lStructSize = sizeof( OPENFILENAME );

ofn.lpstrFilter = "모든파일 \0*.*\0텍스트파일 \0*.txt\0";

ofn.lpstrFile = pszFileName;

ofn.nMaxFile = MAX_PATH;

ofn.lpstrDefExt = "txt";

 

pszFileName[0] = '\0';

if( TRUE ==GetSaveFileName( &ofn ))

    MessageBox( NULL, pszFileName, "SAVE FILE", MB_OK );

 

어렵지 않죠?

참고로 Win32 console 프로젝트에서도 잘 돌아갑니다.