Presentation is loading. Please wait.

Presentation is loading. Please wait.

Windows Programming 시작하기

Similar presentations


Presentation on theme: "Windows Programming 시작하기"— Presentation transcript:

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

2 Windows 프로그램의 개념 윈도우 프로그래밍이란? Windows 프로그램 vs. DOS 프로그램 ??
사용자가 발생시키는 이벤트에 대한 메시지를 처리하는 것 메시지 기반 (Message Driven) 프로그래밍 이벤트 기반 (Event Driven) 프로그래밍 Windows 프로그램 vs. DOS 프로그램 ??

3 GUI Programming? 이벤트가 발생되었을 때 이를 처리하는 방법을 알려 주는 것 이벤트 핸들러 이벤트 발생

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

5 코딩 예 #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: }

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

7 코딩 예 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

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

9 Win32 Program의 구조

10 Win32 ? (= Windows API) 프로그래밍의 과정은 無에서 시작하지 않고 다른 사람들이 잘 만들어놓은 확장된 기능들을 이용하여 원하는 기능을 구현한다. 확장된 기능(데이터타입, 구조체, 함수들)을 모아놓은 것을 library라고 한다. EX.) 그림을 화면에 표시하기 위한 함수들 (Library) 소리를 내기 위한 함수들(Library) API Win32 윈도우에서 돌아가는 프로그램을 만들기 위한 기능들을 모아놓은 가장 기본적인 library Ex.) 창만들기, 버튼 달기, 메뉴만들기 등…

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

12 Win32 Project 만들어 보기 FileNewProject  Win32 Project 선택

13 실행결과

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

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

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

17 약간 변경하기… (WinProc) 추가! 추가! case IDM_ABOUT:
MessageBox(hWnd, _T("haha"), _T(“Test!"), MB_OK); DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; 추가! 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); break; 추가!

18 실행결과

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

20 MFC ?

21 윈도우 응용 프로그램 개발 도구 (1/3) API(Application Programming Interface) 기반 장점
운영체제가 응용 프로그램을 위해 제공하는 각종 함수의 집합 장점 세부적인 제어가 가능하고, 윈도우 운영체제가 제공하는 모든 기능을 사용할 수 있다. 생성 코드의 크기가 작고 속도가 빠르다. 단점 생산성이 낮다.

22 윈도우 응용 프로그램 개발 도구 (2/3) RAD(Rapid Application Development) 장점 단점
시각적으로 화면을 디자인하고 코드를 추가하는 방법으로 프로그램을 빠르게 개발 Visual Basic, Delphi 등 장점 생산성이 높다. 단점 일반적으로 생성 코드의 크기가 크고 실행 속도가 느리다. 운영체제가 제공하는 모든 기능을 활용한 세부적인 제어가 어렵다.

23 윈도우 응용 프로그램 개발 도구 (3/3) MFC (Microsoft Foundation Class Library) 기반 장점
API 중 많이 사용되는 기능들을 사용하기 쉽게 잘 포장해 놓은 것 객체 지향 언어를 이용하여 클래스로 제공 장점 API 직접 이용 보다 생산성이 높다. RAD보다 생성 코드의 크기가 작고 실행 속도가 빠르다. 단점 초기 학습에 필요한 기간이 길다. 객체 지향 언어 클래스 라이브러리 구조와 기능, 각 클래스의 관계 파악

24 MFC 프로그램 만들어 보기

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

26 MFC 응용 프로그램 생성 (1/8) 프로젝트 종류 선택

27 MFC 응용 프로그램 생성 (2/8) AppWizard 1단계

28 MFC 응용 프로그램 생성 (3/8) AppWizard 2단계

29 MFC 응용 프로그램 생성 (4/8) AppWizard 3단계

30 MFC 응용 프로그램 생성 (5/8) AppWizard 4단계

31 MFC 응용 프로그램 생성 (6/8) AppWizard 5단계

32 MFC 응용 프로그램 생성 (7/8) 생성된 프로젝트와 클래스들

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

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

35 정리 - Application Wizard
AppWizard 기능 만들고자 하는 기본적인 프로젝트를 생성 해주고 그 안에 필요한 클래스 생성 클래스에 기본적인 내용을 코딩 기본적인 코딩시간을 절약 하므로 빠른 프로젝트 완성 AppWizard사용 도중 실수로 옵션을 선택하지 않았을 경우 소스에서 새로 추가할 수 있다.

36 정리 - Project Workspace 프로젝트 워크스페이스의 구성 MFC 클래스를 상속 받아 탄생된 새로운 클래스
클래스 소스가 설정되어 있는 파일들 소스파일 cpp 헤더 파일 h 프로그램에 필요한 메뉴, 아이콘, 문자열, 대화상자 같은 자원

37 정리 - Project Workspace 프로젝트 워크스페이스의 항목별 설명 프로젝트에 설정되어 있는 클래스별로 출력,
해당 항목을 선택하면 수정 가능 ClassView 프로젝트에 설정되어 있는 파일 리스트 출력, 해당 항목을 선택하여 수정 가능 Solution Explore (=FileView) 프로젝트에 설정되어 있는 메뉴, 대화 상자, 문자열, 아이콘, 비트맵 등 자원의 리스트 출력, 해당 항목 선택 수정 가능 ResourceView 내 용 항 목

38 정리 - Project Workspace Class View 화면
해당 항목을 더블 클릭하면 클래스 헤더가 나타나고 우측 버튼을 클릭하면 해당 클래스에 함수나 변수, 이벤트를 설정하도록 메뉴 등장 해당 클래스의 멤버 함수와 멤버 변수의 리스트 +버튼을 클릭한 상태에서 해당 항목(변수)을 클릭하면 해당 항목이 설정되어 있는 소스 파일로 이동 protected 형태로 설정되어 있을 경우(열쇠) protected 형태로 설정되어 있지 않을 경우는 열쇠 아이콘이 나타나지 않음

39 정리 - Project Workspace Resource View 화면
엑셀레이터(핫키 정의) 키값을 정의하는 항목 대화 상자(어떤 형태의 대화 상자의 출력할 폼을 만들어서 저장) 자원들 아이콘 자원 메뉴 자원 문자열 테이블 툴바

40 정리 - Project Workspace 솔루션 탐색기(File View) 화면 소스 파일 헤더 파일 자원 파일

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

60 뷰 클래스 (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:

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

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

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

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

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

66 MFC 구성 요소 (1/2) 구성 요소 CObject 파생 클래스: 188개 MFC 클래스 나머지: 40개
매크로와 전역 변수 및 전역 함수

67 MFC 구성 요소 (2/2) MFC클래스의 기본 구조 MFC의 계층적 구조 형태 CObject CCmdTarget CWnd
CWinThread CDocument 기타 CWinApp ► CMainFrame 과 Cview클래스는 CWnd에서 상속받음

68 MFC Application Architecture
CObject CCmdTarget CWnd CWinThread CDocument 기타 CWinApp CObject 클래스 (최상위 클래스) 메모리에 클래스를 설정하는 기능 클래스를 할당하기 위한 new연산자가 오버로딩 클래스의 기능과 종류를 알 수 있는 함수가 있음 CObject MFC class1 MFC class3 MFC class2

69 MFC Application Architecture
CObject 의 기본 기능 서비스 이름 기능 실행 시간 클래스 정보 프로그램 실행 중 객체 정보를 알아낸다. 동적 객체 생성 객체를 동적으로 생성한다. 직렬화 (serialize) 객체를 저장하거나 읽어 들인다. 타당성 점검 객체 상태를 점검한다. 집합 클래스와의 호환성 서로 다른 클래스 객체를 집합 클래스에 저장할 수 있도록 한다.

70 MFC Application Architecture
CObject 포인터를 저장할 수 있는 MFC가 제공하는 집합 클래스 종류 클래스 이름 배열 CObArray, CArray(템플릿 클래스) 리스트 CObList, CList(템플릿 클래스) CMapWordToOb, CMapStringToOb, CMap(템플릿 클래스)

71 MFC Application Architecture
CCmdTarget클래스 메시지 전송 및 처리를 담당하는 클래스들의 기본 클래스 예) Cview, CWinApp, Cdocument, CWnd, CFrameWnd CObject CCmdTarget CWnd CWinThread CDocument 기타 CWinApp 윈도우 시스템 Application 이벤트 발생 메시지 전송 메시지 처리 화면에 출력

72 MFC Application Architecture
CWnd클래스 화면에 보이는 윈도들은 모두 CWnd 에서 상속 받음 가장 많이 사용되는 클래스 윈도우의 최상위 클래스 주로 CWnd에서 상속된 다른 클래스(예: CView 등)를 사용 윈도우를 구동하는 모든 기능을 가진 함수가 있다. Initialization Window State Functions Window Size and position Coordinate Mapping Functions Window Message Functions …….. CObject CCmdTarget CWnd CWinThread CDocument 기타 CWinApp

73 CWnd를 상속 받은 클래스들 CWnd CFrameWnd 프레임 형태의 윈도우 CControlBar 컨트롤 바
CObject CCmdTarget CWnd CWinThread CDocument 기타 CWinApp CWnd CFrameWnd 프레임 형태의 윈도우 CControlBar 컨트롤 바 CPropertySheet 프로퍼티 시트 CDialog 대화 상자 CView View 윈도우 Control class 컨트롤 들

74 MFC Application Architecture
CObject CCmdTarget CWnd CWinThread CDocument 기타 CWinApp CWndThread 클래스 윈도우가 스레드로 돌아갈 수 있도록 구동 되는 클래스 스레드는 독립적인 형태로 구동 되는 하나의 모듈 한 개의 프로그램을 독립적으로 움직이려면 한 개의 프로그램은 한 개 이상의 CWinThread를 포함해야 한다 Multi-tasking이 가능 CWndApp 클래스 한 개의 프로그램을 포함하고 관장하는 클래스

75 MFC Application Architecture
CDocument 클래스 데이터를 디스크에서 읽어 들이거나 디스크에 저장하는 부분을 담당하는 클래스 나중에 다른 프로그램에서 재사용이 용이 CObject CCmdTarget CWnd CWinThread CDocument 기타 CWinApp

76 VC++ Framework CFrameWnd CView CDocument CMainFrame CProgramView
CProgramDoc 윈도우의 프레임(틀)을 관리 데이터를 보여주는 윈도우 데이터를 저장, 처리 (눈에 안보임) CWinApp : 위의 세 오브젝트를 묶어 주고, 프로그램을 구동 시킴(눈에 안보임) 메시지 루프를 돌림 CProgramApp

77 CWinApp 클래스 윈도우 프로그램의 동작 방식 윈도우 프로그램은 사용자가 취하는 동작에 반응하여, 해당 기능을 수행
평상시에는 아무 동작을 하지 않음 마우스를 클릭하였을 경우 특정 작업 수행 키보드가 눌려졌을 경우 특정 작업 수행 메시지 구동 방식을 취함 윈도우 운영체제는 사용자의 모든 동작을 감지하여 메시지 형태로 프로그램에 전달 사용자가 키보드를 누르면 어떤 키보드가 눌렸다는 메시지 마우스를 움직이면 어느 좌표에서 마우스가 움직였다는 메시지 메뉴나 버튼이 눌려지면 어떠한 메뉴나 버튼이 눌렸다는 메시지

78 메시지와 메시지 핸들러의 예 마우스의 왼쪽 버튼 클릭  메시지 박스 Popup

79 CView에 메시지 헨들러 추가하기

80 추가된 메시지 핸들러

81 추가된 메시지 핸들러 편집

82 연습 마우스 오른쪽 버튼 클릭  메시지 박스 Popup

83 MFC 구성 요소 구성 요소 CObject 파생 클래스: 188개 MFC 클래스 나머지: 40개 (※MFC 6.0 기준)
매크로와 전역 변수 및 전역 함수

84 MFC 전역 함수 함수 이름 기능 AfxMessageBox() 메시지 상자를 표시한다. AfxGetApp()
응용 프로그램 객체의 주소를 리턴한다. AfxGetMainWnd() 메인 윈도우 객체의 주소를 리턴한다. AfxGetAppName() 응용 프로그램의 이름을 리턴한다. AfxGetInstanceHandle() 인스턴스 핸들을 리턴한다. AfxBeginThread() 스레드를 시작한다. AfxEndThread() 스레드를 종료한다. 함수 이름 기능 AfxMessageBox() 메시지 상자를 표시한다. AfxGetApp() 응용 프로그램 객체의 주소를 리턴한다. AfxGetMainWnd() 메인 윈도우 객체의 주소를 리턴한다. AfxGetAppName() 응용 프로그램의 이름을 리턴한다. AfxGetInstanceHandle() 인스턴스 핸들을 리턴한다. AfxBeginThread() 스레드를 시작한다. AfxEndThread() 스레드를 종료한다.

85 AfxMessageBox() 사용 예 void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { AfxMessageBox("마우스를 클릭했습니다."); }

86 매크로 단계 매크로 이름 사용 목적 사용 위치 1 DECLARE_DYNAMIC 실행 시간 클래스 정보 클래스 선언부 (*.H)
IMPLEMENT_DYNAMIC 클래스 정의부 (*.CPP) 2 DECLARE_DYNCREATE 실행 시간 클래스 정보, 동적 객체 생성 IMPLEMENT_DYNCREATE 3 DECLARE_SERIAL 동적 객체 생성, 직렬화 IMPLEMENT_SERIAL

87 집에 가서… 교재 1장 읽어보기 특히 page 55~67

88 Announcement 연습시간 선호시간대 조사
홈페이지의 수업게시판 이용 ( 월요일 오후 (6:00~) 화요일 오후 (6:00~) 수요일 오후 (6:00~) 목요일 오후 (6:00~)


Download ppt "Windows Programming 시작하기"

Similar presentations


Ads by Google