실습숙제 3 (Due by 10/26)

□ 단원 : MFC 구조, 화면출력
□ 목표 : MFC CObject 기반 클래스 생성 & 화면 출력
□ 주요 연습 내용 : CObject, CBitmap, CPen, Rectangle, DrawText, LoadImage
□ 준비자료 : 3_CPerson.zip (Person.cpp, Person.h, Student.cpp, Student.h, Faculty.cpp, Faculty.h, PersonManager.cpp, PersonManager.h,
ChildView.cpp, ChildView.h, MainFrm.cpp, MainFrm.h, Simple.cpp, Simple.h, etc)
1218640374.zip
참고: VC++는 MFC Application Program을 사용하는 방식으로 작성한다.
http://dis.dankook.ac.kr/lectures/hci08/entry/MFC-Application-Program

[연습문제]
연습문제 Ex3 (Due by 10/26 일 24시까지)
-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, CFaculty, CStudent 클래스를 CObject 기반으로 만들고 필요한 함수를 추가한다. (30%)
– 모든 변수명 지정 시 헝가리언 표기법을 사용한다.
– CPerson, CFaculty, CStudent 클래스 Show() 함수를 output 창에 출력할 수 있도록 TRACE를 사용한다.
– CPerson, CFaculty, CStudent 클래스 DrawText(CPaintDC& dc, int x, int y, int width, int height) 함수를 작성한다.
 – dc.Rectangle함수를 이용하여 사각형 외곽을 그린다.
 – LoadImage와 dc.StretchBlt를 이용하여 사진을 그린다.
 – dc.DrawText를 사용하여 “이름: “, “ID : “, “전화: “, “주소: ”
   등등 타이틀을 그린다.
 – dc.DrawText를 사용하여 실제 이름, ID, 전화, 주소 등등을 그린다.
– 힌트: dc.DrawText(LPCTSTR, int, LPRECT, UINT) 함수에서 RECT 구조체의 x, y는 화면에 출력할 시작점, width는 각각 데이터필드를 출력할 사이 간격, height는 출력할 텍스트의 높이. DrawText 함수는 http://msdn2.microsoft.com/en-us/library/ms533909.aspx 참고할 것.
– 힌트: 사진그리기는 SimpleDrawing을 참고할 것
 CDC memdc;
 memdc.CreateCompatibleDC(&dc);
 HBITMAP hImage = (HBITMAP) LoadImage(AfxGetInstanceHandle(),
  “멀티미디어.bmp”, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
 memdc.SelectObject(hImage);
 dc.StretchBlt(50, 500, 777, 272, &memdc, 0, 0, 777, 272, SRCCOPY);


2. CPersonManager 클래스는 CObList를 이용하여 CPerson, CStudent, CFaculty 목록을 통합 관리한다. (30%)
– CObList를 사용하여, CPerson, CStudent, CFaculty 목록을 관리한다.
– CPerson, CFaculty, CStudent 클래스의 Show를 불러서 output 창에 출력하는 Show() 함수를 작성한다.
– 모든 CPerson, CFaculty, CStudent 클래스의 DrawText를 불러서 화면에 출력해 주는 void DrawText(CPaintDC& dc, int x, int y, int width, int height) 함수를 추가한다.
– 힌트: Show() 함수와 DrawText(…) 함수에는 실시간클래스정보를 사용하여 객체의 데이터형에 따른 Show()와 DrawText(…) 함수를 부르도록 한다.


3. CChildView::OnPaint()에서 본인이 원하는 5~6개 정도의 CPerson, CFaculty, CStudent를 추가하고, 리스트 모양으로 화면에 출력한다. (10%)


void CChildView::OnPaint()  // 아래 출력 화면의 예시
{
 CPaintDC dc(this);


 // TODO: Add your message handler code here
 CPersonManager pList;
 
 CPerson person1(“김승훈”, 12011126, “041-550-3481”,
   “충남 천안시 안서동 과학기술관 420호”);
 pList.Add(&person1);


 CPerson person2(person1);
 pList.Add(&person2);


 CFaculty prof1(“Park Tae Geun”, 12041130, “041-550-3486”,
   “충남 천안시 안서동 과학기술관 419호”, “멀티미디어공학전공”);
 pList.Add(&prof1);


 CFaculty prof2(“Suh Byung Moon”, 12071458, “041-550-3471”,
   “충남 천안시 안서동 과학기술관 424호”, “멀티미디어공학전공”);
 pList.Add(&prof2);


 CStudent student1(“Kim Mi Hee”, 52051671, “041-550-3490”,
   “충남 천안시 안서동”, 4.0);
 pList.Add(&student1);


 CStudent student2(“Kim Jeong Mi”, 52051712, “041-550-3490”,
   “충남 천안시 안서동”, 4.5);
 pList.Add(&student2);


 // PersonList TRACE 출력
 pList.Show();
 // PersonList 화면출력
 pList.DrawText(dc, 10, 10, 250, 20);
}


[참고] 출력화면 예시
사용자 삽입 이미지

MFC CObject Program Demo

MFC CObject Program (CObject를 상속받은 CPoint3D클래스의 사용예제)
MFC Application Program 방식으로 프로그램을 생성
-CPoint3D 클래스는 실시간 클래스 정보 & 동적 객체 생성을 지원
1081925782.zip
-CChildView 클래스는 RUNTIME_CLASS(MYCLASS)->CreateObject()로 동적객체생성과
IsKindOf(RUNTIME_CLASS(MYCLASS))를 통해 실시간 클래스 정보 테스트
1382672211.zip

MFC Application Program

.NET2005


  • MFC App 프로젝트 새로 만들기

    • 메뉴에서 File->New->Project->Visual C++ 템플릿->MFC->MFC Application를 선택한 후 “프로젝트 이름(예를 들어, SimpleMFC)”을 적고 확인버튼을 누른다.
    • SDI, Use MFC in a Shared DLL, 한국어 선택하고 Next버튼을 누른다.
    • 데이터베이스는 None으로 선택하고 Next버튼을 누른다.
    • 사용자인터페이스 확인하고 Next버튼을 누른다.
    • Advanced Features에서 ActiveX를 선택해제한다.
    • 그리고, Generated Classes를 확인하고 Finish버튼을 누른다.

    사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지
     


  • 코드 추가

    • CChildView::OnPaint에 출력함수(예: “dc.TextOut(100, 100, CString(“안녕하세요”))을 추가한다.

    사용자 삽입 이미지


  • 빌드(F7)와 실행(F5 or CTRL+F5)

    사용자 삽입 이미지


  • ClassView에서 CChildView 클래스를 선택한후 Properties Window를 호출하여 Messages 아이콘을 클릭하여 메시지 리스트에서 원하는 메시지를 선택하여 함수를 추가

  • 사용자 삽입 이미지


  • WM_KEYDOWN을 선택하여, OnKeyDown 함수를 추가

  • 사용자 삽입 이미지


  • WM_LBUTTONDOWN을 선택하여, OnLButtonDown 함수를 추가

  • 사용자 삽입 이미지


  • OnKeyDown함수와 OnLButtonDown함수 안에 코드를 추가

  • 사용자 삽입 이미지
     


  • 빌드(F7)와 실행(F5 or CTRL+F5)

  • 사용자 삽입 이미지사용자 삽입 이미지



    실습숙제2 재공지

    실습숙제2 재공지
    실습숙제2에서 2_CPerson.zip을 새로 다운로드 받아서 작성하도록 함
    -CPersonManager 클래스는 private 멤버로 CList<CPerson, CPerson&> m_aPersonList를 가지는 것이 아니라 CList<CPerson*, CPerson*> m_aPersonList를 가짐
    -그래야, CList에 데이터가 CPerson이나 CStudent이나 CFaculty이라해도 그 데이터형에 맞는 Show함수를 부를 수 있음.
    -만약, CList<CPerson, CPerson&>으로 하면 CPerson이나 CStudent이나 CFaculty의 데이터형에 상관없이 모두 CPerson의 Show를 부르게 됨.

    -차이점 예시


      CArray<Point, Point&> arr1;
      arr1.Add(Point(10,20));
      arr1.Add(Point(30,40));
      arr1.Add(Point3D(4,5,6));
      arr1.Add(Point3D(7,8,9));
      cout << endl << “CArray<Point, Point&> 출력 Loop by index:” << endl;
      for(int i = 0; i < arr1.GetSize(); i++) {
       arr1[i].Show(); // dynamic binding이 안됨
      }

    출력결과:
    CArray<Point, Point&> 출력 Loop by index:
    X= 10 Y= 20
    X= 30 Y= 40
    X= 4 Y= 5
    X= 7 Y= 8




      CArray<Point*, Point*> arr2;
      arr2.Add(new Point(10,20));
      arr2.Add(new Point(30,40));
      arr2.Add(new Point3D(4,5,6));
      arr2.Add(new Point3D(7,8,9));

      cout << endl << “CArray<Point*, Point*> 출력 Loop by index:” << endl;
      for(int i = 0; i < arr2.GetSize(); i++) {
       Point * pt = arr2[i];
       pt->Show();         // dynamic binding
      }

    출력결과:
    CArray<Point*, Point*> 출력 Loop by index:
    X= 10 Y= 20
    X= 30 Y= 40
    X=4 Y=5 Z=6
    X=7 Y=8 Z=9

    실습숙제2 (Due by 10/3)

    □ 단원 : 유틸리티 클래스, 집합 클래스
    □ 목표 : CString, 집합클래스 연습
    □ 주요 연습 내용 : CString, CList
    □ 준비자료 : 2_CPerson.zip (Person.cpp, Person.h, Student.cpp, Student.h, Faculty.cpp, Faculty.h, PersonManager.cpp, PersonManager.h, main.cpp)


    1102780408.zip
    참고: VC++는 Win32 console에 MFC를 사용하는 방식으로 작성한다.
    http://dis.dankook.ac.kr/lectures/hci08/entry/WIN32-Console-Program-Using-MFC-Classes



    연습문제 Ex2 (Due by 10/3 금 24시까지)
    -cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC++ 2005 file, 보고서를 학번_이름_Ex2.zip으로 묶어서 낼 것. 보고서 (30%)

    [연습문제]


    1. CPerson 클래스의 변수를 CString 형으로 변환한다. 그에 따른 함수 내부를 수정한다. (10%)


    – CString m_strName;


    – int n_nID;


    – CString m_strPhone;


    – CString m_strAddr;


    – friend bool operator==(const CPerson &lhs, const CPerson &rhs) 함수 추가


     


    2. CStudent 클래스의 변수를 CString 형으로 변환한다. 그에 따른 함수 내부를 수정한다. (10%)


    – float m_nGPA;


    – friend bool operator==(const CStudent &lhs, const CStudent &rhs) 함수 추가


     


    3. CFaculty 클래스는 CPerson에서 파생한 클래스로 다음과 같은 멤버변수를 추가로 가지고 있다. (10%)


    – CString m_strDept;


    그리고 멤버 함수는 다음과 같은 기능을 한다.


    – CFaculty(); // default constructor 기본 생성자 함수


    – CFaculty(CString , int, CString, CString, CString); // conversion 형변환 생성자 함수


    – CFaculty(const CFaculty&); // copy constructor 복사 생성자 함수


    – CFaculty& operator=(const CFaculty&); // operator= 함수


    – virtual ~CFaculty(); // destructor 소멸자 함수


    – virtual void Show(); // CFaculty의 이름, 아이디, 전화번호, 주소, 소속을 보여줌


    – CString GetDepartment() const; // CFaculty의 소속 (m_strDept)을 돌려줌


    – friend std::ostream& operator<<(std::ostream&, const CFaculty&);


    – friend std::ostream& operator<<(std::ostream&, const CFaculty*);


    – friend std::istream& operator>>(std::istream&, CFaculty&);


    – friend bool operator==(const CFaculty &lhs, const CFaculty &rhs) 함수 추가


     


    4. CPerson, CStudent, CFaculty 목록을 CList를 이용하여 입출력을 통합 관리하는 CPersonManager 클래스를 작성한다. (20%)


    – private 멤버로 CList<CPerson*, CPerson*> m_aPersonList를 가짐


    – 소멸자는 모든 CPerson을 리스트에서 제거함


    – Add 함수는 CPerson을 리스트에 추가함


    – Remove 함수는 CList의 Find를 이용하여 동일한 CPerson이 존재하는지 확인 후 있으면 그것을 제거함


    – RemoveAll 함수는 모든 CPerson을 리스트에서 제거함


    – GetTotalNumberOfPeople 함수는 리스트에 존재하는 CPerson이 몇 명 있는지를 알려줌


    – GetPersonList 함수는 리스트를 돌려줌


    – Show 함수는 리스트에 존재하는 모든 CPerson의 Show()를 사용하여 모든 Person, Student, Faculty의 내용(즉, 이름, 아이디, 전화번호, 주소 등등)을 출력함


     


    5. main.cpp에서 CPersonManager 목록에 10개 이상의 CPerson, CStudent, CFaculty를 추가하고 난 후, 다음을 수행한다. (20%)


    – CPersonManger의 GetTotalNumberOfPeople 함수 사용하여, 리스트에 몇 명의 Person이 존재하는지 출력


    – CPersonManger의 Show 함수 사용하여, 리스트에 있는 모든 Person, Student, Faculty의 내용(즉, Person들의 이름, 아이디, 전화번호, 주소 등등)을 출력


    – CPersonManger의 Remove와 Show 함수를 사용하여, 각각 한 두 명의 Person, Student, Faculty를 리스트에서 지우고 난 후, 리스트에 있는 모든 내용을 출력


    – cin으로 CPerson, CStudent, CFaculty 정보를 입력받은 객체를 생성 후, 리스트에 있는 모든 내용을 출력