MFC/윈도우 프로그래밍

MFC 윈도우 프로그래밍 7장 연습문제(1~8)

꾸준함. 2018. 4. 29. 02:36

윈도우 프로그래밍 Visual C++ 2010 MFC Programming(김선우, 신화서 저) 7장 연습문제입니다.

우선 1~8번 문제까지 풀었습니다.


[7-1]

// C연습문제71Doc serialization

//[파일]-[열기..] 메뉴에서 선택한 파일의 경로를 메시지 상자로 보여주도록

//FileIOTest 예제를 수정하시오.

void C연습문제71Doc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())

        {

               // TODO: 여기에 저장 코드를 추가합니다.

        }

        else

        {

               // TODO: 여기에 로딩 코드를 추가합니다.

               CFile *pFile = ar.GetFile();

               if (pFile)

               {

                       ::AfxMessageBox(pFile->GetFilePath());

               }

        }

}


[7-2]

// C연습문제72Doc serialization

//[파일]-[저장] 메뉴로 선택한 파일의 이름을 메시지 상자로 보여주도록

//FileIOTest 예제를 수정하시오

void C연습문제72Doc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())

        {

               // TODO: 여기에 저장 코드를 추가합니다.

               CFile *pFile = ar.GetFile();

               if (pFile)

               {

                       ::AfxMessageBox(pFile->GetFileName());

               }

        }

        else

        {

               // TODO: 여기에 로딩 코드를 추가합니다.

        }

}


[7-3]

// C연습문제73Doc serialization

//FilIOTest 예제를 다음과 같이 수정하시오.

//[파일]-[열기..] 메뉴로 파일을 선택하고, CFile::GetLength() 함수를 이용해

//얻은 파일의 크기와 CFile::SeekToEnd() 함수 및 CFile::SeekToBegin() 함수를 이용해

//계산할 파일의 크기를 메시지 상자로 보여준다

void C연습문제73Doc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())

        {

               // TODO: 여기에 저장 코드를 추가합니다.

        }

        else

        {

               // TODO: 여기에 로딩 코드를 추가합니다.

               CFile *pFile = ar.GetFile();

               if (pFile)

               {

                       DWORD length = pFile->GetLength();

 

                       pFile->SeekToBegin();

                       pFile->SeekToEnd();

                       DWORD position = pFile->GetPosition();

 

                       CString str;

                       str.Format(_T("파일의 크기: %u, 계산할 파일의 크기: %u", length, position));

                       MessageBox(NULL, str, NULL, NULL);

               }

        }

}


[7-4]

class C연습문제74Doc : public CDocument

{

        friend class C연습문제74View;

protected: // serialization에서만 만들어집니다.

        C연습문제74Doc();

        DECLARE_DYNCREATE(C연습문제74Doc)

        BOOL bitmap; //비트맵인가?

        DWORD length; //파일의 크기

// 특성입니다.

public:

       

// 작업입니다.

public:

 

// 재정의입니다.

public:

        virtual BOOL OnNewDocument();

        virtual void Serialize(CArchive& ar);

#ifdef SHARED_HANDLERS

        virtual void InitializeSearchContent();

        virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);

#endif // SHARED_HANDLERS

 

// 구현입니다.

public:

        virtual ~C연습문제74Doc();

#ifdef _DEBUG

        virtual void AssertValid() const;

        virtual void Dump(CDumpContext& dc) const;

#endif

 

protected:

 

// 생성된 메시지 맵 함수

protected:

        DECLARE_MESSAGE_MAP()

 

#ifdef SHARED_HANDLERS

        // 검색 처리기에 대한 검색 콘텐츠를 설정하는 도우미 함수

        void SetSearchContent(const CString& value);

#endif // SHARED_HANDLERS

};

 

// C연습문제74Doc serialization

//FileIOTest 예제를 다음과 같이 수정하시오.

//[파일]-[열기..] 메뉴로 파일을 선택하고, 해당 파일의 첫 두 바이트가

//'BM'이면 클라이언트 영역에 '비트맵 파일'이라고 표시한다.

//그리고 파일의 크기도 클라이언트 영역에 표시한다

BOOL C연습문제74Doc::OnNewDocument()

{

        if (!CDocument::OnNewDocument())

               return FALSE;

 

        // TODO: 여기에 재초기화 코드를 추가합니다.

        // SDI 문서는 이 문서를 다시 사용합니다.

        bitmap = FALSE;

        length = 0;

 

        return TRUE;

}

 

 

void C연습문제74Doc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())

        {

               // TODO: 여기에 저장 코드를 추가합니다.

        }

        else

        {

               // TODO: 여기에 로딩 코드를 추가합니다.

               char BM[3];

               CFile *pFile = ar.GetFile();

               if (pFile != NULL)

               {

                       length = pFile->GetLength();

                       bitmap = FALSE;

 

                       if (pFile->Read(BM, 2) == 2)

                       {

                              //첫 두글자가 BM

                              if ((char)BM[0] == 'B' && (char)BM[1] == 'M')

                                      bitmap = TRUE;

                       }

               }

        }

}


void C연습문제74View::OnDraw(CDC* pDC)

{

        C연습문제74Doc* pDoc = GetDocument();

        ASSERT_VALID(pDoc);

        if (!pDoc)

               return;

 

        // TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.

        CString str;

        if (pDoc->bitmap)

        {

               str.Format(_T("비트맵 파일\n파일 크기:%u"), pDoc->length);

        }

        else

        {

               str = _T("비트맵 파일이 선택되지 않았다");

        }

 

        CRect rect;

        GetClientRect(&rect);

        pDC->DrawText(str, rect, DT_CENTER || DT_VCENTER);

}


[7-5]

// C연습문제75Doc serialization

//FileIOTest 예제를 다음과 같이 수정하시오

//[파일]-[열기..] 메뉴로 텍스트 파일을 선택하고, 해당 파일의 문자열에

//CR('\r') LF('\n')이 함께 있으면 "윈도우 텍스트 파일입니다",

//CR이 없이 LF만 존재하는 문자열이 있으면 "윈도우 텍스트 파일이 아닙니다!"라고

//메시지 상자를 띄운다

void C연습문제75Doc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())

        {

               // TODO: 여기에 저장 코드를 추가합니다.

        }

        else

        {

               // TODO: 여기에 로딩 코드를 추가합니다.

               CFile *pFile = ar.GetFile();

               if (pFile)

               {

                       char ch;

                       BOOL read = FALSE;

                       BOOL crExist = FALSE;

                       while (1)

                       {

                              read = pFile->Read(&ch, 1);

                              if (read == FALSE)

                                      break;

                              if (ch == '\r')

                                      crExist = TRUE;

                              if (ch == '\n')

                              {

                                      if (!crExist)

                                      {

                                              ::MessageBox(NULL, _T("윈도우 텍스트 파일이 아닙니다!"), NULL, NULL);

                                              return;

                                      }

                                      crExist = FALSE;

                              }

                       }

                       ::MessageBox(NULL, _T("윈도우 텍스트 파일입니다!"), NULL, NULL);

               }

        }

}

 


[7-6]

// C연습문제76Doc serialization

//FileIOTest 예제를 다음과 같이 수정하시오.

//[파일]-[열기...] 메뉴로 텍스트 파일을 선택하고, CFile 클래스를 사용해

//파일 내 문자열을 줄 단위로 읽는다. 소문자를 모두 대문자로 변환한 뒤

//CStdioFile 클래스를 사용해 다른 파일로 저장한다.

void C연습문제76Doc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())

        {

               // TODO: 여기에 저장 코드를 추가합니다.

        }

        else

        {

               // TODO: 여기에 로딩 코드를 추가합니다.

               CFile *pFile = ar.GetFile();

               CStdioFile sFile;

 

               //텍스트 파일에 CStdioFile을 이용하여 저장

               //생성 | 작성 | 텍스트

               BOOL save = sFile.Open(pFile->GetFilePath() + _T(".txt"), CFile::modeCreate | CFile::modeWrite | CFile::typeText);

               if (save)

               {

                       CString str;

                       char ch;

                       BOOL read = FALSE;

 

                       while (1)

                       {

                              read = pFile->Read(&ch, 1);

                              if (!read)

                              {

                                      str.MakeUpper(); //대문자

                                      sFile.WriteString(str + "\n");

                                      return;

                              }

                              if (ch == '\n')

                              {

                                      str.MakeUpper();

                                      sFile.WriteString(str + "\n");

                                      str.Empty();

                                      continue;

                              }

                              str += ch;

                       }

               }

        }

}


[7-7]

class C연습문제77Doc : public CDocument

{

        friend class C연습문제77View;

protected: // serialization에서만 만들어집니다.

        C연습문제77Doc();

        DECLARE_DYNCREATE(C연습문제77Doc)

 

// 특성입니다.

public:

        CStringList list;

// 작업입니다.

public:

 

// 재정의입니다.

public:

        virtual BOOL OnNewDocument();

        virtual void Serialize(CArchive& ar);

#ifdef SHARED_HANDLERS

        virtual void InitializeSearchContent();

        virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);

#endif // SHARED_HANDLERS

 

// 구현입니다.

public:

        virtual ~C연습문제77Doc();

#ifdef _DEBUG

        virtual void AssertValid() const;

        virtual void Dump(CDumpContext& dc) const;

#endif

 

protected:

 

// 생성된 메시지 맵 함수

protected:

        DECLARE_MESSAGE_MAP()

 

#ifdef SHARED_HANDLERS

        // 검색 처리기에 대한 검색 콘텐츠를 설정하는 도우미 함수

        void SetSearchContent(const CString& value);

#endif // SHARED_HANDLERS

};

 

//FileIOTest 예제를 다음과 같이 수정하시오.

//[파일]-[열기..] 메뉴로 선택한 파일이 포함된 폴더를 CFileFind

//클래스를 사용해 검새하고 그 중 비트맵 파일만 선택해

//클라이언트 영역에 목록을 출력한다.

BOOL C연습문제77Doc::OnNewDocument()

{

        if (!CDocument::OnNewDocument())

               return FALSE;

 

        // TODO: 여기에 재초기화 코드를 추가합니다.

        // SDI 문서는 이 문서를 다시 사용합니다.

        list.RemoveAll();

        return TRUE;

}

 

 

 

 

// C연습문제77Doc serialization

 

void C연습문제77Doc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())

        {

               // TODO: 여기에 저장 코드를 추가합니다.

        }

        else

        {

               // TODO: 여기에 로딩 코드를 추가합니다.

               CFile *pFile = ar.GetFile();

               if (pFile)

               {

                       CString path = pFile->GetFilePath();

                       path.Replace(pFile->GetFileName(), _T("*.bmp"));

 

                       CFileFind finder;

                       BOOL find = finder.FindFile(path);

                       while (find)

                       {

                              find = finder.FindNextFileW();

                              if (!finder.IsDirectory())

                                      list.AddTail(finder.GetFileName());

                       }

               }

        }

}


void C연습문제77View::OnDraw(CDC* pDC)

{

        C연습문제77Doc* pDoc = GetDocument();

        ASSERT_VALID(pDoc);

        if (!pDoc)

               return;

 

        // TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.

        CString bmpStr;

 

        CStringList &list = pDoc->list;

        POSITION pos = list.GetHeadPosition();

        while (pos)

        {

               CString str = list.GetNext(pos);

               bmpStr += str + _T("\n");

        }

 

        CRect rect;

        GetClientRect(&rect);

        pDC->DrawText(bmpStr, rect, DT_CENTER | DT_VCENTER);

}


[7-8]


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


반응형