연습문제 (4)

단국대학교 멀티미디어공학전공 HCI프로그래밍 II (2007년 가을학기) 연습

□ 단원 : 마우스 & 사용자 인터페이스 & 파일입출력

□ 목표 : 메뉴 아이템 및 툴바 추가 연습 & 직렬화 및 파일 입출력

□ 주요 연습 내용 : Menu, Toolbar, ContextMenu, Serialize, FileIO

□ 준비자료 : SimpleStroke.zip (SimpleUI 와 SimplePointSerialize를 참고할 것)

[연습문제] Ex4 (Due by 11/14 수 22시까지)

-cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC++ 2005 file, 보고서를 학번_이름_Ex1.zip으로 묶어서 낼 것. 보고서 (30%)

0. 생성한 프로그램의 메인 프레임의 Title을 “HCI2_Ex4_이름_학번”으로 바꾼다. (힌트: Resource View에서 String Table의 IDR_MAINFRAME에 Caption을 “HCI2_Ex4_<이름>_<학번>”으로 하면 됨)

1. CSimpleStrokeView에 펜의 두께(1,2,3,4,5,6,7), 색깔(Red, Green, Blue, Black, Purple, Yellow)을 바꿀 수 있는 메뉴 아이템을 메뉴바에 추가한다. 그리고, 색깔을 바꿀 수 있는 툴바를 추가한다 (리소스 편집기에서 메뉴와 툴바의 IDR_MAINFRAME을 편집한다). 또한, 오른쪽 마우스를 누르면 컨텍스트 메뉴가 뜨면서 펜의 두께를 지정할 수 있게 한다 (ON_WM_CONTEXTMENU를 추가한다). (20%)

2. CStroke에 직렬화를 추가한다. (20%)

-멤버 변수: 펜두께(Thickness), 펜색깔 (Color)

-멤버 함수:

Serialize(CArchive& ar) 안에 CArchive를 이용하여 loading/storing할 때 멤버 변수 값을 입출력하게 해주는 루틴을 추가한다.

Draw(CDC* pDC) 안에 이 Stroke의 펜두께와 펜색깔을 받아서 새로운 펜을 생성하는 루틴을 추가한다. - 이 함수는 CSimpleStrokeView::OnDraw에서 내부적으로 불리는 것으로, CArchive나 CFile로 읽어들인 Stroke 데이타를 제대로 (각 Stroke별로 지정된 펜두께와 펜색깔로) 그려줄 수 있게 된다.

이 Serialize와 Draw 함수를 만든 후 그림판에 “본인의 이름”을 그리고, 메뉴 Save로 저장해보고, Open을 통해서 다시 열어본다.

3. CSimpleStrokeDoc 클래스에 텍스트파일로 된 Stroke 자료를 저장 (OnFileExport)하고 읽어들이기 (OnFileImport) 기능을 추가한다. (30%)

-OnFileImport 구현

// 한 line씩 읽어들여서,

// 먼저line에"Thickness"가 있는지 찾고, 있으면 new Stroke를 하고

// 이걸 m_StrokeList에 추가한다. (CSimpleStrokeView::OnLButtonDown를 참고)

// 만약 아니면, 새로운Stroke가 아니니까 그냥 이전에 생성한 Stroke의 m_ptArray에

// CPoint 점을 추가한다. (CSimpleStrokeView::OnMouseMove를 참고)

-OnFileExport 구현

// m_StrokeList안에 있는 모든 Stroke 별로,

// 먼저, 이 Stroke의 펜 두께와 색 “Thickness: %d Color: RGB(%d, %d, %d)"를

// 출력한다. 그리고, 이 Stroke의 모든 점들을 (%d, %d)로 출력한다.

- 텍스트파일 (첨부된 Test.txt를 사용하여 테스트해 볼 것)의 포멧

Thickness: 7 Color: RGB(255, 255, 0)

(182, 49)

(179, 53)

(176, 60)

(172, 70)

(166, 79)

(159, 90)

(153, 100)

(147, 111)

Thickness: 2 Color: RGB(0, 0, 255)

(479, 175)

(479, 185)

(479, 195)

(479, 211)

(476, 223)

(464, 244)

(452, 258)

(423, 287)

(399, 311)