ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파일 대화상자
    프로그래밍/Windows API 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 프로젝트에서도 잘 돌아갑니다.

    댓글