Presentation is loading. Please wait.

Presentation is loading. Please wait.

Department of Digital Contents Sang Il Park

Similar presentations


Presentation on theme: "Department of Digital Contents Sang Il Park"— Presentation transcript:

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

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

3 간단한 메시지 기반 프로그래밍의 예 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

4 좀 더 멋있게… 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;

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

6 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;

7 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;

8 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;

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

10 MFC ?

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

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

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

14 MFC 프로그램 만들어 보기

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

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

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

18 Look into the codes

19 C++? CLASS?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

42 인자가 있는 생성자 인자가 있는 생성자의 추가 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();

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

44 객체의 동적인 생성 동적 메모리 할당을 사용해서 객체를 생성하는 예 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;

45 접근 권한 설정하기(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; } 멤버의 접근 권한을 설정하는 예

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

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

48 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’)

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

50 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;

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

52 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

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

54 classes Look into the codes

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

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

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

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

59 응용 프로그램 클래스 (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을 모아놓음 // 응용프로그램 자신에 해당하는 전역객체

60 응용 프로그램 클래스 (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 응용 프로그램 클래스 (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

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

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

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

65 프레임 윈도우 클래스 (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() };

66 프레임 윈도우 클래스 (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()

67 프레임 윈도우 클래스 (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;

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

69 프레임 윈도우 클래스 (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

70 프레임 윈도우 클래스 (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);

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

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

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

74 뷰 클래스 (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: ExStyle: System Color:

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

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

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


Download ppt "Department of Digital Contents Sang Il Park"

Similar presentations


Ads by Google