연습문제 (5)

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

□ 단원 : 파일 입출력 & 표준 컨트롤 & 대화상자 & 다양한 뷰 클래스

□ 목표 : MFC 프로그램 내에 사용자 클래스를 추가하는 방법 연습 & 대화상자 디자인

□ 주요 연습 내용 : CFile, FormView, CButton, CEdit, CStatic, CListCtrl, CDialog

□ 준비자료 : PersonData.zip - 데이터파일 (사우스파크.dat, 사우스파크.txt) & 이미지 (스탠 마쉬.bmp, 에릭 카트맨.bmp, 웬디 데스타버거.bmp, 카일 브로프로프스키.bmp, 케니 맥코믹.bmp)

[연습문제] (Due by 12/5 수 22시까지)

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

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

1. SimplePersonRecord라는 도큐먼트/뷰 구조, Single Document, FormView로 프로젝트를 생성한다 (즉, 마지막 단계에서 뷰클래스 SimplePersonRecordView의 베이스클래스를 CFormView로 선택한다.)

2. Resource View의 Dialog에서 출력화면을 위한 (SimplePersonRecordView 클래스를 위한) FormView Dialog (IDD_SIMPLEPERSONRECORD_FORM)를 만든다.

-Toolbox에서 (리스트 출력을 위한) List Control, (이름, 나이, 외모, 성격 입력을 위한) Edit Control, (편집컨트롤 그룹) Group Box, (등록, 수정, 삭제, 열람을 위한 푸쉬버튼) Button Control, (비트맵 그림을 보여주는) Picture Control

-List Control의 속성 (Properties) 창에서 View를 Report로 바꾼다.

3. CObject 의 파생클래스로 CPerson 클래스를 생성하여 프로젝트에 추가한다. (10%)

-멤버 변수: 이름 (CString m_strName), 나이 (int m_nAge), 외모 (CString m_strAppearance), 성격 (CString m_strPersonality)

-멤버 함수: 생성자, 소멸자, operator=, Serialize, SetName, SetAge, SetAppearance, SetPersonality, GetName, GetAge, GetAppearance, GetPersonality, 등등, ...

4. FormView Dialog (IDD_SIMPLEPERSONRECORD_FORM)에 등록, 수정, 삭제  버튼을 이용하여 멤버정보를 리스트 (CListCtrl 클래스)에 새로 추가, 선택항목 수정 및 삭제할 수 있다. (20%)

-뷰 클래스 CSimplePersonRecordView에

-void OnUpdate(CView* pSender, LPARAM lHint, CObject *pHint) // OnInitialUpdate을 사용하지 말고, OnUpdate을 사용할 것. OnUpdate 함수에는 m_ctrlList의 틀을 그리고 난 후 (즉, InsertColumn), 도큐먼트에 m_PersonArray를 읽어들여서 m_ctrlList의 항목 추가 (즉, InsertItem & SetItemText)를 한다.

-afx_msg void OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult)

-afx_msg void OnBnClickedButtonAdd() // 새로운 person 생성 후 도큐먼트클래스의 m_PersonArray에 person 추가, 폼뷰의 m_ctrlList에 person 추가한다. (즉, InsertItem & SetItemText)

-afx_msg void OnBnClickedButtonModify() // m_ctrlList.GetSelectionMark() 함수를 이용하여 현재 리스트에서 선택된 항목 index를 찾고, m_PersonArray와 m_ctrlList에 그 항목(person)을 수정한다.

-afx_msg void OnBnClickedButtonDel() // m_ctrlList.GetSelectionMark() 함수를 이용하여 현재 리스트에서 선택된 항목 index를 찾고, m_PersonArray와 m_ctrlList에서 그 항목(person)을 삭제한다.

-출력화면 예시

5. FormView Dialog (IDD_SIMPLEPERSONRECORD_FORM)에 열람  버튼을 누르면 새로운 대화상자 (IDD_DIALOG_VIEW)에서 그 멤버의 사진과 정보를 볼 수 있다. (20%)

-BMP포멧 비트맵 이미지파일 (예시: 스탠 마쉬.bmp, 에릭 카트맨.bmp, 웬디 데스타버거.bmp, 카일 브로프로프스키.bmp, 케니 맥코믹.bmp)를 사용하여 테스트해 볼 것. 비트맵 이미지의 가로, 세로 크기는 150을 넘지 않는다.

-뷰 클래스 CSimplePersonRecordView에

-afx_msg void OnBnClickedButtonView() // m_ctrlList.GetSelectionMark() 함수를 이용하여 현재 리스트에서 선택된 항목 index를 찾고, 그 항목 (person)의 값을 대화상자 (IDD_DIALOG_VIEW)의 값으로 연결시키고, DoModal()을 부른다.

-대화상자 클래스 ViewDlg에

-BOOL ViewDlg::OnInitDialog() // 이 함수에서 이미지파일을 로딩한다.

-출력화면 예시

6. 메뉴에서 텍스트파일 또는 데이터 파일에 멤버정보 리스트를 읽어 들이고, 텍스트 파일 또는 데이터 파일로 멤버정보 리스트를 저장하는 기능을 추가한다. (20%)

-텍스트파일 (예시: 사우스파크.txt)과 데이터 파일(예시: 사우스파크.dat)를 사용하여 테스트해 볼 것

-도큐먼트 클래스 CSimplePersonRecordDoc에 CTypedPtrArray<CObArray,CPerson*> m_PersonArray;를 선언하여 리스트를 관리한다

-void CSimplePersonRecordDoc::OnFileImport()   // 텍스트파일 읽기

-void CSimplePersonRecordDoc::OnFileExport()   // 텍스트파일 저장

-void CSimplePersonRecordDoc::Serialize(..)    // 데이터파일 읽기/저장

-void CSimplePersonRecordDoc::DeleteContents() // 리스트 데이터 clean up

- 텍스트파일은 CSV 포맷 (예시: 사우스파크.txt를 사용하여 테스트해 볼 것)

에릭 카트맨, 9, 뚱뚱함, 독설적이며 버릇없음

스탠 마쉬, 9, 귀여움, 평범하고 정상적

카일 브로프로프스키, 9, 초록색모자, 지적이며 때론 쉽게 흥분

케니 맥코믹, 9, 모자로 둘러싸임, 미스테리

7. 본인이 좋아하는 10개 이상의 캐릭터들(예: 둘리, 짱구, 체리, 루피, 등등)의 리스트를 작성하여, 위에서 언급한 모든 기능을 구현 데모한다. (보고서점수에 포함)