본문 바로가기

프로그램언어/C++

API 공용 대화상자 사용1

열기 대화상자

 

파일 열기 대화상자를 호출할 때는 사용하는 함수

BOOL GetOpenFileName( LPOPENFILENAME lpofn );

typedef struct tagOFN { // ofn

  DWORD lStructSize;             // 구조체의 크기를 지정

  HWND hwndOwner;            // 대화상자의 소유자를 지정

  HINSTANCE hInstance;         // 인스턴스 핸들을 지정

  LPCTSTR lpstrFilter;             // 파일 형식 콤보박스에 나타날 필터들

  LPTSTR lpstrCustomFilter;     // 사용자가 실행 중에 선택한 커스텀필터를 저장하기 위한 버퍼

  DWORD nMaxCustFilter;      //컴스텀 필터의 길이

  DWORD nFilterIndex;          // 파일 형식 콤보박스에서 사용할 필터의 인덱스를 지정

  LPTSTR lpstrFile;                // 사용자가 선택한 파일의 경로를 리턴

  DWORD nMaxFile;             // lpstrFile 멤버의 길이

  LPTSTR lpstrFileTitle;           //파일의 이름을 리턴받기 위한 버퍼

  DWORD nMaxFileTitle;       //lpstrFileTitle 멤버의 길이를 지정

  LPCTSTR lpstrInitialDir;       //파일 찾기를 시작할 디렉토리르 지정

  LPCTSTR lpstrTitle;            // 대화 상자의 캡션을 지정

  DWORD Flags;                 // 대화상자의 모양과 옵션을 설정하는 플래그

  WORD nFileOffset;            // lpstrFile 버퍼 내의 파일명 옵셋을 리턴

  WORD nFileExtension;       // lpstrFile 버퍼 내의 파일 확장자 옵셋을 리턴

  LPCTSTR lpstrDefExt;         //사용자가 확장자를 입력하지 않았을 경우 디폴트 확장자를 지정

  DWORD lCustData;           // 혹 프로시져로 보낼 사용자 정의 데이터

  LPOFNHOOKPROC lpfnHook;      // OFN_ENABLEHOOK 플래그가 지정되어 있을 때 혹 프로짓져를 지정

  LPCTSTR lpTemplateName;        // OFN_ENABLEHOOK 플래그가 지정되어 있을 때 템플릿을 지정

} OPENFILENAME;

 

OPENFILENAME 구조체의 예

static char filepath[100], filename[100];
OPENFILENAME OFN;
memset(&OFN, 0, sizeof(OPENFILENAME));

OFN.lStructSize = sizeof(OPENFILENAME);     // 구조체의 크기

OFN.hwndOwner = hwnd;       // 윈도우 핸들
OFN.lpstrFile = filepath;          // 파일의 절대 경로를 저장할 공간

OFN.nMaxFileTitle = 100;        // 선택한 파일 경로의 최대 길이

OFN.lpstrFileTitle = filename;   // 선택한 파일의 이름을 지정

OFN.nMaxFile = 100;             // 선택한 파일 이름의 최대 크기

GetOpenFileName(&OFN)      // 열기 대화상자 호출

 

열기 대화상자

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    OPENFILENAME OFN;

    TCHAR str[100], lpstrFile[100] = _T("");

    TCHAR filter[] = _T("Every File(*.*) \0*.*\0Text File\0*.txt;*.doc\0");

 

    switch (iMsg)

    {

    case WM_CREATE:

        break;

    case WM_COMMAND:

        switch (LOWORD(wParam))

        {

        case ID_FILEOPEN:

            memset(&OFN, 0, sizeof(OPENFILENAME));

            OFN.lStructSize = sizeof(OPENFILENAME);

            OFN.hwndOwner = hwnd;     // 대화상자 소유자 (원도우 핸들)

            OFN.lpstrFilter = filter;

            OFN.lpstrFile = lpstrFile;        // 파일 경로

            OFN.nMaxFile = 100;            // lpstrFile의 최대 길이

            OFN.lpstrInitialDir = _T(".");    //파일 찾기를 시작할 디렉토리르 지정

            if (GetOpenFileName(&OFN) != 0)

            {

                _stprintf_s(str, _T("%s 파일을열겠습니까), OFN.lpstrFile);

                MessageBox(hwnd, str, _T("열기선택"), MB_OK);

            }

            break;

        }

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);

}

실행 결과]

 

파일 열기함수

_tfopen_s() 함수
erron_t _tfopen_s(
    FILE** fPtr,                     // fPtr는 파일을 열고 나서 열려 있는 파일에 대한 포인터를 저장할 곳의 주소
    const tchar_t *filename,    // 파일 이름
    const tchar_t *mode        // 어떤 용도로 파일을 열는지를 지정 ( r, w, a ), ccs =인코딩
);

 

ANSI, 유니코드 상관없이 줄 단위로 텍스트 파일 읽어오는 함수

_fgetts() 함수
tchar_t *_fgetts(
    tchar_t *str,    // fPtr이 가리키는 파일에서 한 줄을 읽어와 str이 가리키는 공간에 저장
    int n,            // str이 가리키는 공간의 크기
    FILE *fPtr
);

 

파일에 한 줄 단위로 쓰는 함수

_fputts() 함수
int _fputts(
    const tchar_t *str,    // fPtr가 가리키는 파일에 str이 가리키는 공간에 있는 문자열을 출력
    FILE *fPtr
);

함수가 성공적으로 출력되면 양수값을 반환하고 에러가 발생하면 EOF를 반환한다.

_fputts() 함수를 이용해 한글을 출력하고자 할 때는 파일을 열기 전에 먼저 locale을 한국어로 설정해야 한다.

_tsetlocale(LC_ALL, _T("korean"));

 

스트림에서 형식이 지정된 순서대로 읽어오는 함수

_ftscanf_s()함수
int _ftscanf_s(
    FILE*fPtr,
    const tchar_t *format,    // fPtr이 가리키는 파일로부터 format이 정한 순서대로 argument을 읽어온다.
    argument ...
);

파일의 끝에 도달하면 EOF를 반환한다.

 

형식이 지정된 순서대로 스트림에 출력하는 함수

_ftprintf_s() 함수
int _ftprintf_s(
    FILE *fPtr,
    const tchar_t *format,    // format에서 정한 순서대로 내용을 반영한 후 fPtr이 가리키는 파일에 출력 
    argument ...
);

 

문자열의 길이를 반환하는 함수

_tcslen() 함수
size_t _tcslen(
    const tchar_t *str    // str이 가리키는 문자열
);

 

텍스트파일 읽어오기

#include<stdio.h>
... 중간 생략 ...
void OutFromFile(TCHAR filename[], HWND hwnd)

{

    FILE *fPtr;

    HDC hdc;

    int line;

    TCHAR buffer[500];

    line = 0;

    hdc = GetDC(hwnd);

#ifdef _UNICODE

    _tfopen_s(&fPtr, filename, _T("r, ccs = UNICODE"));     // 유니코드로 파일 열기

#else

    _tfopen_s(&fPtr, filename, _T("r"));

#endif

    while (_fgetts(buffer, 100, fPtr) != NULL)      // 줄 단위로 텍스트 파일 읽어오는 함수

    {

        if (buffer[_tcslen(buffer) - 1] == _T('\n'))

            buffer[_tcslen(buffer) - 1] = NULL;

        TextOut(hdc, 0, line * 20, buffer, _tcslen(buffer));

        line++;

    }

    fclose(fPtr);

    ReleaseDC(hwnd, hdc);

}

 

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    OPENFILENAME OFN;

    TCHAR lpstrFile[100] = _T("");

    TCHAR filter[] = _T("Every File(*.*) \0*.*\0")

    _T("Text File\0*.txt;*.doc\0");

    switch (iMsg)

    {

    case WM_CREATE:

        break;

    case WM_COMMAND:

        switch (LOWORD(wParam))

        {

        case ID_FILEOPEN:

            memset(&OFN, 0, sizeof(OPENFILENAME));

            OFN.lStructSize = sizeof(OPENFILENAME);

            OFN.hwndOwner = hwnd;

            OFN.lpstrFilter = filter;

            OFN.lpstrFile = lpstrFile;            // 파일 경로

            OFN.nMaxFile = 256;

            OFN.lpstrInitialDir = _T(".");        //파일 찾기를 시작할 디렉토리르 지정

            if (GetOpenFileName(&OFN) != 0)       // 파일 오픈 대화상자 열기

                OutFromFile(OFN.lpstrFile, hwnd);    // 함수호출(파일이름과 윈도우 핸들)

                break;

        }

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);

}

실행 결과]

 

다른 이름으로 저장하기 대화상자

 

파일을 저장할때 사용하는 함수

BOOL GetSaveFileName( LPOPENFILENAME lpofn );

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    OPENFILENAME OFN;

    OPENFILENAME OFN;

    TCHAR lpstrFile[100] = _T("");

    TCHAR filter[] = _T("Every File(*.*) \0*.*\0")

    _T("Text File\0*.txt;*.doc\0");

    switch (iMsg)

    {

    case WM_CREATE:

        break;

    case WM_COMMAND:

        switch (LOWORD(wParam))

        {

        case ID_FILESAVE:

            memset(&SFN, 0, sizeof(OPENFILENAME));

            SFN.lStructSize = sizeof(OPENFILENAME);

            SFN.hwndOwner = hwnd;

            SFN.lpstrFilter = filter;

            SFN.lpstrFile = lpstrFile;             // 파일 경로

            SFN.nMaxFile = 256;

            SFN.lpstrInitialDir = _T(".");

            if (GetSaveFileName(&SFN) != 0)         // 다른이름으로 저장하기 대화상자 열기

            {

                _stprintf_s(str, _T("%s 파일로저장하겠습니까), SFN.lpstrFile);

                MessageBox(hwnd, str, _T("저장하기선택"), MB_OK);

            }

            break;

        case ID_FILEOPEN:

            memset(&OFN, 0, sizeof(OPENFILENAME));

            OFN.lStructSize = sizeof(OPENFILENAME);

            OFN.hwndOwner = hwnd;

            OFN.lpstrFilter = filter;

            OFN.lpstrFile = lpstrFile;

            OFN.nMaxFile = 256;

            OFN.lpstrInitialDir = _T(".");

            if (GetOpenFileName(&OFN) != 0)

                OutFromFile(OFN.lpstrFile, hwnd);

                break;

        }

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);

}

 

실행 결과]

 

'프로그램언어 > C++' 카테고리의 다른 글

API 단축키  (0) 2020.09.28
공용 대화상자 사용하기2  (0) 2020.09.25
API 리소스  (0) 2020.09.23
API 그리기 모드(Draw Mode)  (0) 2020.09.23
API 마우스  (0) 2020.09.22