윈도우 프로그래밍 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
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'MFC > 윈도우 프로그래밍' 카테고리의 다른 글
MFC 윈도우 프로그래밍 7장 연습문제(1~8) (0) | 2018.04.29 |
---|---|
MFC 윈도우 프로그래밍 6장 연습문제(9~16) (0) | 2018.04.07 |
MFC 윈도우 프로그래밍 6장 연습문제(1~8) (0) | 2018.04.06 |
MFC 윈도우 프로그래밍 5장 심화문제 (0) | 2018.04.01 |
MFC 윈도우 프로그래밍 5장 연습문제(9~16) (0) | 2018.03.30 |