Department of Digital Contents Sang Il Park

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

메시지 처리의 기본 개념 메시지 발생된 이벤트의 종류와 정보를 전달하는 일종의 상수 값 윈도우 프로그래밍 가장 중요한 것은 메시지를 처리하는 것 윈도우 시스템 Application 이벤트 발생 메시지 전송 메시지 처리 화면에 출력.
Computer Graphics 윈도우 프로그래밍 김 창 헌김 창 헌. Computer Graphics 2 윈도우 시스템  윈도우  스크린 위에서 독립적으로 움직일 수 있는 사각형 영역  윈도우 시스템  유저와 어플리케이션간의 그래픽 스크린을 통한 인터페이스 를.
CH5 디버그를 해보자 디버그 디버거 : 실행중인 응용 프로그램을 지정한 장소에서 정지하고, 그 시 점에서 변수, 메모리, 콜 스택의 내용을 참조하는것이 가능 Build -> Start Debug -> Go.
Visual C++ Programming Document/View Architecture
컴퓨터 공학 설계 및 실험 I MFC programming
2장. 윈도우즈 입출력 1/211 1.
7장. MDI 프로그래밍 MDI 프로그래밍에 대한 내용을 배우도록 한다. 지금까지 배운 것은 생성된 윈도우에 단일 화면이 존재하는 형태였다. 이것을 SDI라고 부르고 Single Document Interface의 약자이다. 하나의 문서를 하나의 화면에 보여주는 형태의.
3. C++와 객체지향 C++ 코딩 방법 객체 단위로 2 개의 파일 인터페이스 파일 구현파일
Vision System Lab, Sang-Hun Han
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷 MFC 응용 프로그램 마법사를 이용한 MFC 프로젝트 작성
명품 C++ 8장 상속.
Windows Programming Chapter 1. Introduction to SDK
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
C++ Espresso 제1장 기초 사항.
Lecture 2 MFC and Application Frameworks
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
Visual C++ Programming Document/View Architecture 3
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
5장. 단축키와 비트맵 윈도우 프로그램에는 화면에서 사용자들의 입력을 받아 들이고 출력을 위한 코드 외 부분이 존재한다. 이 부분을 주로 리소스라고 부르고 이들은 주로 화면에 나타난다. 메뉴, 툴바, 비트맵, 단축키, 대화상자 등이 여기에 속한다. 이 부분들은 우리의 프로그램의.
강좌명 : C++프로그래밍 (C++ Programming)
MFC 발전 과정과 주요 특징을 개괄적으로 이해한다.
Department of Digital Contents Sang Il Park
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
윤 홍 란 MFC 기초 윤 홍 란
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
Windows Programming 시작하기
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
8. 객체와 클래스 (기본).
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ Espresso 제9장 다형성.
C++ Espresso 제6장 생성자와 소멸자.
Game Programming 03 - Tools of trade
MFC Application Frameworks (AFX)
Visual C++ Programming
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
Visual C++ Programming Output and File
MFC UI for TS Analyzer 서울시립대학교 컴퓨터통계학과 최 용 진.
Visual C++ Programming Common Controls
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C ++ 프로그래밍 시작.
김 정 석 Web Programming 김 정 석
C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선
Visual C++ Programming MFC Programming의 이해
Visual Studio 2010 프로젝트 생성하기 PC화면에서 Visual Studio 2010 아이콘을 더블클릭 하거나
Windows Programming 시작하기
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
adopted from KNK C Programming : A Modern Approach
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
Lab 4 보고서 교재 5장 사용자 인터페이스 예제 - 사용자 인터페이스 갱신
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
가상함수와 추상 클래스.
GUI 소켓 애플리케이션 Chapter 08. * 학습목표 윈도우 GUI 애플리케이션의 구조와 동작 원리를 이해
Chapter3 : 객체지향의 개념 3.1 객체지향(object-oriented)과
Chap02 객체 지향 개념 2.1 객체지향(object-oriented)과 절차지향(procedural-oriented)
Lab 9 Guide: 인터넷 프로그래밍 예제 * 일대일 채팅 프로그램 (교재 27장, 쪽)
Operating System Multiple Access Chatting Program using Multithread
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
Chapter 02. 소프트웨어와 자료구조.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
3장. 제어 메시지 처리하기 1/211 1.
3장,4장 발표 서정우.
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
제 7장 이벤트.
Windows 프로그래밍 환경 및 MFC의 구조
컴퓨터 계측 및 실습 C++ 기초 영남대학교 기계공학부.
MFC 응용 프로그램 구조 두 개의 윈도우로 구성된 일반적인 MFC 프로그램 프레임 윈도우
윈도우 운영체제와 윈도우 응용 프로그램의 특징 SDK 응용 프로그램 MFC 응용 프로그램
C++ 언어의 특징
MFC 기초 윈도우 응용프로그램 개발 간략한 역사 Microsoft Foundation Classes
Presentation transcript:

Department of Digital Contents Sang Il Park MFC 시작하기 Department of Digital Contents Sang Il Park

간단한 코딩 연습 C++를 사용하여, 사용자의 입력에 따라 ‘1’을 입력하면 “Sejong University”를 출력 ‘2’를 입력하면 “Digital Contents”를 출력 ‘3’을 입력하면 “Bye~”를 출력하고 종료 위의 과정을 무한 반복

간단한 메시지 기반 프로그래밍의 예 Message Message Loop Message Handler #include <iostream> using namespace std; int main() { int i; while(true) cout<<"Input: "; cin>>i; switch(i) case 1: cout<<"Sejong University"<<endl; break; case 2: cout<<"Digital Contents"<<endl; case 3: cout<<"Bye!"<<endl; return 0; default: } Message Loop Message Message Handler

좀 더 멋있게… void procedure(int msg) { switch(msg) case 1: cout<<"Sejong University"<<endl; break; case 2: cout<<"Digital Contents"<<endl; case 3: cout<<"Bye!"<<endl; exit(0); default: } int main() { int i; while(true) cout<<"Input: "; cin>>i; procedure(i); } return 0;

Windows API API (Application Programming Interface) Win32 운영체제 등을 제어하기 위한 기능들을 모아놓은 Library의 일종 주로 C 함수의 형태로 되어 있음. Win32 Windows용 API의 이름 즉, 윈도우에서 돌아가는 프로그램을 만들기 위한 기능들을 모아놓은 가장 기본적인 library Ex.) 창만들기, 버튼 달기, 메뉴만들기 등…

A Simple win32 code // // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // PURPOSE: Processes messages for the main window. // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) case IDM_ABOUT: // MessageBox(hWnd, _T("haha"), _T("about"), MB_OK); DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); default: return DefWindowProc(hWnd, message, wParam, lParam); } case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... RECT rect; GetClientRect(hWnd, &rect); DrawText(hdc, _T("hello, Windows"), -1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER); EndPaint(hWnd, &ps); case WM_DESTROY: PostQuitMessage(0); return 0; // Message handler for about box. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) UNREFERENCED_PARAMETER(lParam); case WM_INITDIALOG: return (INT_PTR)TRUE; if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)FALSE; // // FUNCTION: MyRegisterClass() // PURPOSE: Registers the window class. // COMMENTS: // This function and its usage are only necessary if you want this code // to be compatible with Win32 systems prior to the 'RegisterClassEx' // function that was added to Windows 95. It is important to call this function // so that the application will get 'well formed' small icons associated // with it. ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTWIN32)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TESTWIN32); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // FUNCTION: InitInstance(HINSTANCE, int) // PURPOSE: Saves instance handle and creates main window // COMMENTS: // In this function, we save the instance handle in a global variable and // create and display the main program window. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; // testWin32.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "testWin32.h" #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name // Forward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Place code here. MSG msg; HACCEL hAccelTable; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_TESTWIN32, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWIN32)); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) TranslateMessage(&msg); DispatchMessage(&msg); return (int) msg.wParam;

Code in short BOOL InitInstance(…) { hWnd = CreateWindow(…); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(…) switch (message) case WM_COMMAND: break; case WM_PAINT: case WM_DESTROY: PostQuitMessage(0); default: return; return 0; int APIENTRY _tWinMain(…) { // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) return FALSE; } // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) if (!TranslateAccelerator(…)) TranslateMessage(&msg); DispatchMessage(&msg); return (int) msg.wParam;

Code in short BOOL InitInstance(…) { hWnd = CreateWindow(…); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(…) switch (message) case WM_COMMAND: break; case WM_PAINT: case WM_DESTROY: PostQuitMessage(0); default: return; return 0; int APIENTRY _tWinMain(…) { // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) return FALSE; } // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) if (!TranslateAccelerator(…)) TranslateMessage(&msg); DispatchMessage(&msg); return (int) msg.wParam;

Win32 프로그램 구조 WinMain(…)  main 함수 { InitInstance(…)  초기화 (틀을 만들고 보여줌) while( GetMessage (…))  메시지 루프 DispatchMessage(…)  메세지처리(WinProc) }

MFC ?

MFC 주요 특징 (1/3) 윈도우 응용 프로그램을 작성하는데 드는 수고를 크게 덜어준다. 라이브러리 재사용 AppWizard, ClassWizard API를 기반으로 프로그램과 대등한 속도를 가진다. 인라인 함수의 활용 코드 크기 증가를 최소화한다. 동적 라이브러리 활용

MFC 주요 특징 (2/3) API 프로그래밍에 대한 기반 지식을 재활용할 수 있다. API 함수를 직접 호출할 수 있다. (예) ReleaseCapture(); C++ 언어를 이용하여 기존의 C 언어에 비해 API를 좀더 편하게 사용할 수 있다. (예) 오버로딩 및 디폴트 인자

MFC 주요 특징 (3/3) API를 직접 사용해서 구현할 경우 복잡도가 높은 부분을 MFC를 이용하면 쉽게 구현할 수 있다. 인쇄 기능 지원, 툴바와 상태바 처리, 데이터베이스 지원, OLE와 액티브X, ...

MFC 프로그램 만들어 보기

The simplest MFC application Single Document No Document/View architecture support No database support No ActiveX control No Docking toolbar No Initial status bar

MFC 응용 프로그램 생성 (8/8) 실행

MFC 응용 프로그램 작성 코드의 변경

Look into the codes

C++? CLASS?

C++ 향상된 C C + Class C의 효율성 + 객체지향개념(object-oriented)

절차지향과 객체지향 객체지향의 배경 객체지향과 절차지향의 비교 소프트웨어 모듈의 재사용과 독립성을 강조 절차지향 (Procedural-Oriented) : 데이터 구조와 그 데이터를 변화시키는 procedure/function으로 구성 객체지향 (Object-Oriented) : 객체들이 메시지(message)를 통하여 통신함으로써 원하는 결과를 얻는다. 각 객체는 고유의 속성(attribute)와 데이터를 처리할 수 있는 메소드(method)로 구성

절차지향과 객체지향 비구조적 구조적/절차지향 객체지향

객체 객체(Object) 효율적으로 정보를 관리하기 위하여, 사람들이 의미를 부여하고 분류하는 논리적인(개념적인) 단위 실 세계에 존재하는 하나의 단위에 대한 소프트웨어적 표현 관련된 변수와 함수의 묶음 객체의 구성 속성의 값을 나타내는 데이터(data) - attribute 데이터를 변경하거나 조작하는 기능(function) – method

객체지향 프로그래밍의 특징 캡슐화 (encapsulation) 다형성 (polymorphism) 상속 (inheritance) 각각의 의미에 대해 집에서 책을 찾아 볼 것!

데이터를 묶는 단위: 구조체

구조체 (structure) 구조체: 관련된 정보를 그룹화하여 표현 구조체 이름 학생 이름 학번 주소 전화번호 멤버 변수

구조체의 정의 구조체의 정의 struct 구조체이름 { 멤버변수타입1 변수이름1; 멤버변수타입2 변수이름2; 멤버변수타입3 변수이름3; … };

구조체의 정의 Example) struct student { char name[30]; int number; float grade; };

구조체 타입의 변수 선언 구조체이름 구조체변수이름; struct student { char name[30]; int number; float grade; }; student a, b;

멤버로의 접근 구조체변수이름.맴버변수이름 struct score { int korean; int math; }; score a; a.korean = 30; a.math = 80;

구조체를 가리키는 포인터 구조체를 변수형처럼 사용해서 포인터를 정의 할 수 있다 struct rectangle { int x,y; int width, height; }; rectangle rc; rectangle * p = &rc;

구조체의 맴버 변수 접근 구조체변수.맴버변수 구조체에서는: 구조체포인터는: (*구조체포인터).맴버변수 구조체포인터->맴버변수 구조체포인터->맴버변수

구조체의 맴버 변수 접근 예 struct rectangle { int x,y; int width, height; }; rectangle rc; rectangle * p = &rc; rc.x=10; (*p).x = 10; p->x = 10; 모두 같다

데이터와 그 기능을 묶는 단위:클래스

클래스의 정의 Point 클래스를 정의하는 예 // Point 클래스를 정의한다. class Point { public: // 멤버 변수들 int x, y; // 멤버 함수 void Print() cout << "( " << x << ", " << y << ")\n"; } };

클래스의 정의 Point 클래스를 정의하는 예

객체의 생성과 사용(1) 클래스 객체를 생성하고 사용하는 예 // 객체를 생성한다. Point pt1, pt2; pt1.x = 100; pt1.y = 100; pt2.x = 200; pt2.y = 200; // pt1, p2의 내용을 출력한다. pt1.Print(); pt2.Print();

객체의 생성과 사용(2) Print() 함수에서 사용하는 x, y의 의미 [21-3]

멤버 함수의 위치 클래스의 정의 바깥쪽에 멤버 함수를 정의한 예 class Point { public: // 멤버 변수 int x, y; // 멤버 함수 void Print(); }; void Point::Print() cout << "( " << x << ", " << y << ")\n"; }

생성자와 소멸자 생성자는 객체를 생성할 때 자동으로 호출되는 함수이다. 소멸자는 객체를 소멸할 때 자동으로 호출되는 함수이다. 그러므로 생성자는 객체를 사용할 수 있도록 초기화 하는 코드를 넣기에 알맞은 장소이다. 소멸자는 객체를 소멸할 때 자동으로 호출되는 함수이다. 그러므로 소멸자는 객체가 사용한 리소스를 정리하는 코드를 넣기에 알맞은 장소이다.

디폴트 생성자(Default Constructors) 디폴트 생성자의 추가 class Point { public: int x, y; void Print(); Point(); }; Point::Point() x = 0; y = 0; } // 실제 실행 시.. Point pt; // 생성자가 호출된다. pt.Print();

인자가 있는 생성자 인자가 있는 생성자의 추가 class Point { public: int x, y; void Print(); Point(); Point(int initialX, int initialY); }; Point::Point(int initialX, int initialY) x = initialX; y = initialY; } // 중간 생략 Point pt(3, 5); pt.Print();

소멸자 소멸자를 사용해서 할당한 메모리를 해제하는 예 class DynamicArray { public: int* arr; DynamicArray(int arraySize); ~DynamicArray(); }; DynamicArray::DynamicArray(int arraySize) // 동적으로 메모리를 할당한다. arr = new int [arraySize]; } DynamicArray::~DynamicArray() // 메모리를 해제한다. delete[] arr; arr = NULL;

객체의 동적인 생성 동적 메모리 할당을 사용해서 객체를 생성하는 예 Point pt(50, 50); Point* p1 = new Point(); // 디폴트 생성자 사용 Point* p2 = new Point(100, 100); // 인자있는 생성자 사용 Point* p3 = new Point( pt); // 복사 생성자 사용 p1->Print(); p2->Print(); p3->Print(); delete p1; delete p2; delete p3;

접근 권한 설정하기(1) 멤버의 접근 권한을 설정하는 예 class AccessControl { public: char publicData; void publicFunc() {}; protected: int protectedData; void protectedFunc() {}; private: float privateData; void privateFunc() {}; }; int main() // 객체를 생성하고, 각 멤버에 접근해보자 AccessControl ac; ac.publicData = 'A'; // 성공 ac.publicFunc(); // 성공 ac.protectedData = 100; // 실패 ac.protectedFunc(); // 실패 ac.privateData = 4.5f; // 실패 ac.privateFunc(); // 실패 return 0; } 멤버의 접근 권한을 설정하는 예

접근 권한 설정하기(2) 멤버의 접근 권한 설정하기 접근 권한 키워드에 대한 요약 (뒤에서 더욱 자세히 분류) [21-23] public : 외부에서의 접근을 허용한다. protected, private : 외부에서 접근할 수 없다. [21-23]

Homework #1 1. C++에서 상속이란? 가상함수란? 2. 클래스 디자인 및 상속의 연습 최대한 자세히, 성실히, 자신의 언어를 이용하여 설명 실제 적절한 자신만의 예(example) 3가지를 만들어 설명 2. 클래스 디자인 및 상속의 연습 도형(shape) class를 정의하고, 이를 상속받아 사각형(rectangle), 원(circle) class를 정의하고, 각각의 특성에 맞는 draw()라는 함수를 정의해 본다. 각 클래스마다 소스파일과 헤더파일을 각각(!) 만든다. 동작하는 code를 제출

Homework #1 클래스 상속의 연습 MyShape Class 정의하기 MyRect Class 정의하기 맴버변수: float _x,_y 생성자: MyShape(float x, float y)  _x와 _y의 값을 설정 맴버함수: void Draw() const 아래와 같은 내용 출력 [SHAPE] position = ( ‘_x값’, ‘_y값’ ) MyRect Class 정의하기 MyShape Class로부터 상속 맴버변수: float _width, _height 생성자: MyRect(float x, float y, float w, float h) 아래와 같은 내용 출력 [RECTANGLE] position = ( ‘_x값’, ‘_y값’), size = (‘_width’, ‘_height’)

Homework #1 클래스 상속의 연습 MyCircle Class 정의하기 MyShape Class로부터 상속 맴버변수: float _radius 생성자: MyCircle(float x, float y, float radius) 맴버함수: void Draw() const 아래와 같은 내용 출력 [CIRCLE] position = ( ‘_x값’, ‘_y값’), radius = ‘_radius’

Homework #1 클래스 상속의 연습의 test - 다음과 같은 main 함수를 이용 int main() { MyShape* shapes[5] = {NULL}; shapes[0] = new MyCircle( 100, 100, 50); shapes[1] = new MyRect( 300, 300, 100, 100); shapes[2] = new MyRect( 200, 100, 50, 150); shapes[3] = new MyCircle(100, 300, 150); shapes[4] = new MyRect( 200, 200, 200, 200); for (int i = 0; i < 5; ++i) shapes[i]->Draw(); delete shapes[i]; shapes[i] = NULL; } return 0;

Homework #1 클래스 디자인 및 상속의 연습 아래와 같은 결과가 나오도록 클래스를 디자인하라

Homework #1 제출 방법: Moodle 제출 (moodle.sejong.ac.kr) 다음주 월요일 자정 (3월 21일 23:99)까지 1. 리포트 제출: 전자문서(pdf, 또는 doc) 1번과 2번에 대해 최대한 자세히 성실히. 2번의 경우 자신의 시행 착오 과정 및 작성 코드에 대한 자세한 설명을 할 것 2. Code 제출: Project file + source codes를 zip으로 압축하여 제출 (디버그 폴더를 지우고 제출) 테스트 시 build가 안되면 점수 없음 Visual Studio .NET 2003, 2005, 2010

Homework #1 친구들과 활발한 토의와 토론은 권장 단, 보고서나 코딩은 스스로 할 것 보고서나 code 의 Copy 적발 시 원본 제공자와 복사자 모두 숙제 점수 -100%

classes Look into the codes

VC++ Framework CFrameWnd CChildView 윈도우의 프레임(틀)을 관리 데이터를 보여주는 윈도우 CWinApp : 위의 두 오브젝트를 묶어 주고, 프로그램을 구동 시킴(눈에 안보임) 메시지 루프를 돌림

프로그램 내부 구조 theApp (CSimpleApp : CWinApp) m_pMainFrame (CMainFrame : CFrameWnd) m_wndView (CChildView : CWnd)

응용 프로그램 실행순서 CSimpleApp theApp; WinMain() // MFC 내부에 숨겨짐 { theApp.InitInstance(); // 초기화 theApp.Run(); // 메시지 루프 theApp.ExitInstance(); // 종료 }

응용 프로그램 클래스 (1/4) // Simple.h class CSimpleApp : public CWinApp { virtual BOOL InitInstance(); afx_msg void OnAppAbout(); DECLARE_MESSAGE_MAP() };

응용 프로그램 클래스 (2/4) MFC 기본 header file을 모아놓음 #include "stdafx.h" #include "simple.h" #include "MainFrm.h“ // Simple.cpp BEGIN_MESSAGE_MAP(CSimpleApp, CWinApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) END_MESSAGE_MAP() CSimpleApp::CSimpleApp() { } CSimpleApp theApp; MFC 기본 header file을 모아놓음 // 응용프로그램 자신에 해당하는 전역객체

응용 프로그램 클래스 (3/4) BOOL CSimpleApp::InitInstance() { SetRegistryKey(_T("Local AppWizard-Generated Applications")); CMainFrame* pFrame = new CMainFrame; m_pMainWnd = pFrame; pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); return TRUE; }

응용 프로그램 클래스 (3/4) BOOL CSimpleApp::InitInstance() { SetRegistryKey(_T("Local AppWizard-Generated Applications")); CMainFrame* pFrame = new CMainFrame; m_pMainWnd = pFrame; pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); return TRUE; } 61

응용 프로그램 실행순서 CSimpleApp theApp; WinMain() // MFC 내부에 숨겨짐 { theApp.InitInstance(); // 초기화 theApp.Run(); // 메시지 루프 theApp.ExitInstance(); // 종료 }

응용 프로그램 클래스 (4/4) // 대화상자 관련 클래스 선언 및 정의 부분 - 생략 // ... void CSimpleApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); }

VC++ Framework CFrameWnd CChildView 윈도우의 프레임(틀)을 관리 데이터를 보여주는 윈도우 CWinApp : 위의 두 오브젝트를 묶어 주고, 프로그램을 구동 시킴(눈에 안보임) 메시지 루프를 돌림

프레임 윈도우 클래스 (1/5) // MainFrm.h class CMainFrame : public CFrameWnd { protected: DECLARE_DYNAMIC(CMainFrame) virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo); virtual ~CMainFrame(); CChildView m_wndView; afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnSetFocus(CWnd *pOldWnd); DECLARE_MESSAGE_MAP() };

프레임 윈도우 클래스 (2/5) // MainFrm.cpp IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_WM_SETFOCUS() END_MESSAGE_MAP() CMainFrame::CMainFrame() { } CMainFrame::~CMainFrame()

프레임 윈도우 클래스 (3/5) int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL)) TRACE0("Failed to create view window\n"); } return 0;

프레임 윈도우 클래스 (4/5) BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.lpszClass = AfxRegisterWndClass(0); return TRUE; }

프레임 윈도우 클래스 (4/5) struct CREATESTRUCT{ LPVOID lpCreateParams; HINSTANCE hInstance; HMENU hMenu; HWND hwndParent; int cy; int cx; int y; int x; LONG style; LPCTSTR lpszName; LPCTSTR lpszClass; DWORD dwExStyle; }; 69

프레임 윈도우 클래스 (5/5) void CMainFrame::OnSetFocus(CWnd* pOldWnd) { m_wndView.SetFocus(); } BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

VC++ Framework CFrameWnd CChildView 윈도우의 프레임(틀)을 관리 데이터를 보여주는 윈도우 CWinApp : 위의 두 오브젝트를 묶어 주고, 프로그램을 구동 시킴(눈에 안보임) 메시지 루프를 돌림

뷰 클래스 (1/4) // ChildView.h class CChildView : public CWnd { public: protected: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual ~CChildView(); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() };

뷰 클래스 (2/4) // ChildView.cpp CChildView::CChildView() { } BEGIN_MESSAGE_MAP(CChildView,CWnd ) ON_WM_PAINT() END_MESSAGE_MAP()

뷰 클래스 (3/4) BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) { if (!CWnd::PreCreateWindow(cs)) return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; cs.lpszClass = AfxRegisterWndClass ( CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, ::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL); return TRUE; } Style: http://msdn2.microsoft.com/en-us/library/ms632600(VS.85).aspx ExStyle: http://msdn2.microsoft.com/en-us/library/ms632680(VS.85).aspx System Color: http://msdn2.microsoft.com/en-us/library/ms724371.aspx

뷰 클래스 (4/4) void CChildView::OnPaint() { CPaintDC dc(this); dc.TextOut(100, 100, _T("안녕하세요.“)); }

요약 클래스 종류 베이스 클래스 이름 핵심 함수 - 주 역할 응용 프로그램 CWinApp InitInstance() - 프레임 윈도우를 생성한다. Run() - 메시지 루프를 제공한다. 프레임 윈도우 CFrameWnd OnCreate() - 뷰를 생성한다. 뷰 CWnd OnPaint() - 화면에 출력한다.

Announcement 연습시간 수요일 오후 (6:00~7:30) 장소: 율304호 실습실