윈도우 프로그래밍 Visual C++ 2010 MFC Programming(김선우, 신화서 저) 7장 연습문제입니다.
우선 1~8번 문제까지 풀었습니다.
[7-1]
// C연습문제71Doc serialization
//[파일]-[열기..] 메뉴에서 선택한 파일의 경로를 메시지 상자로 보여주도록
//FileIOTest 예제를 수정하시오.
void C연습문제71Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
CFile *pFile = ar.GetFile();
if (pFile)
{
::AfxMessageBox(pFile->GetFilePath());
}
}
}
[7-2]
// C연습문제72Doc serialization
//[파일]-[저장] 메뉴로 선택한 파일의 이름을 메시지 상자로 보여주도록
//FileIOTest 예제를 수정하시오
void C연습문제72Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
CFile *pFile = ar.GetFile();
if (pFile)
{
::AfxMessageBox(pFile->GetFileName());
}
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
}
}
[7-3]
// C연습문제73Doc serialization
//FilIOTest 예제를 다음과 같이 수정하시오.
//[파일]-[열기..] 메뉴로 파일을 선택하고, CFile::GetLength() 함수를 이용해
//얻은 파일의 크기와 CFile::SeekToEnd() 함수 및 CFile::SeekToBegin() 함수를 이용해
//계산할 파일의 크기를 메시지 상자로 보여준다
void C연습문제73Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
CFile *pFile = ar.GetFile();
if (pFile)
{
DWORD length = pFile->GetLength();
pFile->SeekToBegin();
pFile->SeekToEnd();
DWORD position = pFile->GetPosition();
CString str;
str.Format(_T("파일의 크기: %u, 계산할 파일의 크기: %u", length, position));
MessageBox(NULL, str, NULL, NULL);
}
}
}
[7-4]
class C연습문제74Doc : public CDocument
{
friend class C연습문제74View;
protected: // serialization에서만 만들어집니다.
C연습문제74Doc();
DECLARE_DYNCREATE(C연습문제74Doc)
BOOL bitmap; //비트맵인가?
DWORD length; //파일의 크기
// 특성입니다.
public:
// 작업입니다.
public:
// 재정의입니다.
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
#ifdef SHARED_HANDLERS
virtual void InitializeSearchContent();
virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
#endif // SHARED_HANDLERS
// 구현입니다.
public:
virtual ~C연습문제74Doc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 생성된 메시지 맵 함수
protected:
DECLARE_MESSAGE_MAP()
#ifdef SHARED_HANDLERS
// 검색 처리기에 대한 검색 콘텐츠를 설정하는 도우미 함수
void SetSearchContent(const CString& value);
#endif // SHARED_HANDLERS
};
// C연습문제74Doc serialization
//FileIOTest 예제를 다음과 같이 수정하시오.
//[파일]-[열기..] 메뉴로 파일을 선택하고, 해당 파일의 첫 두 바이트가
//'BM'이면 클라이언트 영역에 '비트맵 파일'이라고 표시한다.
//그리고 파일의 크기도 클라이언트 영역에 표시한다
BOOL C연습문제74Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 여기에 재초기화 코드를 추가합니다.
// SDI 문서는 이 문서를 다시 사용합니다.
bitmap = FALSE;
length = 0;
return TRUE;
}
void C연습문제74Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
char BM[3];
CFile *pFile = ar.GetFile();
if (pFile != NULL)
{
length = pFile->GetLength();
bitmap = FALSE;
if (pFile->Read(BM, 2) == 2)
{
//첫 두글자가 BM
if ((char)BM[0] == 'B' && (char)BM[1] == 'M')
bitmap = TRUE;
}
}
}
}
void C연습문제74View::OnDraw(CDC* pDC)
{
C연습문제74Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
CString str;
if (pDoc->bitmap)
{
str.Format(_T("비트맵 파일\n파일 크기:%u"), pDoc->length);
}
else
{
str = _T("비트맵 파일이 선택되지 않았다");
}
CRect rect;
GetClientRect(&rect);
pDC->DrawText(str, rect, DT_CENTER || DT_VCENTER);
}
[7-5]
// C연습문제75Doc serialization
//FileIOTest 예제를 다음과 같이 수정하시오
//[파일]-[열기..] 메뉴로 텍스트 파일을 선택하고, 해당 파일의 문자열에
//CR('\r')과 LF('\n')이 함께 있으면 "윈도우 텍스트 파일입니다",
//CR이 없이 LF만 존재하는 문자열이 있으면 "윈도우 텍스트 파일이 아닙니다!"라고
//메시지 상자를 띄운다
void C연습문제75Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
CFile *pFile = ar.GetFile();
if (pFile)
{
char ch;
BOOL read = FALSE;
BOOL crExist = FALSE;
while (1)
{
read = pFile->Read(&ch, 1);
if (read == FALSE)
break;
if (ch == '\r')
crExist = TRUE;
if (ch == '\n')
{
if (!crExist)
{
::MessageBox(NULL, _T("윈도우 텍스트 파일이 아닙니다!"), NULL, NULL);
return;
}
crExist = FALSE;
}
}
::MessageBox(NULL, _T("윈도우 텍스트 파일입니다!"), NULL, NULL);
}
}
}
[7-6]
// C연습문제76Doc serialization
//FileIOTest 예제를 다음과 같이 수정하시오.
//[파일]-[열기...] 메뉴로 텍스트 파일을 선택하고, CFile 클래스를 사용해
//파일 내 문자열을 줄 단위로 읽는다. 소문자를 모두 대문자로 변환한 뒤
//CStdioFile 클래스를 사용해 다른 파일로 저장한다.
void C연습문제76Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
CFile *pFile = ar.GetFile();
CStdioFile sFile;
//텍스트 파일에 CStdioFile을 이용하여 저장
//생성 | 작성 | 텍스트
BOOL save = sFile.Open(pFile->GetFilePath() + _T(".txt"), CFile::modeCreate | CFile::modeWrite | CFile::typeText);
if (save)
{
CString str;
char ch;
BOOL read = FALSE;
while (1)
{
read = pFile->Read(&ch, 1);
if (!read)
{
str.MakeUpper(); //대문자
sFile.WriteString(str + "\n");
return;
}
if (ch == '\n')
{
str.MakeUpper();
sFile.WriteString(str + "\n");
str.Empty();
continue;
}
str += ch;
}
}
}
}
[7-7]
class C연습문제77Doc : public CDocument
{
friend class C연습문제77View;
protected: // serialization에서만 만들어집니다.
C연습문제77Doc();
DECLARE_DYNCREATE(C연습문제77Doc)
// 특성입니다.
public:
CStringList list;
// 작업입니다.
public:
// 재정의입니다.
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
#ifdef SHARED_HANDLERS
virtual void InitializeSearchContent();
virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
#endif // SHARED_HANDLERS
// 구현입니다.
public:
virtual ~C연습문제77Doc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 생성된 메시지 맵 함수
protected:
DECLARE_MESSAGE_MAP()
#ifdef SHARED_HANDLERS
// 검색 처리기에 대한 검색 콘텐츠를 설정하는 도우미 함수
void SetSearchContent(const CString& value);
#endif // SHARED_HANDLERS
};
//FileIOTest 예제를 다음과 같이 수정하시오.
//[파일]-[열기..] 메뉴로 선택한 파일이 포함된 폴더를 CFileFind
//클래스를 사용해 검새하고 그 중 비트맵 파일만 선택해
//클라이언트 영역에 목록을 출력한다.
BOOL C연습문제77Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 여기에 재초기화 코드를 추가합니다.
// SDI 문서는 이 문서를 다시 사용합니다.
list.RemoveAll();
return TRUE;
}
// C연습문제77Doc serialization
void C연습문제77Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
CFile *pFile = ar.GetFile();
if (pFile)
{
CString path = pFile->GetFilePath();
path.Replace(pFile->GetFileName(), _T("*.bmp"));
CFileFind finder;
BOOL find = finder.FindFile(path);
while (find)
{
find = finder.FindNextFileW();
if (!finder.IsDirectory())
list.AddTail(finder.GetFileName());
}
}
}
}
void C연습문제77View::OnDraw(CDC* pDC)
{
C연습문제77Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
CString bmpStr;
CStringList &list = pDoc->list;
POSITION pos = list.GetHeadPosition();
while (pos)
{
CString str = list.GetNext(pos);
bmpStr += str + _T("\n");
}
CRect rect;
GetClientRect(&rect);
pDC->DrawText(bmpStr, rect, DT_CENTER | DT_VCENTER);
}
[7-8]
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'MFC > 윈도우 프로그래밍' 카테고리의 다른 글
MFC 윈도우 프로그래밍 7장 연습문제(9~16) (0) | 2018.04.30 |
---|---|
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 |