연습문제 (3)

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

□ 단원 : MFC 구조 & 화면 출력

□ 목표 : MFC CObject 기반 클래스 생성 & 화면 출력

□ 주요 연습 내용 : CObject, CBitmap, CPen, Rectangle, Line, DrawText

□ 준비자료 : SimpleCObject.zip (Account.cpp, Account.h, ChildView.cpp,

ChildView.h, MainFrm.cpp, MainFrm.h, Simple.cpp, Simple.h,

stdafx.cpp, stdafx.h)

[연습문제]

연습문제 Ex3 (Due by 10/26 금 22시까지)

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

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

1. CPerson 클래스를 새로 생성한다. (10%)

-모든 변수명 지정 시 헝가리언 표기법을 사용한다 (예: CString m_strName).

-멤버 변수: ID, 성명 (FirstName & LastName), 전화번호, 주소

-멤버 함수:

디폴트 생성자, 파라메터로 입력받는 생성자,

GetID(), GetFirstName(), GetLastName(), GetPhone(), GetAddress(),

SetID(int), SetFirstName(CString), SetLastName(CString), SetPhone(CString), SetAddress(CString),

operator=(const CPerson& other), operator==(const CPerson& other)

2. 첨부된 CAccount 클래스에 다음을 추가한다. (10%)

- 모든 변수명 지정 시 헝가리언 표기법을 사용한다.

- CAccount 클래스에 예금주이름을 (즉, CString m_strUserName) 없애고 대신 CPerson 형으로 (즉, CPerson m_User) 바꾼다. 그에 따른 Set, operator== 함수도 바꾼다.

- CAccount 클래스 Show 함수에 cout으로 출력하는 것을 TRACE로 바꾼다.

- CAccount 클래스에 이름(LastName + FirstName), 예금종류, 계좌번호, 잔고를 화면에 출력하는 void DrawText(CPaintDC& dc, int x, int y, int width, int height) 함수를 추가한다. dc는 dc.DrawText(HDC, LPCTSTR, int, LPRECT, UINT) 함수를 사용하는데 쓰일 것이고, x, y는 화면에 출력할 지점, width는 이름,예금종류, 계좌번호, 잔고를 출력할 사이 간격, height는 출력할 텍스트의 높이. DrawText는 http://msdn2.microsoft.com/en-us/library/ms533909.aspx 참고할 것.

- CAccount 클래스에 이름(LastName + FirstName), 예금종류, 계좌번호, 잔고를 CString의 배열(CString m_strAccountString[4])로 만들어서 넘겨주는 CString* GetAccountStringList() 함수를 추가한다.

3. Ex2의 AccountManager 클래스를 CAccountManager로 바꾼다. (10%)

- 모든 변수명 지정 시 헝가리언 표기법을 사용한다.

- 모든 함수에 Account 클래스 대신 CAccount 클래스로 바꿔준다.

- 모든 CAccount의 DrawText를 불러서 화면에 출력해 주는 void DrawText(CPaintDC& dc, int x, int y, int width, int height) 함수를 추가한다.

4. CChildView::OnPaint()에서 10개 정도의 CAccount의 상태를 리스트 모양으로 화면에 출력한다. (Line, Rectangle, DrawText를 이용할 것)  (30%)

void CChildView::OnPaint()	// 예시

{

CPaintDC dc(this);

// 중간 생략 ...

CPerson dog, cat;

dog.Set(1, "아지, "강, "041-550-4469", "제과학관);

cat.Set(2, "양이, "고, "041-550-4470", "제과학관);

CAccount account[10];

account[0].Set(dog, "닷컴통장, "27394-27-46517", 50000);

account[1].Set(dog, "저축통장, "12394-47-46517", 10000);

account[2].Set(cat, "보통통장, "17394-72-46517", 1000);

account[3].Set(cat, "투자신탁, "67941-11-46517", 2000);

account[4].Set(dog, "보통통장, "12341-78-46517", 2000);

account[5].Set(cat, "닷컴통장, "98765-12-46517", 2000);

CAccountManager manager;

for (int i=0; i<6; i++)

manager.Add(account[i]);

manager.Show();

int width = 90;

int height = 30;

int numElement = manager.GetSize();

// 회색배경 굵은선

dc.SelectStockObject(LTGRAY_BRUSH);

CPen penThick(PS_SOLID, 2, RGB(0, 0, 0));

dc.SelectObject(&penThick);

dc.Rectangle(CRect(10, 10, 10 + 4*width, 10 + height));

// 굵은선으로 테이블 모양을 추가할 것

// ...

// 보통선으로 가로선 더 추가할 것

// ...

// 보통선으로 세로선 더 추가할것

// ...

// 보통글자로 Title 출력

CString strTitle[] = {

"이름, "계좌종류, "계좌번호, "잔액

};

dc.SelectStockObject(SYSTEM_FONT);

dc.SetBkMode(TRANSPARENT);

for (int i = 0; i < 4; i++)

{

dc.DrawText(strTitle[i], strTitle[i].GetLength(),

CRect(10 + i*width, 10, 10 + (i + 1)*width, 10 + height),

DT_CENTER|DT_VCENTER|DT_SINGLELINE);

}

// Account 화면출력

manager.DrawText(dc, 10, 40, width, height);

}

5. CChildView::OnPaint()에 Bitmap 그림을 화면에 출력한다. (10%)

[참고] 출력화면 예시