MFC/윈도우 프로그래밍

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

꾸준함. 2018. 4. 30. 01:42

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

저번에 이어 나머지 연습문제를 풀어봤습니다.


[7-9]

// C연습문제79Doc serialization

//InputSaveLoad 예제의 CInputSaveLoadDoc::Serialize() 함수에서 직렬화,

//<< 또는 >> 연산자 대신 CArchive 클래스의 함수를 사용하여 데이터를 저장하고 불러오도록

//예제를 수정하시오

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

{

        if (ar.IsStoring())

        {

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

               //ar << m_bItalic << m_bUnderline;

               ar.Write(&m_bItalic, sizeof(m_bItalic));

               ar.Write(&m_bUnderline, sizeof(m_bUnderline));

               m_str.Serialize(ar);

        }

        else

        {

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

               //ar >> m_bItalic >> m_bUnderline;

               ar.Read(&m_bItalic, sizeof(m_bItalic));

               ar.Read(&m_bUnderline, sizeof(m_bUnderline));

               m_str.Serialize(ar);

        }

}


[7-10]

// C연습문제710Doc serialization

//InputSaveLoad 예제의 CInputSaveLoadDoc::Serialize() 함수에서 직렬화,

//CArchive 클래스 또는 << 또는 >> 연산자 대신 CFile 클래스를 사용해 데이터를 저장하고

//불러오도록 예제를 수정하시오

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

{

        if (ar.IsStoring())

        {

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

               //ar << m_bItalic << m_bUnderline;

               //m_str.Serialize(ar);

               CFile *pFile = ar.GetFile();

               if (pFile)

               {

                       pFile->Write(&m_bItalic, sizeof(m_bItalic));

                       pFile->Write(&m_bUnderline, sizeof(m_bUnderline));

 

                       int length = m_str.GetSize();

                       pFile->Write(&length, sizeof(length));

 

                       //순차적으로 저장

                       for (int i = 0; i < length; i++)

                       {

                              char ch = m_str.ElementAt(i);

                              pFile->Write(&ch, sizeof(ch));

                       }

               }

               else

               {

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

                       //ar >> m_bItalic >> m_bUnderline;

                       //m_str.Serialize(ar);

                       m_str.RemoveAll();

 

                       CFile *pFile = ar.GetFile();

                       if (pFile)

                       {

                              pFile->Read(&m_bItalic, sizeof(m_bItalic));

                              pFile->Read(&m_bUnderline, sizeof(m_bUnderline));

 

                              int length = 0;

                              pFile->Read(&length, sizeof(length));;

 

                              char ch = 0;

                              //순차적으로 불러온다

                              for (int i = 0; i < length; i++)

                              {

                                      pFile->Read(&ch, sizeof(ch));

                                      m_str.Add(ch);

                              }

                       }

               }

        }

}


[7-11]

 

// 연습문제 7-11Doc.h: C연습문제711Doc 클래스의 인터페이스

//InputSaveLoad 예제에 [스타일]-[볼드] 메뉴를 추가하고 볼드 기능을 구현하시오

//, 상태를 저장하고 다시 복원할 수 있게 한다

 

 

#pragma once

#include <afxtempl.h>

 

class C연습문제711Doc : public CDocument

{

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

        C연습문제711Doc();

        DECLARE_DYNCREATE(C연습문제711Doc)

 

// 특성입니다.

public:

        CArray<TCHAR, TCHAR> m_str; //글자 저장

        int m_bItalic, m_bUnderline, m_bBold; //스타일 저장

// 작업입니다.

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연습문제711Doc();

#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

public:

        afx_msg void OnStyleItalic();

        afx_msg void OnStyleUnderline();

        afx_msg void OnUpdateStyleItalic(CCmdUI *pCmdUI);

        afx_msg void OnUpdateStyleUnderline(CCmdUI *pCmdUI);

        afx_msg void OnStyleBold();

        afx_msg void OnUpdateStyleBold(CCmdUI *pCmdUI);

};

 

 

// 연습문제 7-11Doc.cpp: C연습문제711Doc 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-11.h"

#endif

 

#include "연습문제 7-11Doc.h"

 

#include <propkey.h>

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// C연습문제711Doc

 

IMPLEMENT_DYNCREATE(C연습문제711Doc, CDocument)

 

BEGIN_MESSAGE_MAP(C연습문제711Doc, CDocument)

        ON_COMMAND(ID_STYLE_ITALIC, &C연습문제711Doc::OnStyleItalic)

        ON_COMMAND(ID_STYLE_UNDERLINE, &C연습문제711Doc::OnStyleUnderline)

        ON_UPDATE_COMMAND_UI(ID_STYLE_ITALIC, &C연습문제711Doc::OnUpdateStyleItalic)

        ON_UPDATE_COMMAND_UI(ID_STYLE_UNDERLINE, &C연습문제711Doc::OnUpdateStyleUnderline)

        ON_COMMAND(ID_STYLE_BOLD, &C연습문제711Doc::OnStyleBold)

        ON_UPDATE_COMMAND_UI(ID_STYLE_BOLD, &C연습문제711Doc::OnUpdateStyleBold)

END_MESSAGE_MAP()

 

 

// C연습문제711Doc 생성/소멸

 

C연습문제711Doc::C연습문제711Doc()

{

        // TODO: 여기에 일회성 생성 코드를 추가합니다.

 

}

 

C연습문제711Doc::~C연습문제711Doc()

{

}

 

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

{

        if (!CDocument::OnNewDocument())

               return FALSE;

 

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

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

        m_str.RemoveAll();

        m_bItalic = m_bUnderline = m_bBold = FALSE;

        return TRUE;

}

 

 

 

 

// C연습문제711Doc serialization

 

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

{

        if (ar.IsStoring())

        {

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

               ar << m_bItalic << m_bUnderline << m_bBold;

               m_str.Serialize(ar);

        }

        else

        {

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

               ar >> m_bItalic >> m_bUnderline >> m_bBold;;

               m_str.Serialize(ar);

        }

}

 

#ifdef SHARED_HANDLERS

 

// 축소판 그림을 지원합니다.

void C연습문제711Doc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)

{

        // 문서의 데이터를 그리려면 이 코드를 수정하십시오.

        dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));

 

        CString strText = _T("TODO: implement thumbnail drawing here");

        LOGFONT lf;

 

        CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));

        pDefaultGUIFont->GetLogFont(&lf);

        lf.lfHeight = 36;

 

        CFont fontDraw;

        fontDraw.CreateFontIndirect(&lf);

 

        CFont* pOldFont = dc.SelectObject(&fontDraw);

        dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);

        dc.SelectObject(pOldFont);

}

 

// 검색 처리기를 지원합니다.

void C연습문제711Doc::InitializeSearchContent()

{

        CString strSearchContent;

        // 문서의 데이터에서 검색 콘텐츠를 설정합니다.

        // 콘텐츠 부분은 ";"로 구분되어야 합니다.

 

        // : strSearchContent = _T("point;rectangle;circle;ole object;");

        SetSearchContent(strSearchContent);

}

 

void C연습문제711Doc::SetSearchContent(const CString& value)

{

        if (value.IsEmpty())

        {

               RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);

        }

        else

        {

               CMFCFilterChunkValueImpl *pChunk = NULL;

               ATLTRY(pChunk = new CMFCFilterChunkValueImpl);

               if (pChunk != NULL)

               {

                       pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);

                       SetChunkValue(pChunk);

               }

        }

}

 

#endif // SHARED_HANDLERS

 

// C연습문제711Doc 진단

 

#ifdef _DEBUG

void C연습문제711Doc::AssertValid() const

{

        CDocument::AssertValid();

}

 

void C연습문제711Doc::Dump(CDumpContext& dc) const

{

        CDocument::Dump(dc);

}

#endif //_DEBUG

 

 

// C연습문제711Doc 명령

 

 

void C연습문제711Doc::OnStyleItalic()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_bItalic = !m_bItalic;

        SetModifiedFlag();

        UpdateAllViews(NULL);

}

 

 

void C연습문제711Doc::OnStyleUnderline()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_bUnderline = !m_bUnderline;

        SetModifiedFlag();

        UpdateAllViews(NULL);

}

 

 

void C연습문제711Doc::OnUpdateStyleItalic(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_bItalic == TRUE);

}

 

 

void C연습문제711Doc::OnUpdateStyleUnderline(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_bUnderline == TRUE);

}

 

 

void C연습문제711Doc::OnStyleBold()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_bBold = !m_bBold;

        SetModifiedFlag();

        UpdateAllViews(NULL);

}

 

 

void C연습문제711Doc::OnUpdateStyleBold(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_bBold == TRUE);

}

 

 

// 연습문제 7-11View.cpp: C연습문제711View 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-11.h"

#endif

 

#include "연습문제 7-11Doc.h"

#include "연습문제 7-11View.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// C연습문제711View

 

IMPLEMENT_DYNCREATE(C연습문제711View, CView)

 

BEGIN_MESSAGE_MAP(C연습문제711View, CView)

        // 표준 인쇄 명령입니다.

        ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

        ON_WM_CHAR()

END_MESSAGE_MAP()

 

// C연습문제711View 생성/소멸

 

C연습문제711View::C연습문제711View()

{

        // TODO: 여기에 생성 코드를 추가합니다.

 

}

 

C연습문제711View::~C연습문제711View()

{

}

 

BOOL C연습문제711View::PreCreateWindow(CREATESTRUCT& cs)

{

        // TODO: CREATESTRUCT cs를 수정하여 여기에서

        //  Window 클래스 또는 스타일을 수정합니다.

 

        return CView::PreCreateWindow(cs);

}

 

// C연습문제711View 그리기

 

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

{

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

        ASSERT_VALID(pDoc);

        if (!pDoc)

               return;

 

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

        CFont font;

        font.CreateFont(30, 0, 0, 0, pDoc->m_bBold ? FW_BOLD : FW_NORMAL, pDoc->m_bItalic, pDoc->m_bUnderline, 0, 0, 0, 0, 0, 0, _T("궁서"));

        pDC->SelectObject(&font);

 

        //현재까지 입력된 글자 화면에 출력

        CRect rect;

        GetClientRect(&rect);

        pDC->DrawText(pDoc->m_str.GetData(), pDoc->m_str.GetSize(), &rect, DT_LEFT);

}

 

 

// C연습문제711View 인쇄

 

BOOL C연습문제711View::OnPreparePrinting(CPrintInfo* pInfo)

{

        // 기본적인 준비

        return DoPreparePrinting(pInfo);

}

 

void C연습문제711View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄하기 전에 추가 초기화 작업을 추가합니다.

}

 

void C연습문제711View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄 후 정리 작업을 추가합니다.

}

 

 

// C연습문제711View 진단

 

#ifdef _DEBUG

void C연습문제711View::AssertValid() const

{

        CView::AssertValid();

}

 

void C연습문제711View::Dump(CDumpContext& dc) const

{

        CView::Dump(dc);

}

 

C연습문제711Doc* C연습문제711View::GetDocument() const // 디버그되지 않은 버전은 인라인으로 지정됩니다.

{

        ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C연습문제711Doc)));

        return (C연습문제711Doc*)m_pDocument;

}

#endif //_DEBUG

 

 

// C연습문제711View 메시지 처리기

 

 

void C연습문제711View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

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

 

        //[BackSpace] 키 입력 시 맨 마지막 글자 삭제

        if (nChar == _T('\b'))

        {

               if (pDoc->m_str.GetSize() > 0)

                       pDoc->m_str.RemoveAt(pDoc->m_str.GetSize() - 1);

        }

        else

               pDoc->m_str.Add(nChar);

 

        //데이터가 수정되었음을 도큐먼트 객체에 알린다

        pDoc->SetModifiedFlag();

 

        //뷰의 화면 갱신

        Invalidate();

        CView::OnChar(nChar, nRepCnt, nFlags);

}

 


[7-12]

 

// 연습문제 7-12Doc.h: C연습문제712Doc 클래스의 인터페이스

//InputSaveLoad 예제에 [글자크기]-10, [글자크기]-[12], [글자크기]-[14] 메뉴를 추가하고

//글자 크기를 변경하는 기능을 구현하시오

 

 

#pragma once

#include <afxtempl.h>

 

class C연습문제712Doc : public CDocument

{

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

        C연습문제712Doc();

        DECLARE_DYNCREATE(C연습문제712Doc)

 

// 특성입니다.

public:

        CArray<TCHAR, TCHAR> m_str;

        int m_bItalic, m_bUnderline;

        int m_FontSize;

// 작업입니다.

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연습문제712Doc();

#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

public:

        afx_msg void OnStyleItalic();

        afx_msg void OnUpdateStyleItalic(CCmdUI *pCmdUI);

        afx_msg void OnStyleUnderline();

        afx_msg void OnUpdateStyleUnderline(CCmdUI *pCmdUI);

        afx_msg void OnFontsize10();

        afx_msg void OnFontsize12();

        afx_msg void OnFontsize14();

        afx_msg void OnUpdateFontsize10(CCmdUI *pCmdUI);

        afx_msg void OnUpdateFontsize12(CCmdUI *pCmdUI);

        afx_msg void OnUpdateFontsize14(CCmdUI *pCmdUI);

};

 

 

// 연습문제 7-12Doc.cpp: C연습문제712Doc 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-12.h"

#endif

 

#include "연습문제 7-12Doc.h"

 

#include <propkey.h>

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// C연습문제712Doc

 

IMPLEMENT_DYNCREATE(C연습문제712Doc, CDocument)

 

BEGIN_MESSAGE_MAP(C연습문제712Doc, CDocument)

        ON_COMMAND(ID_STYLE_ITALIC, &C연습문제712Doc::OnStyleItalic)

        ON_UPDATE_COMMAND_UI(ID_STYLE_ITALIC, &C연습문제712Doc::OnUpdateStyleItalic)

        ON_COMMAND(ID_STYLE_UNDERLINE, &C연습문제712Doc::OnStyleUnderline)

        ON_UPDATE_COMMAND_UI(ID_STYLE_UNDERLINE, &C연습문제712Doc::OnUpdateStyleUnderline)

        ON_COMMAND(ID_FONTSIZE_10, &C연습문제712Doc::OnFontsize10)

        ON_COMMAND(ID_FONTSIZE_12, &C연습문제712Doc::OnFontsize12)

        ON_COMMAND(ID_FONTSIZE_14, &C연습문제712Doc::OnFontsize14)

        ON_UPDATE_COMMAND_UI(ID_FONTSIZE_10, &C연습문제712Doc::OnUpdateFontsize10)

        ON_UPDATE_COMMAND_UI(ID_FONTSIZE_12, &C연습문제712Doc::OnUpdateFontsize12)

        ON_UPDATE_COMMAND_UI(ID_FONTSIZE_14, &C연습문제712Doc::OnUpdateFontsize14)

END_MESSAGE_MAP()

 

 

// C연습문제712Doc 생성/소멸

 

C연습문제712Doc::C연습문제712Doc()

{

        // TODO: 여기에 일회성 생성 코드를 추가합니다.

 

}

 

C연습문제712Doc::~C연습문제712Doc()

{

}

 

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

{

        if (!CDocument::OnNewDocument())

               return FALSE;

 

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

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

        m_str.RemoveAll();

        m_bItalic = m_bUnderline = FALSE;

        m_FontSize = 10;

        return TRUE;

}

 

 

 

 

// C연습문제712Doc serialization

 

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

{

        if (ar.IsStoring())

        {

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

               ar << m_bItalic << m_bUnderline << m_FontSize;

               m_str.Serialize(ar);

        }

        else

        {

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

               ar >> m_bItalic >> m_bUnderline >> m_FontSize;

               m_str.Serialize(ar);

        }

}

 

#ifdef SHARED_HANDLERS

 

// 축소판 그림을 지원합니다.

void C연습문제712Doc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)

{

        // 문서의 데이터를 그리려면 이 코드를 수정하십시오.

        dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));

 

        CString strText = _T("TODO: implement thumbnail drawing here");

        LOGFONT lf;

 

        CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));

        pDefaultGUIFont->GetLogFont(&lf);

        lf.lfHeight = 36;

 

        CFont fontDraw;

        fontDraw.CreateFontIndirect(&lf);

 

        CFont* pOldFont = dc.SelectObject(&fontDraw);

        dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);

        dc.SelectObject(pOldFont);

}

 

// 검색 처리기를 지원합니다.

void C연습문제712Doc::InitializeSearchContent()

{

        CString strSearchContent;

        // 문서의 데이터에서 검색 콘텐츠를 설정합니다.

        // 콘텐츠 부분은 ";"로 구분되어야 합니다.

 

        // : strSearchContent = _T("point;rectangle;circle;ole object;");

        SetSearchContent(strSearchContent);

}

 

void C연습문제712Doc::SetSearchContent(const CString& value)

{

        if (value.IsEmpty())

        {

               RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);

        }

        else

        {

               CMFCFilterChunkValueImpl *pChunk = NULL;

               ATLTRY(pChunk = new CMFCFilterChunkValueImpl);

               if (pChunk != NULL)

               {

                       pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);

                       SetChunkValue(pChunk);

               }

        }

}

 

#endif // SHARED_HANDLERS

 

// C연습문제712Doc 진단

 

#ifdef _DEBUG

void C연습문제712Doc::AssertValid() const

{

        CDocument::AssertValid();

}

 

void C연습문제712Doc::Dump(CDumpContext& dc) const

{

        CDocument::Dump(dc);

}

#endif //_DEBUG

 

 

// C연습문제712Doc 명령

 

 

void C연습문제712Doc::OnStyleItalic()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_bItalic = !m_bItalic;

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면을 갱신

}

 

 

void C연습문제712Doc::OnUpdateStyleItalic(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_bItalic == TRUE);

}

 

 

void C연습문제712Doc::OnStyleUnderline()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_bUnderline = !m_bUnderline;

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면을 갱신

}

 

 

void C연습문제712Doc::OnUpdateStyleUnderline(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_bUnderline == TRUE);

}

 

 

void C연습문제712Doc::OnFontsize10()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_FontSize = 10; //글자 크기 10

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면 갱신

}

 

 

void C연습문제712Doc::OnFontsize12()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_FontSize = 12; //글자 크기 12

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면 갱신

}

 

 

void C연습문제712Doc::OnFontsize14()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_FontSize = 14; //글자 크기 14

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면 갱신

}

 

 

void C연습문제712Doc::OnUpdateFontsize10(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_FontSize == 10);

}

 

 

void C연습문제712Doc::OnUpdateFontsize12(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_FontSize == 12);

}

 

 

void C연습문제712Doc::OnUpdateFontsize14(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_FontSize == 14);

}

 

 

// 연습문제 7-12View.cpp: C연습문제712View 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-12.h"

#endif

 

#include "연습문제 7-12Doc.h"

#include "연습문제 7-12View.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// C연습문제712View

 

IMPLEMENT_DYNCREATE(C연습문제712View, CView)

 

BEGIN_MESSAGE_MAP(C연습문제712View, CView)

        // 표준 인쇄 명령입니다.

        ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

        ON_WM_CHAR()

END_MESSAGE_MAP()

 

// C연습문제712View 생성/소멸

 

C연습문제712View::C연습문제712View()

{

        // TODO: 여기에 생성 코드를 추가합니다.

 

}

 

C연습문제712View::~C연습문제712View()

{

}

 

BOOL C연습문제712View::PreCreateWindow(CREATESTRUCT& cs)

{

        // TODO: CREATESTRUCT cs를 수정하여 여기에서

        //  Window 클래스 또는 스타일을 수정합니다.

 

        return CView::PreCreateWindow(cs);

}

 

// C연습문제712View 그리기

 

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

{

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

        ASSERT_VALID(pDoc);

        if (!pDoc)

               return;

 

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

        int height = -::MulDiv(pDoc->m_FontSize, ::GetDeviceCaps(pDC->GetSafeHdc(), LOGPIXELSY), 72);

 

        CFont font;

        font.CreateFont(height, 0, 0, 0, 0, pDoc->m_bItalic, pDoc->m_bUnderline, 0, 0, 0, 0, 0, 0, _T("궁서"));

        pDC->SelectObject(&font);

 

        //현재까지 입력된 글자 화면에 출력

        CRect rect;

        GetClientRect(&rect);

        pDC->DrawText(pDoc->m_str.GetData(), pDoc->m_str.GetSize(), &rect, DT_LEFT);

}

 

 

// C연습문제712View 인쇄

 

BOOL C연습문제712View::OnPreparePrinting(CPrintInfo* pInfo)

{

        // 기본적인 준비

        return DoPreparePrinting(pInfo);

}

 

void C연습문제712View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄하기 전에 추가 초기화 작업을 추가합니다.

}

 

void C연습문제712View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄 후 정리 작업을 추가합니다.

}

 

 

// C연습문제712View 진단

 

#ifdef _DEBUG

void C연습문제712View::AssertValid() const

{

        CView::AssertValid();

}

 

void C연습문제712View::Dump(CDumpContext& dc) const

{

        CView::Dump(dc);

}

 

C연습문제712Doc* C연습문제712View::GetDocument() const // 디버그되지 않은 버전은 인라인으로 지정됩니다.

{

        ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C연습문제712Doc)));

        return (C연습문제712Doc*)m_pDocument;

}

#endif //_DEBUG

 

 

// C연습문제712View 메시지 처리기

 

 

void C연습문제712View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

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

 

        //[Backspace] 키 입력 시 맨 마지막 글자 삭제

        if (nChar == _T('\b'))

        {

               if (pDoc->m_str.GetSize() > 0)

                       pDoc->m_str.RemoveAt(pDoc->m_str.GetSize() - 1);

        }

        else

               pDoc->m_str.Add(nChar);

 

        //데이터가 수정되었음을 도큐먼트 객체에 알린다

        pDoc->SetModifiedFlag();

 

        //뷰의 화면을 갱신

        Invalidate();

        CView::OnChar(nChar, nRepCnt, nFlags);

}

 


[7-13]

 

// 연습문제 7-13Doc.h: C연습문제713Doc 클래스의 인터페이스

//InputSaveLoad 예제에 [색상]-[빨간색], [색상]-[초록색], [색상]-[파란색] 메뉴를 추가하고

//색상을 변경하는 기능을 구현하시오

 

 

#pragma once

#include <afxtempl.h>

 

class C연습문제713Doc : public CDocument

{

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

        C연습문제713Doc();

        DECLARE_DYNCREATE(C연습문제713Doc)

 

// 특성입니다.

public:

        CArray<TCHAR, TCHAR> m_str; //글자 저장

        int m_bItalic, m_bUnderline; //스타일 저장

        COLORREF m_color;

// 작업입니다.

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연습문제713Doc();

#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

public:

        afx_msg void OnStyleItalic();

        afx_msg void OnStyleUnderline();

        afx_msg void OnUpdateStyleItalic(CCmdUI *pCmdUI);

        afx_msg void OnUpdateStyleUnderline(CCmdUI *pCmdUI);

        afx_msg void OnColorRed();

        afx_msg void OnColorGreen();

        afx_msg void OnColorBlue();

        afx_msg void OnUpdateColorRed(CCmdUI *pCmdUI);

        afx_msg void OnUpdateColorGreen(CCmdUI *pCmdUI);

        afx_msg void OnUpdateColorBlue(CCmdUI *pCmdUI);

};

 

 

// 연습문제 7-13Doc.cpp: C연습문제713Doc 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-13.h"

#endif

 

#include "연습문제 7-13Doc.h"

 

#include <propkey.h>

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// C연습문제713Doc

 

IMPLEMENT_DYNCREATE(C연습문제713Doc, CDocument)

 

BEGIN_MESSAGE_MAP(C연습문제713Doc, CDocument)

        ON_COMMAND(ID_STYLE_ITALIC, &C연습문제713Doc::OnStyleItalic)

        ON_COMMAND(ID_STYLE_UNDERLINE, &C연습문제713Doc::OnStyleUnderline)

        ON_UPDATE_COMMAND_UI(ID_STYLE_ITALIC, &C연습문제713Doc::OnUpdateStyleItalic)

        ON_UPDATE_COMMAND_UI(ID_STYLE_UNDERLINE, &C연습문제713Doc::OnUpdateStyleUnderline)

        ON_COMMAND(ID_COLOR_RED, &C연습문제713Doc::OnColorRed)

        ON_COMMAND(ID_COLOR_GREEN, &C연습문제713Doc::OnColorGreen)

        ON_COMMAND(ID_COLOR_BLUE, &C연습문제713Doc::OnColorBlue)

        ON_UPDATE_COMMAND_UI(ID_COLOR_RED, &C연습문제713Doc::OnUpdateColorRed)

        ON_UPDATE_COMMAND_UI(ID_COLOR_GREEN, &C연습문제713Doc::OnUpdateColorGreen)

        ON_UPDATE_COMMAND_UI(ID_COLOR_BLUE, &C연습문제713Doc::OnUpdateColorBlue)

END_MESSAGE_MAP()

 

 

// C연습문제713Doc 생성/소멸

 

C연습문제713Doc::C연습문제713Doc()

{

        // TODO: 여기에 일회성 생성 코드를 추가합니다.

 

}

 

C연습문제713Doc::~C연습문제713Doc()

{

}

 

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

{

        if (!CDocument::OnNewDocument())

               return FALSE;

 

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

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

        m_str.RemoveAll();

        m_bItalic = m_bUnderline = FALSE;

        m_color = RGB(255, 0, 0);

        return TRUE;

}

 

 

 

 

// C연습문제713Doc serialization

 

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

{

        if (ar.IsStoring())

        {

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

               ar << m_bItalic << m_bUnderline << m_color;

               m_str.Serialize(ar);

        }

        else

        {

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

               ar >> m_bItalic >> m_bUnderline >> m_color;

               m_str.Serialize(ar);

        }

}

 

#ifdef SHARED_HANDLERS

 

// 축소판 그림을 지원합니다.

void C연습문제713Doc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)

{

        // 문서의 데이터를 그리려면 이 코드를 수정하십시오.

        dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));

 

        CString strText = _T("TODO: implement thumbnail drawing here");

        LOGFONT lf;

 

        CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));

        pDefaultGUIFont->GetLogFont(&lf);

        lf.lfHeight = 36;

 

        CFont fontDraw;

        fontDraw.CreateFontIndirect(&lf);

 

        CFont* pOldFont = dc.SelectObject(&fontDraw);

        dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);

        dc.SelectObject(pOldFont);

}

 

// 검색 처리기를 지원합니다.

void C연습문제713Doc::InitializeSearchContent()

{

        CString strSearchContent;

        // 문서의 데이터에서 검색 콘텐츠를 설정합니다.

        // 콘텐츠 부분은 ";"로 구분되어야 합니다.

 

        // : strSearchContent = _T("point;rectangle;circle;ole object;");

        SetSearchContent(strSearchContent);

}

 

void C연습문제713Doc::SetSearchContent(const CString& value)

{

        if (value.IsEmpty())

        {

               RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);

        }

        else

        {

               CMFCFilterChunkValueImpl *pChunk = NULL;

               ATLTRY(pChunk = new CMFCFilterChunkValueImpl);

               if (pChunk != NULL)

               {

                       pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);

                       SetChunkValue(pChunk);

               }

        }

}

 

#endif // SHARED_HANDLERS

 

// C연습문제713Doc 진단

 

#ifdef _DEBUG

void C연습문제713Doc::AssertValid() const

{

        CDocument::AssertValid();

}

 

void C연습문제713Doc::Dump(CDumpContext& dc) const

{

        CDocument::Dump(dc);

}

#endif //_DEBUG

 

 

// C연습문제713Doc 명령

 

 

void C연습문제713Doc::OnStyleItalic()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_bItalic = !m_bItalic;

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면 갱신

}

 

 

void C연습문제713Doc::OnStyleUnderline()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_bUnderline = !m_bUnderline;

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면 갱신

}

 

 

void C연습문제713Doc::OnUpdateStyleItalic(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_bItalic == TRUE);

}

 

 

void C연습문제713Doc::OnUpdateStyleUnderline(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_bUnderline == TRUE);

}

 

 

void C연습문제713Doc::OnColorRed()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_color = RGB(255, 0, 0);

        SetModifiedFlag();

        UpdateAllViews(NULL);

}

 

 

void C연습문제713Doc::OnColorGreen()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_color = RGB(0, 255, 0);

        SetModifiedFlag();

        UpdateAllViews(NULL);

}

 

 

void C연습문제713Doc::OnColorBlue()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_color = RGB(0, 0, 255);

        SetModifiedFlag();

        UpdateAllViews(NULL);

}

 

 

void C연습문제713Doc::OnUpdateColorRed(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_color == RGB(255, 0, 0));

}

 

 

void C연습문제713Doc::OnUpdateColorGreen(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_color == RGB(0, 255, 0));

}

 

 

void C연습문제713Doc::OnUpdateColorBlue(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_color == RGB(0, 0, 255));

}

 

 

// 연습문제 7-13View.cpp: C연습문제713View 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-13.h"

#endif

 

#include "연습문제 7-13Doc.h"

#include "연습문제 7-13View.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// C연습문제713View

 

IMPLEMENT_DYNCREATE(C연습문제713View, CView)

 

BEGIN_MESSAGE_MAP(C연습문제713View, CView)

        // 표준 인쇄 명령입니다.

        ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

        ON_WM_CHAR()

END_MESSAGE_MAP()

 

// C연습문제713View 생성/소멸

 

C연습문제713View::C연습문제713View()

{

        // TODO: 여기에 생성 코드를 추가합니다.

 

}

 

C연습문제713View::~C연습문제713View()

{

}

 

BOOL C연습문제713View::PreCreateWindow(CREATESTRUCT& cs)

{

        // TODO: CREATESTRUCT cs를 수정하여 여기에서

        //  Window 클래스 또는 스타일을 수정합니다.

 

        return CView::PreCreateWindow(cs);

}

 

// C연습문제713View 그리기

 

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

{

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

        ASSERT_VALID(pDoc);

        if (!pDoc)

               return;

 

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

        pDC->SetTextColor(pDoc->m_color); //색깔 지정

 

        CFont font;

        font.CreateFont(30, 0, 0, 0, 0, pDoc->m_bItalic, pDoc->m_bUnderline, 0, 0, 0, 0, 0, 0, _T("궁서"));

        pDC->SelectObject(&font);

 

        //현재까지 입력된 글자를 화면에 출력

        CRect rect;

        GetClientRect(&rect);

        pDC->DrawText(pDoc->m_str.GetData(), pDoc->m_str.GetSize(), &rect, DT_LEFT);

}

 

 

// C연습문제713View 인쇄

 

BOOL C연습문제713View::OnPreparePrinting(CPrintInfo* pInfo)

{

        // 기본적인 준비

        return DoPreparePrinting(pInfo);

}

 

void C연습문제713View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄하기 전에 추가 초기화 작업을 추가합니다.

}

 

void C연습문제713View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄 후 정리 작업을 추가합니다.

}

 

 

// C연습문제713View 진단

 

#ifdef _DEBUG

void C연습문제713View::AssertValid() const

{

        CView::AssertValid();

}

 

void C연습문제713View::Dump(CDumpContext& dc) const

{

        CView::Dump(dc);

}

 

C연습문제713Doc* C연습문제713View::GetDocument() const // 디버그되지 않은 버전은 인라인으로 지정됩니다.

{

        ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C연습문제713Doc)));

        return (C연습문제713Doc*)m_pDocument;

}

#endif //_DEBUG

 

 

// C연습문제713View 메시지 처리기

 

 

void C연습문제713View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

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

 

        //[Backspace] 키 입력 시 맨 마지막 글자 삭제

        if (nChar == _T('\b'))

        {

               if (pDoc->m_str.GetSize() > 0)

                       pDoc->m_str.RemoveAt(pDoc->m_str.GetSize() - 1);

        }

        else

               pDoc->m_str.Add(nChar);

 

        //데이터가 수정되었음을 도큐먼트 객체에 알린다

        pDoc->SetModifiedFlag();

 

        //뷰의 화면 갱신

        Invalidate();

        CView::OnChar(nChar, nRepCnt, nFlags);

}

 


[7-14]

 

// 연습문제 7-14Doc.h: C연습문제714Doc 클래스의 인터페이스

//InputSaveLoad 예제를 다음과 같이 수정하시오. [폰트]-[굴림], [폰트]-[궁서],

//[폰트]-[바탕] 메뉴를 추가하고 각 메뉴가 동작하도록 프로그래밍하시오

 

 

#pragma once

#include <afxtempl.h>

 

class C연습문제714Doc : public CDocument

{

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

        C연습문제714Doc();

        DECLARE_DYNCREATE(C연습문제714Doc)

 

// 특성입니다.

public:

        CArray<TCHAR, TCHAR> m_str;

        int m_bItalic, m_bUnderline;

        CString m_font;

// 작업입니다.

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연습문제714Doc();

#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

public:

        afx_msg void OnStyleItalic();

        afx_msg void OnStyleUnderline();

        afx_msg void OnUpdateStyleItalic(CCmdUI *pCmdUI);

        afx_msg void OnUpdateStyleUnderline(CCmdUI *pCmdUI);

        afx_msg void OnFontGoolim();

        afx_msg void OnStyleGoongseo();

        afx_msg void OnFontBatang();

        afx_msg void OnUpdateFontGoolim(CCmdUI *pCmdUI);

        afx_msg void OnUpdateStyleGoongseo(CCmdUI *pCmdUI);

        afx_msg void OnUpdateFontBatang(CCmdUI *pCmdUI);

};

 

 

// 연습문제 7-14Doc.cpp: C연습문제714Doc 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-14.h"

#endif

 

#include "연습문제 7-14Doc.h"

 

#include <propkey.h>

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// C연습문제714Doc

 

IMPLEMENT_DYNCREATE(C연습문제714Doc, CDocument)

 

BEGIN_MESSAGE_MAP(C연습문제714Doc, CDocument)

        ON_COMMAND(ID_STYLE_ITALIC, &C연습문제714Doc::OnStyleItalic)

        ON_COMMAND(ID_STYLE_UNDERLINE, &C연습문제714Doc::OnStyleUnderline)

        ON_UPDATE_COMMAND_UI(ID_STYLE_ITALIC, &C연습문제714Doc::OnUpdateStyleItalic)

        ON_UPDATE_COMMAND_UI(ID_STYLE_UNDERLINE, &C연습문제714Doc::OnUpdateStyleUnderline)

        ON_COMMAND(ID_FONT_Goolim, &C연습문제714Doc::OnFontGoolim)

        ON_COMMAND(ID_STYLE_GOONGSEO, &C연습문제714Doc::OnStyleGoongseo)

        ON_COMMAND(ID_FONT_BATANG, &C연습문제714Doc::OnFontBatang)

        ON_UPDATE_COMMAND_UI(ID_FONT_Goolim, &C연습문제714Doc::OnUpdateFontGoolim)

        ON_UPDATE_COMMAND_UI(ID_STYLE_GOONGSEO, &C연습문제714Doc::OnUpdateStyleGoongseo)

        ON_UPDATE_COMMAND_UI(ID_FONT_BATANG, &C연습문제714Doc::OnUpdateFontBatang)

END_MESSAGE_MAP()

 

 

// C연습문제714Doc 생성/소멸

 

C연습문제714Doc::C연습문제714Doc()

{

        // TODO: 여기에 일회성 생성 코드를 추가합니다.

 

}

 

C연습문제714Doc::~C연습문제714Doc()

{

}

 

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

{

        if (!CDocument::OnNewDocument())

               return FALSE;

 

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

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

        m_str.RemoveAll();

        m_bItalic = m_bUnderline = FALSE;

        m_font = _T("굴림");

        return TRUE;

}

 

 

 

 

// C연습문제714Doc serialization

 

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

{

        if (ar.IsStoring())

        {

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

               ar << m_bItalic << m_bUnderline << m_font;

               m_str.Serialize(ar);

        }

        else

        {

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

               ar >> m_bItalic >> m_bUnderline >> m_font;

               m_str.Serialize(ar);

        }

}

 

#ifdef SHARED_HANDLERS

 

// 축소판 그림을 지원합니다.

void C연습문제714Doc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)

{

        // 문서의 데이터를 그리려면 이 코드를 수정하십시오.

        dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));

 

        CString strText = _T("TODO: implement thumbnail drawing here");

        LOGFONT lf;

 

        CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));

        pDefaultGUIFont->GetLogFont(&lf);

        lf.lfHeight = 36;

 

        CFont fontDraw;

        fontDraw.CreateFontIndirect(&lf);

 

        CFont* pOldFont = dc.SelectObject(&fontDraw);

        dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);

        dc.SelectObject(pOldFont);

}

 

// 검색 처리기를 지원합니다.

void C연습문제714Doc::InitializeSearchContent()

{

        CString strSearchContent;

        // 문서의 데이터에서 검색 콘텐츠를 설정합니다.

        // 콘텐츠 부분은 ";"로 구분되어야 합니다.

 

        // : strSearchContent = _T("point;rectangle;circle;ole object;");

        SetSearchContent(strSearchContent);

}

 

void C연습문제714Doc::SetSearchContent(const CString& value)

{

        if (value.IsEmpty())

        {

               RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);

        }

        else

        {

               CMFCFilterChunkValueImpl *pChunk = NULL;

               ATLTRY(pChunk = new CMFCFilterChunkValueImpl);

               if (pChunk != NULL)

               {

                       pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);

                       SetChunkValue(pChunk);

               }

        }

}

 

#endif // SHARED_HANDLERS

 

// C연습문제714Doc 진단

 

#ifdef _DEBUG

void C연습문제714Doc::AssertValid() const

{

        CDocument::AssertValid();

}

 

void C연습문제714Doc::Dump(CDumpContext& dc) const

{

        CDocument::Dump(dc);

}

#endif //_DEBUG

 

 

// C연습문제714Doc 명령

 

 

void C연습문제714Doc::OnStyleItalic()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_bItalic = !m_bItalic;

        SetModifiedFlag();

        UpdateAllViews(NULL);

}

 

 

void C연습문제714Doc::OnStyleUnderline()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_bUnderline = !m_bUnderline;

        SetModifiedFlag();

        UpdateAllViews(NULL);

}

 

 

void C연습문제714Doc::OnUpdateStyleItalic(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_bItalic == TRUE);

}

 

 

void C연습문제714Doc::OnUpdateStyleUnderline(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_bUnderline == TRUE);

}

 

 

void C연습문제714Doc::OnFontGoolim()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_font = _T("굴림");

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면을 갱신

}

 

 

void C연습문제714Doc::OnStyleGoongseo()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_font = _T("궁서");

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면을 갱신

}

 

 

void C연습문제714Doc::OnFontBatang()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_font = _T("바탕");

        SetModifiedFlag();

        UpdateAllViews(NULL); //뷰의 화면을 갱신

}

 

 

void C연습문제714Doc::OnUpdateFontGoolim(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_font == _T("굴림"));

}

 

 

void C연습문제714Doc::OnUpdateStyleGoongseo(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_font == _T("궁서"));

}

 

 

void C연습문제714Doc::OnUpdateFontBatang(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_font == _T("바탕"));

}

 

 

// 연습문제 7-14View.cpp: C연습문제714View 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-14.h"

#endif

 

#include "연습문제 7-14Doc.h"

#include "연습문제 7-14View.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// C연습문제714View

 

IMPLEMENT_DYNCREATE(C연습문제714View, CView)

 

BEGIN_MESSAGE_MAP(C연습문제714View, CView)

        // 표준 인쇄 명령입니다.

        ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

        ON_WM_CHAR()

END_MESSAGE_MAP()

 

// C연습문제714View 생성/소멸

 

C연습문제714View::C연습문제714View()

{

        // TODO: 여기에 생성 코드를 추가합니다.

 

}

 

C연습문제714View::~C연습문제714View()

{

}

 

BOOL C연습문제714View::PreCreateWindow(CREATESTRUCT& cs)

{

        // TODO: CREATESTRUCT cs를 수정하여 여기에서

        //  Window 클래스 또는 스타일을 수정합니다.

 

        return CView::PreCreateWindow(cs);

}

 

// C연습문제714View 그리기

 

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

{

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

        ASSERT_VALID(pDoc);

        if (!pDoc)

               return;

 

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

        CFont font;

        font.CreateFont(30, 0, 0, 0, 0, pDoc->m_bItalic, pDoc->m_bUnderline, 0, 0, 0, 0, 0, 0, pDoc->m_font);

        pDC->SelectObject(&font);

 

        CRect rect;

        GetClientRect(&rect);

        pDC->DrawText(pDoc->m_str.GetData(), pDoc->m_str.GetSize(), &rect, DT_LEFT);

}

 

 

// C연습문제714View 인쇄

 

BOOL C연습문제714View::OnPreparePrinting(CPrintInfo* pInfo)

{

        // 기본적인 준비

        return DoPreparePrinting(pInfo);

}

 

void C연습문제714View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄하기 전에 추가 초기화 작업을 추가합니다.

}

 

void C연습문제714View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄 후 정리 작업을 추가합니다.

}

 

 

// C연습문제714View 진단

 

#ifdef _DEBUG

void C연습문제714View::AssertValid() const

{

        CView::AssertValid();

}

 

void C연습문제714View::Dump(CDumpContext& dc) const

{

        CView::Dump(dc);

}

 

C연습문제714Doc* C연습문제714View::GetDocument() const // 디버그되지 않은 버전은 인라인으로 지정됩니다.

{

        ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C연습문제714Doc)));

        return (C연습문제714Doc*)m_pDocument;

}

#endif //_DEBUG

 

 

// C연습문제714View 메시지 처리기

 

 

void C연습문제714View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

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

 

        //[Backspace] 키 입력 시 맨 마지막 글자 삭제

        if (nChar == _T('\b'))

        {

               if (pDoc->m_str.GetSize() > 0)

                       pDoc->m_str.RemoveAt(pDoc->m_str.GetSize() - 1);

        }

        else

               pDoc->m_str.Add(nChar);

 

        //데이터가 수정되었음을 도큐먼트 객체에 알린다

        pDoc->SetModifiedFlag();

 

        //뷰의 화면을 갱신한다

        Invalidate();

        CView::OnChar(nChar, nRepCnt, nFlags);

}

 


[7-15]

// C연습문제715View 그리기

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

//일반적으로 사용되는 세로 17cm, 가로 9.5cm의 다이어리 속지를 프린터로 출력한다

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

{

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

        ASSERT_VALID(pDoc);

        if (!pDoc)

               return;

 

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

        pDC->SetMapMode(MM_LOMETRIC);

 

        //테두리

        CRect rect(CPoint(0, 0), CPoint(950, 1700));

        //4사분면

        rect.top *= -1;

        rect.bottom *= -1;

        pDC->Rectangle(&rect);

 

        pDC->TextOutW(100, -100, CString(_T("printer format")));

}


[7-16]

 

// 연습문제 7-16Doc.h: C연습문제716Doc 클래스의 인터페이스

//FileIOTest 예제를 다음과 같이 수정하시오. 클라이언트 영역에 자유 곡선을 그리는

//기능을 구현하고, 그 내용을 저장하고 불러올 수 있게 프로그래밍한다.

 

 

#pragma once

#include <afxtempl.h>

 

class C연습문제716Doc : public CDocument

{

        friend class C연습문제716View;

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

        C연습문제716Doc();

        DECLARE_DYNCREATE(C연습문제716Doc)

 

// 특성입니다.

public:

        CList<CPoint, POINT> m_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연습문제716Doc();

#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

};

 

 

// 연습문제 7-16Doc.cpp: C연습문제716Doc 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-16.h"

#endif

 

#include "연습문제 7-16Doc.h"

 

#include <propkey.h>

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// C연습문제716Doc

 

IMPLEMENT_DYNCREATE(C연습문제716Doc, CDocument)

 

BEGIN_MESSAGE_MAP(C연습문제716Doc, CDocument)

END_MESSAGE_MAP()

 

 

// C연습문제716Doc 생성/소멸

 

C연습문제716Doc::C연습문제716Doc()

{

        // TODO: 여기에 일회성 생성 코드를 추가합니다.

 

}

 

C연습문제716Doc::~C연습문제716Doc()

{

}

 

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

{

        if (!CDocument::OnNewDocument())

               return FALSE;

 

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

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

        m_list.RemoveAll();

        return TRUE;

}

 

 

 

 

// C연습문제716Doc serialization

 

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

{

        if (ar.IsStoring())

        {

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

        }

        else

        {

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

        }

        m_list.Serialize(ar);

}

 

#ifdef SHARED_HANDLERS

 

// 축소판 그림을 지원합니다.

void C연습문제716Doc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)

{

        // 문서의 데이터를 그리려면 이 코드를 수정하십시오.

        dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));

 

        CString strText = _T("TODO: implement thumbnail drawing here");

        LOGFONT lf;

 

        CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));

        pDefaultGUIFont->GetLogFont(&lf);

        lf.lfHeight = 36;

 

        CFont fontDraw;

        fontDraw.CreateFontIndirect(&lf);

 

        CFont* pOldFont = dc.SelectObject(&fontDraw);

        dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);

        dc.SelectObject(pOldFont);

}

 

// 검색 처리기를 지원합니다.

void C연습문제716Doc::InitializeSearchContent()

{

        CString strSearchContent;

        // 문서의 데이터에서 검색 콘텐츠를 설정합니다.

        // 콘텐츠 부분은 ";"로 구분되어야 합니다.

 

        // : strSearchContent = _T("point;rectangle;circle;ole object;");

        SetSearchContent(strSearchContent);

}

 

void C연습문제716Doc::SetSearchContent(const CString& value)

{

        if (value.IsEmpty())

        {

               RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);

        }

        else

        {

               CMFCFilterChunkValueImpl *pChunk = NULL;

               ATLTRY(pChunk = new CMFCFilterChunkValueImpl);

               if (pChunk != NULL)

               {

                       pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);

                       SetChunkValue(pChunk);

               }

        }

}

 

#endif // SHARED_HANDLERS

 

// C연습문제716Doc 진단

 

#ifdef _DEBUG

void C연습문제716Doc::AssertValid() const

{

        CDocument::AssertValid();

}

 

void C연습문제716Doc::Dump(CDumpContext& dc) const

{

        CDocument::Dump(dc);

}

#endif //_DEBUG

 

 

// C연습문제716Doc 명령

 

 

// 연습문제 7-16View.cpp: C연습문제716View 클래스의 구현

//

 

#include "stdafx.h"

// SHARED_HANDLERS는 미리 보기, 축소판 그림 및 검색 필터 처리기를 구현하는 ATL 프로젝트에서 정의할 수 있으며

// 해당 프로젝트와 문서 코드를 공유하도록 해 줍니다.

#ifndef SHARED_HANDLERS

#include "연습문제 7-16.h"

#endif

 

#include "연습문제 7-16Doc.h"

#include "연습문제 7-16View.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// C연습문제716View

 

IMPLEMENT_DYNCREATE(C연습문제716View, CView)

 

BEGIN_MESSAGE_MAP(C연습문제716View, CView)

        // 표준 인쇄 명령입니다.

        ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)

        ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

        ON_WM_LBUTTONDOWN()

        ON_WM_MOUSEMOVE()

        ON_WM_LBUTTONUP()

END_MESSAGE_MAP()

 

// C연습문제716View 생성/소멸

 

C연습문제716View::C연습문제716View()

{

        // TODO: 여기에 생성 코드를 추가합니다.

        m_bDrawMode = FALSE;

 

}

 

C연습문제716View::~C연습문제716View()

{

}

 

BOOL C연습문제716View::PreCreateWindow(CREATESTRUCT& cs)

{

        // TODO: CREATESTRUCT cs를 수정하여 여기에서

        //  Window 클래스 또는 스타일을 수정합니다.

 

        return CView::PreCreateWindow(cs);

}

 

// C연습문제716View 그리기

 

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

{

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

        ASSERT_VALID(pDoc);

        if (!pDoc)

               return;

 

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

        POSITION pos = pDoc->m_list.GetHeadPosition();

        if (pos)

        {

               CPoint &point = pDoc->m_list.GetNext(pos);

               pDC->MoveTo(point);

        }

        while (pos)

        {

               CPoint &point = pDoc->m_list.GetNext(pos);

               pDC->LineTo(point);

        }

}

 

 

// C연습문제716View 인쇄

 

BOOL C연습문제716View::OnPreparePrinting(CPrintInfo* pInfo)

{

        // 기본적인 준비

        return DoPreparePrinting(pInfo);

}

 

void C연습문제716View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄하기 전에 추가 초기화 작업을 추가합니다.

}

 

void C연습문제716View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

        // TODO: 인쇄 후 정리 작업을 추가합니다.

}

 

 

// C연습문제716View 진단

 

#ifdef _DEBUG

void C연습문제716View::AssertValid() const

{

        CView::AssertValid();

}

 

void C연습문제716View::Dump(CDumpContext& dc) const

{

        CView::Dump(dc);

}

 

C연습문제716Doc* C연습문제716View::GetDocument() const // 디버그되지 않은 버전은 인라인으로 지정됩니다.

{

        ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C연습문제716Doc)));

        return (C연습문제716Doc*)m_pDocument;

}

#endif //_DEBUG

 

 

// C연습문제716View 메시지 처리기

 

 

void C연습문제716View::OnLButtonDown(UINT nFlags, CPoint point)

{

        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

        GetDocument()->m_list.RemoveAll();

        Invalidate();

       

        SetCapture();

        m_bDrawMode = TRUE;

        GetDocument()->m_list.AddTail(point);

        CView::OnLButtonDown(nFlags, point);

}

 

 

void C연습문제716View::OnMouseMove(UINT nFlags, CPoint point)

{

        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

        if (m_bDrawMode)

        {

               CPoint &prevPoint = GetDocument()->m_list.GetTail();

               GetDocument()->m_list.AddTail(point);

 

               CRect rect(prevPoint, point);

               rect.NormalizeRect(); //직사각형을 거꾸로 생성해도 인지하도록

               InvalidateRect(rect);

        }

        CView::OnMouseMove(nFlags, point);

}

 

 

void C연습문제716View::OnLButtonUp(UINT nFlags, CPoint point)

{

        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

        m_bDrawMode = FALSE;

        ::ReleaseCapture();

 

        CView::OnLButtonUp(nFlags, point);

}

 



개발환경:Visual Studio 2017


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

반응형