이번에는 공용 다이어로그를 바탕으로 파일 입출력을 하는 예제 프로그램을 하나 작성해 보겠습니다.

폼 디자인은 다음과 같이 해주시고 -


각 버튼과 에디트창의 ID는 -
  • 에디트창 : IDC_EDIT1
  • Open 버튼 : IDC_BUTTON1
  • Write 버튼 : IDC_BUTTON2

먼저 Edit창의 속성을 변경해 줍시다. Multiline을 True로 하고, Want Return을 True로 하고, Vertical Scroll을 True로 설정합시다.



이제 에디트창에 변수를 하나 만들도록 합시다. 에디트창을 오른쪽 클릭 한 후에 변수 추가를 눌러 주세요.




보시는 바와 같이 변수 이름은 c_edit로, 범주는 Control로 해주세요.

☆ 범주를 Value로 하시면 변수 형식은 CString으로 해야 하고, 값을 입력받을 때는 UpdateData(TRUE), 값을 입력할 때는 UpdateData(FALSE)를 호출하셔야 합니다.

※ 컨트롤 변수 체크박스를 해제하시면 컨트롤과 연관된 변수가 아닌 일반변수로 선언되어 연동되지 않으므로 유의하세요!





이제 IDC_BUTTON1(Open 버튼)을 더블클릭하여 OnButtonClick 이벤트를 작성합시다.

void CMFCFileInOutDlg::OnBnClickedButton1()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

    CString FileName;
    char Filter[] = "Text File(*.txt) |*.txt|모든파일(*.*)|*.*|";
    CFileDialog pDlg(TRUE, "text file(*.txt)", "*.txt", OFN_HIDEREADONLY |
        OFN_FILEMUSTEXIST, Filter, NULL);

    if(pDlg.DoModal() == IDOK)
    {
        FileName = pDlg.GetPathName();
        FILE *fp = fopen(FileName, "r");
        char *buf;

        if(fp == NULL)
            return;
        fseek(fp, 0, SEEK_END);
        int size = ftell(fp);

        //해당 크기만큼 buf를 메모리에 설정
        buf = new char[size];
        memset(buf, 0, size);

        fseek(fp, 0, SEEK_SET);
        fread(buf, size, 1, fp);

        // Win Application에서는 \r\n을 줄바꿈 문자로 인정하므로 \n을 \r\n으로 교체한다
        CString data = buf;
        data.Replace("\r\n", "\n");
        data.Replace("\n", "\r\n");
        delete buf;

        fclose(fp);

        c_edit.SetWindowText(data);
    }
}

굵게 줄 친 CFileDialog 생성과정이 제일 중요합니다.


bOpenFileDialog : 다이어로그를 열기 전용으로 열것인가를 결정합니다. FALSE는 쓰기용으로 열기.
lpszDefExt : 기본적으로 정해질 확장자를 정합니다. 여기서는 String으로 입력받네열.
lpszFileName : 기본적으로 정해질 파일 이름을 정합니다.
dwFlags : CFileDialog의 옵션을 지정합니다. 다수의 옵션을 정할때는 or(|)플래그를 이용하시면 됩니다. 중요 옵션 몇가지를 나열하면 -
OFN_HIDEREADONLY : 읽기 전용은 보이지 않게 합니다.
OFN_FILEMUSTEXIST : 파일이 존재하지 않으면 진행할 수 없습니다.
OFN_OVERWRITEPROMPT : 덮어쓰기 할 경우에 경고문을 안내합니다 (VB에도 이런거 있음 좋을텐데)
lpszFilter : 다이어로그에 사용할 필터를 지정합니다. char Filter[] 에서 지정한대로 필터를 설정해주시면 됩니다.
pParentWnd : 부모 윈도우를 설정합니다. 뭐 MFC니까 자동으로 핸들은 선택될테니 굳이 지정해 줄 필요 없음.


그리고 pDlg의 멤버변수를 보시면 GetFileNameGetPathName 이 따로 있는데, GetFileName은 파일 이름만 전달해주지만 GetPathName은 전체 경로를 전달해줍니다. VB와 비교해서 제일 편한 점인듯.




IDC_BUTTON2(Write 버튼)을 더블클릭하여 OnButtonClick 이벤트를 작성합시다.

void CMFCFileInOutDlg::OnBnClickedButton2()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

    CString Filename;
    char Filter[] = "Text File(*.txt) |*.txt|모든파일(*.*)|*.*|";
    CFileDialog pDlg(FALSE, "text file(*.txt)", "*.txt", OFN_HIDEREADONLY |
        OFN_OVERWRITEPROMPT, Filter, NULL);

    if (pDlg.DoModal() == IDOK)
    {
        Filename = pDlg.GetFileName();
        FILE *fp = fopen(Filename , "w");

        CString buf;
        c_edit.GetWindowText(buf);
        if(fp == NULL)
            AfxMessageBox("파일을 생성할수 없습니다.");
        fwrite(buf, buf.GetLength(), 1, fp);
        fclose(fp);
    }
}

설명은 위의 것과 동일합니다.

컴파일 하시면 간단한 텍스트 편집 프로그램이 완성됩니다.




생각보다 간단하네요 :D

일부 소스는 이 블로그에서 퍼왔음을 알려드립니다 : http://blog.naver.com/yjh1990/130009635358




PS. 프로그램을 실행시키면 처음에 텍스트창에 간단한 메시지가 나오는데 이 부분은 재정의 >> OnInitDialog에서 처리하였습니다.
profile image

안녕하세요 쿠나의 본진블로그입니다. 컴퓨터 관련 정보와 게임공략을 주로 다루고 있고 모든 이 글의 콘텐츠는 제가 직접 집필합니다. 자료를 퍼갈때는 출처를 꼭 표시해 주세요!! 콘텐츠에 대한 질답은 방명록이나 이메일(kgdgwn98@naver.com)으로 보내주시기 바랍니다~ ^^* by KUNA

  1. 세르엘 2008/11/16 15:29 답글수정삭제

    우왓, 계속되는 건설적인 포스팅.
    비건설적 포스팅의 달인이 되가는 저랑은 완벽히 다르군요. 우와아..

    • 쿠나 2008/11/16 15:30 수정삭제

      전 뻘글을 추구하는 편은 아니라서요 ㅇㅂㅇ..

      물론 텍스트큐브 멀티블로그가 지원되는 순간 이야기는 달라집니다.. [뭣이?]

  2. 네글자군 2008/11/16 16:17 답글수정삭제

    우오아오우아오오아ㅗ아와오아ㅗ아와와
    MFC네요!!!

    3년 전만해도 WinForm이 새로나온다니 뭐니해서 라이브러리 어쩌구저쩌구해서 뭐를 어떻게 배워야할지 머리아파서 다 때려치우고 glut써서 3D 렌더링 하던게 기억(....)이 새록새록 솟아나네요 (책값 압뷁....)
    지금 생각해보니 윈도 api쪽보단...opengl이 더 재밌었어요 ㅋㅋㅋㅋㅋ
    ((수학)+(물리))*(소스코드의 노가다)=3D
    특히 쉐이더 최적화는..... ㅋㅋㅋ
    쉐이더 만질때는 꼭 어셈블리만지는것 같은 기분이 들어요 ㅋㅋㅋ

  3. irina 2008/11/16 19:49 답글수정삭제

    VC++ 버전은? .NET인가요.. 네이티브 개발이 안되면 격렬하게 저항하고 싶지만.. 저는 VBA를 배워야 하므로 일단은 패스. 내년쯤 다시 볼께요-_-

  4. Noel 2008/11/17 10:40 답글수정삭제

    쿠나님 쿠우ㅜ우/..

트랙백 주소 :: http://kuna.wo.tc/402/trackback/
옵션
댓글 달기