Microsoft PowerPoint _파일입출력.ppt

Similar documents
슬라이드 1

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

윈도우 프로그래밍의 개념

Microsoft PowerPoint - hci2-lecture7.ppt

<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

그래픽 프로그래밍

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - hci2-lecture10.ppt

歯Lecture2.PDF

Microsoft PowerPoint _대화상자.ppt

chap 5: Trees

쉽게 풀어쓴 C 프로그래밍

Visual C++의 개요

5장 MFC기반 다지기

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

K&R2 Reference Manual 번역본

untitled

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - CPP_chap3

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

PowerPoint 프레젠테이션

Chapter #01 Subject

Lab 3. 실습문제 (Single linked list)_해답.hwp

슬라이드 1

UI TASK & KEY EVENT

Chapter 4. LISTS

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Chapter 4. LISTS

설계란 무엇인가?

Programming hwp

Microsoft PowerPoint - chap06-2pointer.ppt

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

윈도우시스템프로그래밍

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

슬라이드 1

API 매뉴얼

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

11장 포인터

Microsoft Word - hci07-final-answer.doc

Microsoft Word - hci08-final-answer.doc

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

PowerPoint 프레젠테이션

Microsoft PowerPoint - C++ 5 .pptx

11장 포인터

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

슬라이드 1

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Programming hwp

윈도우시스템프로그래밍

Chapter 1. MFC 시작하기

Microsoft PowerPoint - chap10-함수의활용.pptx

쉽게 풀어쓴 C 프로그래밍

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

OCW_C언어 기초

03_queue

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

4S 1차년도 평가 발표자료

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

윤성우의 열혈 TCP/IP 소켓 프로그래밍

슬라이드 1

Microsoft PowerPoint - 04-UDP Programming.ppt

PowerPoint 프레젠테이션

PowerPoint Presentation

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

설계란 무엇인가?

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

BMP 파일 처리

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - ch07 - 포인터 pm0415

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

PowerPoint Presentation

Microsoft PowerPoint - [2009] 02.pptx

PowerPoint Template

JVM 메모리구조

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

윈도우시스템프로그래밍

Microsoft PowerPoint - Chap12-OOP.ppt

Microsoft PowerPoint - Java7.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

Microsoft PowerPoint - additional01.ppt [호환 모드]

adfasdfasfdasfasfadf

Microsoft PowerPoint - 02-Class Review.pptx

Microsoft PowerPoint - Chapter 6.ppt

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

Microsoft PowerPoint - hci2-lecture3.ppt

Transcription:

8 장. 파일입출력 파일입출력연속화 (serialization) 아카이브 (archive) 객체 Paint4.dsw Paint5.dsw 레지스트리 (registry) 오목게임 순천향대학교정보기술공학부이상정 1 파일입출력 순천향대학교정보기술공학부이상정 2

파일입출력소개 파일입출력 프로그램에서만든정보를하드디스크의파일로저장하는방법 MFC 에서사용하는파일입출력방법인연속화 (serialization) 를학습 CFile 클래스 MFC에서파일입출력을위해사용하는클래스 파일핸들 (file handle) 을이용한입출력방법을제공 파일핸들을사용하여파일을입출력하는절차 열기 (Open) 입출력 (Read/Write) 닫기 (Close) 순천향대학교정보기술공학부이상정 3 파일쓰기 파일로데이터를출력시 CFile::Write() 함수를사용 File.dsw 예 SDI 옵션을주어생성 파일저장을위해 File/Save 메뉴항목을사용 뷰클래스에서 ID_FILE_SAVE 에대한 COMMAND 메시지핸들러 void CFileView::OnFileSave() CFile MyFile; MyFile.Open("Korea.txt", CFile::modeCreate CFile::modeWrite); MyFile.Write("Beautiful Korea",15); MyFile.Close(); 순천향대학교정보기술공학부이상정 4

Open() 함수 virtual BOOL Open( LPCTSTR lpszfilename, UINT nopenflags, CFileException* perror = NULL ); 첫번째인수 : 열고자하는파일이름 두번째인수 : 파일의액세스모드를설정 moderead : 읽기전용 modewrite : 쓰기전용 modereadwrite : 읽기, 쓰기모드 modecreate : 파일이없을경우파일을생성 세번째인수 : 예외를처리하는예외오브젝트의포인터 파일핸들은 CFile::m_hFile 멤버변수에저장 순천향대학교정보기술공학부이상정 5 파일읽기 File/Open 메뉴항목의핸들러에서파일을읽고, 파일의내용을화면에출력 ID_FILE_OPEN에대한메시지핸들러 void CFileView::OnFileOpen() char Buf[20]; CFile MyFile("Korea.txt",CFile::modeRead); MyFile.Read(Buf,20); CClientDC DC(this); DC.TextOut(0,0,Buf,15); 순천향대학교정보기술공학부이상정 6

File.dsw 실행예 순천향대학교정보기술공학부이상정 7 임의접근 (random access) 순차파일 (sequential file) 시작부터끝까지순차적으로접근하는파일 문자열텍스트파일랜덤파일 (random access file) 파일의임의의위치에서접근할수있는파일 데이터베이스파일 임의접근함수 virtual LONG Seek(LONG loff, UINT nform); FP(file position) 을이동시키는함수 nform 인수 CFile::begin => 파일의처음위치에서부터 CFile::current => 현재 FP 에서부터 CFile::end => 파일의끝에서부터 virtual DWORD GetPosition() const; FP 를조사하는함수 순천향대학교정보기술공학부이상정 8

연속화 (serialization) 순천향대학교정보기술공학부이상정 9 Serialize() 함수 연속화는저장 (Save) 과복구 (Load) 의두과정을합친표현 데이터를저장하고불러오는연속화작업은복잡하나 MFC 를사용하면프레임워크에연속화에필요한모든루틴을포함 Serialize() 함수 파일입출력을수행하는핵심함수 프레임워크는입출력이필요한경우입출력에필요한모든환경을만든후 Serialize() 함수를호출 Serialize() 함수에원하는입출력동작을기술하면나머지는프레임워크가수행 void CTestDoc::Serialize(CArchive& ar) if (ar.isstoring()) // TODO: add storing code here else // TODO: add loading code here 순천향대학교정보기술공학부이상정 10

Key2.dsw 예 (1) 연속화과정을실습 Key.dsw 를수정하여키보드로입력한문자열을디스크에저장 1. Key2.dsw 를 SDI 옵션을선택하여생성 AppWizard의 step 4에서 Advanced 버튼을누른다. 나타난대화상자의 File Extension 란에 key를입력하고나머지는디폴트를선택 순천향대학교정보기술공학부이상정 11 Key2.dsw 예 (2) 2. Key2Doc.h 에문자열을저장할변수 (m_munja) 선언 class CKey2Doc : public CDocument // Attributes public: CString m_munja; 3. WM_CHAR 메시지핸들러에서키보드입력을받는다. void CKey2View::OnChar(UINT nchar, UINT nrepcnt, UINT nflags) CKey2Doc* pdoc=getdocument(); pdoc->m_munja+=nchar; pdoc->setmodifiedflag(true); Invalidate(); 순천향대학교정보기술공학부이상정 12

저장플래그 저장확인기능 ( 저장플래그 ) 사용자가편집후저장하지않고프로그램을종료시저장이안되었음을경고하는기능 저장플래그를관리하는기능은사용자의몫 저장플래그를세트시키는함수 SetModifiedFlag(TRUE) 변경되었을경우인수 : TRUE 변경되지않았을경우인수 : FALSE Key2.dsw 에서저장플래그를세트시키는시점은키보드로부터문자가입력된시점 순천향대학교정보기술공학부이상정 13 Key2.dsw 예 (3) 4. OnDraw 함수에서입력한문자열을화면에출력 void CKey2View::OnDraw(CDC* pdc) CKey2Doc* pdoc = GetDocument(); ASSERT_VALID(pDoc); int length; length=pdoc->m_munja.getlength(); pdc->textout(0,0,pdoc->m_munja, length); 순천향대학교정보기술공학부이상정 14

Key2.dsw 예 (4) 5. 연속화기능을첨가 사용자가입력한데이터를삭제 SDI인경우새로운파일을읽기전에사용자가편집한데이터를삭제 CDocument::DeleteContents() 함수 이함수는아래 3가지경우에프레임워크가직접호출 File/New 명령으로문서의내용을지울때 File/Open 명령으로새로운데이터를읽을때 도큐멘트클래스가파괴되기직전 이함수는가상함수로정의되어있으므로도큐멘트의내용을비워야할때프렘임워크가호출해주도록사용자가재정의 DeleteContents() 함수를재정의하는두가지방법 클래스위저드에서 DeleteContents() 를선택하는방법 위저드바의액션메뉴에서 Add Virtual Function을선택후대화상자에서 DeleteContents() 를선택 순천향대학교정보기술공학부이상정 15 Key2.dsw 예 (5) 순천향대학교정보기술공학부이상정 16

Key2.dsw 예 (6) void CKey2Doc::DeleteContents() m_munja=""; CDocument::DeleteContents(); 6. 실제로파일을입출력하는코드생성 Serialize() 함수에서작성 void CKey2Doc::Serialize(CArchive& ar) if (ar.isstoring()) ar << m_munja; else ar >> m_munja; 순천향대학교정보기술공학부이상정 17 Key2.dsw 예 (7) 아카이브객체 (ar) 는디스크파일을대표하는객체이며이객체로데이터를보내고읽으면된다. 저장할것인지읽어올것인지를알려면 IsStoring 함수를호출 저장을위해호출시 TRUE를반환 읽기를위해호출시 FALSE 를반환 ar 객체로입출력 ( 연속화 ) 이가능한데이터형 정수 : WORD, DWORD, BYTE, LONG 실수 : double, float 클래스 : CSize, CRect, CPoint, CtimeSpan, CString 포인터 : CObject* 순천향대학교정보기술공학부이상정 18

Key2.dsw 예 (8) 7. 이예제를실행하면다음의기능이추가 File/New 항목을선택시현재편집된문자열을삭제 File/Save 항목을선택시입력한문자열을파일로저장 ( 확장자 :Key) File/Open 항목을선택시디스크에저장한파일을읽어온다 최근에읽은파일의리스트가 File 메뉴끝에추가 새파일, 파일열기, 파일저장에해당하는툴바의기능도정의 순천향대학교정보기술공학부이상정 19 아카이브 (archive) 객체 순천향대학교정보기술공학부이상정 20

아카이브 아카이브 (archive) 는내부에입출력을위한버퍼를가지며, 파일로의입출력을처리 CArchive 클래스는입출력을위한삽입 (<<), 추출 (>>) 연산자를가지며, 아카이브객체가만들어지면연산자를이용하여아카이브로기본데이터형을입출력 인수로전달됨 void Serialize(CArchive &ar) ar << 데이터 ; CArchive 객체 CFile 객체 디스크 순천향대학교정보기술공학부이상정 21 연속화과정 사용자가 File/Open 함수호출 OnFileOpen() 함수호출 대화상자를열어파일이름입력받음 OnOpenDocument() 입력받은파일이름으로 CFile 객체생성 DeleteContents() 기존의데이터삭제 아카이브객체생성 입출력준비 Serialize() 함수 입출력 OnDraw() 순천향대학교정보기술공학부이상정 22 화면에읽어들인데이터를표시 Page. 380

Paint4.dsw 순천향대학교정보기술공학부이상정 23 CObList Paint4.dsw 소개 Paint 프로젝트에파일저장기능을추가 모든선을리스트에저장하기위해 MFC 의연결리스트인 CObList 를사용 CObList CObList 클래스에서연결리스트를제공 CObList 는이중연결리스트 CObList 클래스의 CNode 구조체 struct CNode CNode* pnext; CNode* pprev; CObject* data; 순천향대학교정보기술공학부이상정 24

CObList 주요멤버함수 CObList(int nblocksize = 10); 한번에 10개의노드의양만큼메모리를할당 POSITION AddHead(CObject* newelement); 리스트앞쪽에노드를추가 POSITION AddTail(CObject* newelement); 리스트뒤쪽에노드를추가 POSITION GetHeadPosition() const; 처음위치로이동 CObject* GetNext(POSITION& rposition) const; rposition이가리키는데이터를반환하고 rposition을다음노드로이동 CObject* GetPrev(POSITION& rposition) const; rposition이가리키는데이터를반환하고 rposition을앞요소로이동 int GetCount() const; 리스트의노드수를반환 BOOL IsEmpty() const; 빈리스트인지를조사 CObject* RemoveHead(); 헤더가가리키는노드들을삭제 노드가가리키는데이터는삭제하지않고데이터의포인터만반환 순천향대학교정보기술공학부이상정 25 Paint4.dsw 예 (1) 파일입출력과화면복구가가능한 Paint 프로그램을만들기 직선만그리도록예제를단순화 1. SDI 옵션을사용하고, step 4에서 Advanced 버튼을눌러확장자를 pnt로지정 순천향대학교정보기술공학부이상정 26

Paint4.dsw 예 (2) 그리기에필요한변수를뷰의해더파일에추가 class CPaint4View : public CView // Attributes public: CPaint4Doc* GetDocument(); CPoint m_nowp, m_oldp; BOOL m_bpaint; m_bpaint의값을초기화 CPaint4View::CPaint4View() m_bpaint=false; 그림을그리는마우스핸들러를작성 void CPaint4View::OnLButtonDown(UINT nflags, CPoint point) m_bpaint=true; m_nowp=point; m_oldp=point; 순천향대학교정보기술공학부이상정 27 Paint4.dsw 예 (3) void CPaint4View::OnLButtonUp (UINT nflags, CPoint point) if (m_bpaint==false) return; m_bpaint=false; CClientDC dc(this); dc.moveto(m_nowp); dc.lineto(point); void CPaint4View::OnMouseMove (UINT nflags, CPoint point) CClientDC dc(this); if (!m_bpaint) return; dc.setrop2(r2_not); dc.moveto(m_nowp); dc.lineto(m_oldp); dc.moveto(m_nowp); dc.lineto(point); m_oldp=point; 순천향대학교정보기술공학부이상정 28

Paint4.dsw 예 (4) 2. 화면복구기능첨가 모든선에대한정보를저장해두고, OnDraw() 함수에서일괄적으로그린다. 선은수를미리알수없으므로연결리스트 (CObList) 객체를사용 100 100 200 200 100 200 200 100 헤더 테일 m_arline 100 120 200 120 순천향대학교정보기술공학부이상정 29 Paint4.dsw 예 (5) 도큐멘트클래스의헤더파일에선의정보를저장할변수를선언 class CPaint4Doc : public CDocument // Attributes public: CObList m_arline; 리스트에선을추가하는시점은마우스버튼이놓아질때이다. => OnLButtonUp 를수정 순천향대학교정보기술공학부이상정 30 void CPaint4View::OnLButtonUp(UINT nflags, CPoint point) CRect *pline; if (m_bpaint==false) return; m_bpaint=false; CClientDC dc(this); dc.moveto(m_nowp); dc.lineto(point); // 방금그린라인은연결리스트끝에첨가 pline=new CRect(m_nowP, point); CPaint4Doc* pdoc = GetDocument(); pdoc->m_arline.addtail((cobject *)pline); // 저장플래그를변경 pdoc->setmodifiedflag(true);

Paint4.dsw 예 (6) OnDraw() 함수에서는그림이지워질때마다다시그리도록한다. void CPaint4View::OnDraw(CDC* pdc) CPaint4Doc* pdoc = GetDocument(); ASSERT_VALID(pDoc); CRect *R; POSITION p=pdoc->m_arline.getheadpo sition(); while (p!=null) R=(CRect *)pdoc->m_arline.getnext(p) ; pdc->moveto(r->left, R->top); pdc->lineto(r->right, R->bottom); 3. 새문서작성시, 현재문서를닫을때, 프로그램을종료할때 DeleteContents() 가호출되므로클래스위자드를사용하여, 연결리스트에저장된모든그림을삭제하는코드를작성 void CPaint4Doc::DeleteContents() while(!m_arline.isempty()) delete (CRect *)m_arline.removeh ead(); CDocument::DeleteContents(); 순천향대학교정보기술공학부이상정 31 Paint4.dsw 예 (7) 5. 그림을디스크파일로저장또는읽어드리는코드작성 void CPaint4Doc::Serialize(CArchive& ar) CRect *R,Rect; if (ar.isstoring()) POSITION p= m_arline.getheadposition(); ar.writecount(m_arline.getcount()); while (p!=null) R=(CRect *)m_arline.getnext(p); Rect=*R; ar << Rect; else DWORD nnewcount= ar.readcount(); while (nnewcount--) ar >> Rect; R=new CRect(Rect); m_arline.addtail((cobject *)R); 순천향대학교정보기술공학부이상정 32

순천향대학교정보기술공학부이상정 33 Paint5.dsw 순천향대학교정보기술공학부이상정 34

Paint5.dsw (1) Paint4는선의정보를갖는 CRect 클래스에서연속화를하지않고도큐멘트에서연속화를수행 도큐먼트에서여러객체가연속화되어야하는경우복잡 MFC에서는각객체가연속화할수있도록해준후도큐멘트에서는연속화의대상이되는객체의 Serialize() 함수를호출하여연속화를위임하는방법을사용 1. Paint5.dsw 를 SDI 옵션과 step4 에서 Advanced 옵션에서확장자 pnt 를지정 뷰의헤더화일에서변수선언 class CPaint4View : public CView // Attributes public: CPaint4Doc* GetDocument(); CPoint m_nowp,m_oldp; BOOL m_bpaint; m_bpaint 의값을초기화 CPaint4View::CPaint4View() m_bpaint=false; 순천향대학교정보기술공학부이상정 35 Paint5.dsw (2) OnLbuttonDown(), OnMouseMove() 핸들러를작성 void CPaint4View::OnLButtonDown(UINT nflags, CPoint point) m_bpaint=true; m_nowp=point; m_oldp=point; void CPaint4View::OnMouseMove (UINT nflags, CPoint point) CClientDC dc(this); if (!m_bpaint) return; dc.setrop2(r2_not); dc.moveto(m_nowp); dc.lineto(m_oldp); dc.moveto(m_nowp); dc.lineto(point); m_oldp=point; 순천향대학교정보기술공학부이상정 36

Paint5.dsw (3) 2. 화면에그려진선에대한정보를기억 CLine 클래스를별도로만들어선에대한정보를보관 새로운텍스트파일을만들고 CLine 클래스를정의하고, 파일명 line.h 로저장 클래스위저드는메시지처리를위한도구이므로새로운클래스를만들면 CCmdTarget을상속받는클래스를생성 CLine 클래스는 CObject 클래스를상속받아야하므로직접작성함 순천향대학교정보기술공학부이상정 37 #ifndef _CLINECLASS #define _CLINECLASS class CLine:public CObject protected: DECLARE_SERIAL(CLine) // CLine 클래스의연속화를지원 public: CLine(); CLine(CRect RR); CRect m_rect; // 선의좌표를저장 virtual void DrawLine(CDC *pdc); virtual void Serialize(CArchive &ar); virtual ~CLine(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif ; #endif Paint5.dsw (4) Line.cpp 파일로직접작성 #include "stdafx.h" #include "line.h" IMPLEMENT_SERIAL(CLine,CObject,1) //CLine 클래스의연속화를지원 CLine::CLine()// 디폴트생성자 CLine::CLine(CRectRR)// 인수를갖는생성자 m_rect=rr; CLine::~CLine() void CLine:: DrawLine(CDC *pdc) pdc->moveto(m_rect.left,m_rect.top); pdc->lineto(m_rect.right,m_rect.bottom); 순천향대학교정보기술공학부이상정 38 void CLine::Serialize(CArchive &ar) //CLine 객체연속화 CObject::Serialize(ar); if (ar.isstoring()) ar << m_rect; else ar >> m_rect; #ifdef _DEBUG void CLine::AssertValid() const CObject::AssertValid(); void CLine::Dump(CDumpContext& dc) const CObject::Dump(dc); #endif

Paint5.dsw (5) CLine 클래스를프로젝트에포함 Project/Add To Project/Files 메뉴항목사용 line.h,line.cpp 파일을열어놓고팝업메뉴에서 Insert File into Project 선택 워크스페이스파일뷰에서오른쪽마우스버튼누르고 Insert File into Project 선택 순천향대학교정보기술공학부이상정 39 Paint5.dsw (6) 3. 도큐멘트클래스에연결리스트객체를선언 class CPaint4Doc : public CDocument // Attributes public: CObList m_arline; // 그려지는선을저장 OnLButtonUp() 에선이그려질때마다선의정보를연결리스트에추가 순천향대학교정보기술공학부이상정 40 void CPaint4View::OnLButtonUp(UINT nflags, CPoint point) if (m_bpaint==false) return; m_bpaint=false; CClientDC dc(this); dc.moveto(m_nowp); dc.lineto(point); // 방금그린라인은연결리스트끝에첨가 CPaint4Doc* pdoc = GetDocument(); Cline *pline=new CLine(Crect(m_nowP,point)); pdoc->m_arline.addtail((cobject *)pline); // 저장플래그를변경 pdoc->setmodifiedflag(true); CView::OnLButtonUp(nFlags, point);

Paint5.dsw (7) 연결리스트에저장한선의정보를 OnDraw() 에서복구 void CPaint5View::OnDraw(CDC* pdc) CPaint5Doc* pdoc = GetDocument(); ASSERT_VALID(pDoc); 뷰의헤더파일에 line.h 를포함 CLine *pline; POSITION p = pdoc->m_arline.getheadposition(); while (p!=null) pline = (CLine *) pdoc->m_arline.getnext(p); pline->drawline(pdc); #include "line.h" 순천향대학교정보기술공학부이상정 41 Paint5.dsw (8) 4. 연속화 DeleteContents() 함수작성 void CPaint5Doc::DeleteContents() while (!m_arline.isempty()) delete m_arline.removehead(); CDocument::DeleteContents(); 도큐멘트의 Serialize() 함수작성 void CPaint5Doc::Serialize(CArchive& ar) if (ar.isstoring()) // TODO: add storing code here else // TODO: add loading code here m_arline.serialize(ar); 순천향대학교정보기술공학부이상정 42

레지스트리 (registry) 순천향대학교정보기술공학부이상정 43 레지스트리소개 프로그램이사용하는정보를다음에사용하기위해디스크에저장 프로그램의위치 옵션설정상태 INI 파일에서도지원되지만레지스트리가더빠르고, 적은공간을사용 레지스트리는운영체제가지원하는데이터베이스 윈도우즈에서실행되는모든프로그램의설정상태, 하드웨어구성상태등의정보저장 레지스트리는루트키, 노드키, 서브키, 섹션, 값의트리구조로구성 순천향대학교정보기술공학부이상정 44

regedit.exe regedit.exe 를실행 HKEY_CURRENT_USER 디렉토리의 Software 아래에사용자가만든프로그램설정상태를저장 순천향대학교정보기술공학부이상정 45 Regi.dsw 예 (1) 레지스트리를사용하여윈도우의위치를기억시키는예제 1. SDI 옵션으로 Regi.dsw 프로젝트생성 2. Regi.cpp 파일의 InitInstance() 함수 SetRegistryKey() 함수의인수로정보를기억할디폴트레지스트리키 (_T("Local AppWizard-Generated Applications") 를변경 이함수를호출하지않고정보를출력하면 INI 파일로정보가출력 BOOL CRegiApp::InitInstance()... SetRegistryKey("Registry Test Program"); LoadStdProfileSettings();... 순천향대학교정보기술공학부이상정 46

Regi.dsw 예 (2) 3. 프로그램이종료할때정보를레지스트리에출력 CMainFrame 에서 WM_DESTROY 메시지핸들러에서정보를출력 레지스트리에정보를출력하는함수 WriteProfileInt(LPCTSTR lpszsection, LPCTSTR lpszentry, int nvalue) WriteProfileString(LPCTSTR lpszsection, LPCTSTR lpszentry, LPCTSTR lpszvalue) 첫번째인수 : 섹션 ( 정보를보관하는단위 ) 두번째인수 : 섹션내의항목 세번째인수 : 출력될정보 순천향대학교정보기술공학부이상정 47 Regi.dsw 예 (3) void CMainFrame::OnDestroy() CFrameWnd::OnDestroy(); CRect R; GetWindowRect(R); AfxGetApp()->WriteProfileInt("Pos","Left",R.left); AfxGetApp()->WriteProfileInt("Pos","Top",R.top); AfxGetApp()->WriteProfileInt("Pos","Right",R.right); AfxGetApp()->WriteProfileInt("Pos","Bottom",R.bottom); 순천향대학교정보기술공학부이상정 48

Regi.dsw 예 (4) 4. 프로그램이시작될때레지스트리에저장된정보 ( 윈도우위치 ) 를읽기 CMaineFrame 클래스의 OnCreate() 함수에작성 레지스트리의정보를읽는함수 GetProfileInt(LPCTSTR lpszsection, LPCTSTR lpszentry, int ndefault) GetProfileString(LPCTSTR lpszsection, LPCTSTR lpszentry, LPCTSTR lpszdefault = NULL) 첫번째인수 : 섹션 ( 정보를보관하는단위 ) 두번째인수 : 섹션내의항목 세번째인수 : 섹션이나항목이없을경우적용되는디폴트값 순천향대학교정보기술공학부이상정 49 Regi.dsw 예 (5) int CMainFrame::OnCreate(LPCREATESTRUCT lpcreatestruct)...... CRect R; R.left=AfxGetApp()->GetProfileInt("Pos","Left",100); R.top=AfxGetApp()->GetProfileInt("Pos","Top",100); R.right=AfxGetApp()->GetProfileInt("Pos","Right",500); R.bottom=AfxGetApp()->GetProfileInt("Pos","Bottom",400); MoveWindow(R); return 0; 순천향대학교정보기술공학부이상정 50

오목게임 순천향대학교정보기술공학부이상정 51 오목게임소개 오목게임 돌만놓고, 판정은않함 게임중간의결과를파일에저장 순천향대학교정보기술공학부이상정 52

Omok.dsw 예 (1) 1. Omok.dsw 프로젝트 step1 : SDI 옵션 step2,3 : 디폴트옵션 step 4 3D controls 옵션만설정하고나머지는해제 순천향대학교정보기술공학부이상정 53 Omok.dsw 예 (2) Advanced 버튼을눌러확장자를 omk 로지정 Window Style 에서 Thick frame( 크기조절불필요 ), Maximize box( 최대화버튼불필요 ) 옵션을해제 step5,6 은디폴트옵션선택 순천향대학교정보기술공학부이상정 54

Omok.dsw 예 (3) 2. 고정된크기를바둑판의크기에맞춘다. 메인프레임의 ActivateFrame() 함수를재정의 클래스위저드에서 CMainFrame 의 ActiveFrame () 함수를선택하여추가 void CMainFrame::ActivateFrame(int ncmdshow) MoveWindow(10,10,400,430); CFrameWnd::ActivateFrame(nCmdShow); 순천향대학교정보기술공학부이상정 55 Omok.dsw 예 (4) 3. 게임진행에필요한메뉴리소스파일 (New, Open, Save, Exit) 만남기고나머지는삭제 4. 도큐멘트의헤더파일에필요한변수를선언 enum SITE NONE, BLACK, WHITE ; class COmokDoc : public CDocument // Attributes public: SITE m_board[19][19]; // 바둑판에돌이놓인상태를보관한다. 순천향대학교정보기술공학부이상정 56

Omok.dsw 예 (5) 5. 뷰에필요한변수와함수원형을선언 class COmokView : public CView // Operations public: BOOL m_whturn; // 다음둘차례 // (True : 흰돌, FALSE : 검정돌 ) // 지정한좌표에지정한돌을그린다. void DrawSite(CDC *pdc,int x, int y,site dol); 6. DrawSite() 함수작성 void COmokView::DrawSite(CDC *pdc,int x, int y,site dol) if (dol==black) // 검정색돌은검정색브러시 pdc->selectstockobject(black_brush); else // 흰색돌은흰색브러시 pdc->selectstockobject(white_brush); if (dol!=none) // 돌이있으면그린다. pdc->ellipse(x*20+2,y*20+2,x*20+18, y*20+18); 순천향대학교정보기술공학부이상정 57 Omok.dsw 예 (6) 6. 뷰의 OnInitialUpdate() 함수에서게임시작시검정돌로시작하도록함 void COmokView::OnInitialUpdate() CView::OnInitialUpdate(); m_whturn=false; // 검정돌부터시작 7. 바둑판위에서왼쪽마우스를누를때그위치에바둑돌을놓는다. 바둑판의격자는 20픽셀 *20픽셀의크기 순천향대학교정보기술공학부이상정 58 void COmokView::OnLButtonDown(UINT nflags, CPoint point) int ax,ay; COmokDoc* pdoc = GetDocument(); // 화면좌표를배열좌표로변환한다. ax=point.x/20; ay=point.y/20; // 바둑판안이어야하며돌이놓이지않은 // 자리여야한다. if ((ax<0) (ax>=19) (ay<0) (ay>=19)) return; if (pdoc->m_board[ax][ay]!=none) return; // 누가둘차례인가에따라배열에돌을 // 놓음 pdoc->m_board[ax][ay] = (m_whturn? WHITE:BLACK);

Omok.dsw 예 (7) CClientDC dc(this); // 돌을그린다. DrawSite(&dc,ax,ay, pdoc->m_board[ax][ay]); // 차례를바꿈 m_whturn=!m_whturn; pdoc->setmodifiedflag(); CView::OnLButtonDown(nFlags, point); 8. OnDraw 함수에서바둑판과놓아졌던바둑돌을그린다. void COmokView::OnDraw(CDC* pdc) COmokDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); int x,y; for (x=0;x<19;x++) // 가로줄그음 pdc->moveto(10,10+x*20); pdc->lineto(370,10+x*20); for (x=0;x<19;x++) // 세로줄그음 pdc->moveto(10+x*20,10); pdc->lineto(10+x*20,370); for (x=0;x<19;x++) // 바둑돌그림 for (y=0;y<19;y++) DrawSite(pDC,x,y, pdoc->m_board[x][y]); 순천향대학교정보기술공학부이상정 59 Omok.dsw 예 (8) 9. 게임중간에게임판의상태를파일에저장 연속화를가능하도록하기위해 DeleteContents() 함수를작성 void COmokDoc::DeleteContents() int x,y; for (x=0;x<19;x++) // 배열을지운다. for (y=0;y<19;y++) m_board[x][y]=none; CDocument::DeleteContents(); Serialize() 함수작성 순천향대학교정보기술공학부이상정 60 void COmokDoc::Serialize(CArchive& ar) int x,y; LONG L; if (ar.isstoring()) for (x=0;x<19;x++) for (y=0;y<19;y++) ar << (LONG)m_Board[x][y]; else for (x=0;x<19;x++) for (y=0;y<19;y++) ar >> L; m_board[x][y]=(site)l;

과제 다음중하나를선택하여분석하고실행 p.415 의퍼즐예제소스분석 p.420 테트리스예제소스분석 테트리스예제선택시가산점부여 순천향대학교정보기술공학부이상정 61