Microsoft PowerPoint - hci2-lecture1.ppt

Similar documents
<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - hci2-lecture1.ppt

MFC 프로그래밍

1장 윈도우 프로그래밍 들어가기

5장 MFC기반 다지기

Microsoft PowerPoint - 04windows.ppt

윈도우 프로그래밍

PowerPoint 프레젠테이션

Chapter 1. MFC 시작하기

<33372DC0A9B5B5BFECC7C1B7CEB1D7B7A1B9D62E687770>

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

윈도우즈 프로그래밍

<312DBED5BACEBCD328B8D3B8AEB8BB2CB8F1C2F7292DBCF6C1A42E687770>

4S 1차년도 평가 발표자료

Microsoft PowerPoint - hci2-lecture5-messagemap.ppt

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

04장 메시지 처리 유형

윈도우시스템프로그래밍

歯Lecture2.PDF

[제1강] 텍스트를 입력하세요

슬라이드 1

Visual C++의 개요

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - CPP_chap3

윈도우즈 프로그래밍

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Microsoft PowerPoint - 09-CE-7-선과 도형

Chapter #01 Subject

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint Presentation

Microsoft PowerPoint - hci2-lecture3.ppt

유저영역후킹탐지시스템 팀 명 : D.N.F (Do Not Fishing) 지도교수 : 유승재교수님 팀 장 : 신동순 팀 원 : 서현찬이치목 중부대학교정보보호학과

Microsoft PowerPoint - hci2-lecture3.ppt

Microsoft PowerPoint - 09-CE-14-리스트콤보박스

쉽게 풀어쓴 C 프로그래밍

예제와 함께 배워보는 OllyDbg사용법

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

untitled

17장 클래스와 메소드

DLL(Dynamic Linked Library)

C# Programming Guide - Types

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

PowerPoint Presentation

2014 년정보보호졸업작품보고서 파일유출방지시스템 지도교수님 : 양환석교수님 팀명 : LKC Security 팀원 : 이호영, 김상우, 최유택 중부대학교정보보호학과

VISLAB 박제강 1. 시작하기전에영상관련알고리즘을개발하는과정에서작성한프로그램을테스트하고피드백하는작업은빈번하게발생한다. 이때기존콘솔 (Console) 형태로작성된프로그램의경우테스트작업을유동적으로조절할수없기때문에작업의효율이떨어진다. 반면 GUI(Graphical Use

PowerPoint 프레젠테이션

제8장 자바 GUI 프로그래밍 II

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Template

슬라이드 1

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

금오공대 컴퓨터공학전공 강의자료

윈도우시스템프로그래밍

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

PowerPoint Presentation

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - chap01-C언어개요.pptx

초보자를 위한 C# 21일 완성

슬라이드 1

PowerPoint Presentation

OCW_C언어 기초

<4D F736F F D D31312D30312D53572D30312DBBE7BFEBC0DABCB3B8EDBCAD5FBFDCBACEB9E8C6F7BFEB2E646F63>

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - CSharp-10-예외처리

어댑터뷰

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

Microsoft PowerPoint - CPP_chap1

PowerPoint Presentation

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Microsoft PowerPoint - C++ 5 .pptx

11장 포인터

개요 1. 후킹이란? 후킹의정의.. 2 후킹의종류 2 앞으로 후킹프로그램을위한사전지식들 Window 에서 data 입력과정.. 3 DLL ( Dynamic Link Library ).. 4 메시지후킹을위해필요한지식들 5 3. 후킹프로그램제작에필요한 API

C++ Programming

Design Issues

<4D F736F F F696E74202D203039C0E520B4EBC8ADBBF3C0DA205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D203036C0E520BBE7BFEBC0DA20C0CEC5CDC6E4C0CCBDBA205BC8A3C8AF20B8F0B5E55D>

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

BMP 파일 처리

PowerPoint Presentation

Frama-C/JESSIS 사용법 소개

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

슬라이드 1

PowerPoint 프레젠테이션

슬라이드 1

JVM 메모리구조

설계란 무엇인가?

PCServerMgmt7

Microsoft PowerPoint - chap10-함수의활용.pptx

윈도우즈 프로그래밍

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

윈도우시스템프로그래밍

C++ Programming

UI TASK & KEY EVENT

Programming hwp

Transcription:

Overview 윈도우프로그래밍기초 윈도우운영체제와윈도우응용프로그램의특징이해 SDK 응용프로그램작성과정, 기본구조, 동작원리이해 MFC 응용프로그램작성과정, 기본구조, 동작원리이해 HCI Programming 2 (321190) 2008년가을학기 9/16/2008 박경신 2 Windows.NET 구조적프로그램에서객체지향프로그램으로 SDK(Software Development Kit): 운영체제가응용프로그램에제공하는서비스로 C언어함수의집합형태 MFC(Microsoft Foundation Class): SDK를객체지향적으로포장 ATL(Active Template Library): 분산환경컴포넌트개발 윈도우운영체제특징 그래픽사용자인터페이스 (Graphical User Interface, GUI) 일관성있는사용자인터페이스 4

윈도우운영체제특징 메시지구동구조 (Message-driven Architecture) 윈도우시스템메시지큐 이벤트발생 응용프로그램메시지큐 #3 대기 처리 윈도우운영체제특징 멀티태스킹 (Multi-Tasking) 하나의윈도즈시스템에서여러개의응용프로그램을수행 응용프로그램사이의상호작용가능 멀티스레딩 (Multi-Threading) 하나의응용프로그램에여러개의실행흐름을생성 장치에독립적 장치드라이버 (Device Driver) 에의해주변장치들을제어 응용프로그램메시지큐 #2 처리 응용프로그램메시지큐 #1 5 6 윈도우운영체제 윈도우시스템구성모듈 구분 Win32 API 역할 커널모듈 KERNEL32.DLL 윈도우시스템의주요부분으로메모리관리, 파일입출력, 프로그램의로드와실행등운영체제의기본기능수행 윈도우운영체제 & 윈도우응용프로그램 Windows Application Program Windows Operating System (Win32 API) GDI32.DLL USER32.DLL KERNEL32.DLL GDI 모듈 사용자인터페이스모듈 GDI32.DLL USER32.DLL 화면이나프린터와같은장치의출력을관리. ( 펜, 브러쉬, 폰트, 비트맵, 팔레트등관리 ) 윈도우, 다이얼로그, 메뉴, 커서, 아이콘등과같은사용자인터페이스객체들을관리 display.drv printer.drv keyboard.drv mouse.drv Device Driver 7 Hardware 8

윈도우응용프로그램특징 API 호출문집합 API(Application Programming Interface) - 윈도우운영체제가응용프로그램을위해제공하는각종함수집합 응용프로그램 call API#1 call API#2 call API#3 call API#4 call API#n 9 윈도우응용프로그램특징 메시지핸들러집합 메시지핸들러 (Message Handler) - 메시지를받았을때동작을결정하는코드 키보드, 마우스, 메뉴, 등등 윈도우프로시저 (Window Procedure) 이러한메시지핸들러의집합 응용프로그램 메시지핸들러 #1 메시지핸들러 #2 메시지핸들러 #3 메시지핸들러 #4 메시지핸들러 #5 메시지핸들러 #6 윈도우프로시저 : 메시지핸들러집합 10 윈도우응용프로그램특징 실행파일과 DLL 집합 DLL(Dynamic-Link Library): 프로그램이실행중에호출할수있는함수 ( 코드 ) 와리소스 윈도우응용프로그램특징 장치독립적 윈도우시스템의 API를사용하여간접적으로주변장치들을제어응용프로그램 API 장치드라이버주변장치 응용프로그램 실행파일 DLL #1 DLL #2 DLL #3 DLL #4 DLL #5 11 12

윈도우응용프로그램개발도구 SDK (Software Development Kit) C 언어로윈도우 API 를직접호출해서프로그램을구현 예, WIN32 API 장점 API 를직접다루기때문에세부적인제어가가능하고, 윈도우운영체제가제공하는모든기능을사용할수있다. 생성코드의크기가작고속도가빠르다. 단점 생산성이낮다. 윈도우응용프로그램개발도구 RAD (Rapid Application Development) 시각적으로화면을디자인하고코드를추가하는방법으로프로그램을빠르게개발 예, Visual Basic, Delphi 장점 생산성이높다. 단점 일반적으로생성코드의크기가크고실행속도가느리다. 운영체제가제공하는모든기능을활용한세부적인제어가어렵다. RAD 예 -Visual Basic 13 14 윈도우응용프로그램개발도구 클래스라이브러리 (Class Library) 윈도우응용프로그램개발에필수적인기능을객체지향언어를이용하여클래스로제공 예, MFC (Microsoft Foundation Class Library), 볼랜드 OWL (Object Windows Library) 장점 SDK보다생산성이높다. RAD보다생성코드의크기가작고실행속도가빠르다. 단점 초기학습에필요한기간이길다. 객체지향언어, C++ 클래스라이브러리구조와기능, 각클래스의관계파악 윈도우응용프로그램, 윈도우시스템, 도구 Application Program ( 메모장 ( 메모장,, 계산기계산기..)..) MFC MFC (C++ (C++ class class library) Win32 Win32 API API (C (C library) Operating System(Windows XP, XP,..)..) Device Device Driver Driver (drv, (drv, dll, dll,..)..) H/W H/W (monitor, printer, keyboard,..)..) 15 16

Win32 SDK 윈도우프로그램구조 WinMain 함수 윈도우클래스구조정의및등록 윈도우클래스 (WNDCLASS) - 윈도우기본틀에대한정보 ( 배경화면, 커서모양, 아이콘, 메뉴등 ) 을정의하기위한구조체 메인윈도우생성및출력 윈도우클래스로부터인스턴스생성 메시지루프 윈도우시스템으로부터들어오는메시지를분석하고처리 메시지큐에서메시지를하나씩꺼내어처리하기위한반복문 응용프로그램이종료될때까지반복 Event & Message Event 사용자의물리적조작에의해발생 ( 마우스클릭, 키보드입력 ) 윈도우시스템, 응용프로그램자체에서발생 Message 이벤트발생시윈도우시스템이감지하여메시지로변환 윈도우시스템은해당응용프로그램으로메시지전달 메시지는각이벤트에대한표준화된상수값 winuser.h 에정의 WinProc 함수 윈도우시스템으로부터받은메시지를처리하는함수 윈도우시스템에서호출하는함수 (call back) 17 18 Handle 사용중인객체를식별하는고유번호 (32비트정수형 ) 윈도우시스템에서부여데이터타입의미 Instance 인스턴스는실제메모리상에할당된객체 윈도우프로그램에는코드영역에대한모듈인스턴스와데이터영역에대한데이터인스턴스존재 HINSTANCE HWND HDC HCURSOR HICON HMENU 프로그램에대한핸들윈도우에대한핸들디바이스컨텍스트에대한핸들커서에대한핸들아이콘에대한핸들메뉴에대한핸들 Module instance Data instance1 Data instance2 19 Memory 20

Device Context 출력에필요한정보를위한구조체 출력정보 : 폰트, 색상, 무늬, 굵기, 출력방법등 출력장치를제어하는 GDI (Graphic Device Interface) 함수호출시사용 //DC 사용예 Resource 사용자인터페이스를구성하는자원들의정적데이터 메뉴, 아이콘, 커서, 다이얼로그등 리소스스크립트 (Resource Script) 에의해정의 (.RC) 리소스는프로그램코드와분리하여작성되며자체컴파일 (RC.exe) 과정으로생성된리소스파일 (.RES) 은링크시통합 HDC hdc= getdc(hwnd); // 현재윈도우로부터 DC 얻어옴 // 각종출력문 *.h *.cpp *.obj TextOut(hdc, 100,100, Beautiful world, 20); // 문자열출력 Rectangle(hdc, 30,40,60,70); // 사각형그리기 LineTo(hdc, 0, 200); // 라인그리기 ReleaseDC(hWnd, hdc) //DC 해제 21 *.ico *.bmp *.rc resource.h *.res *.exe 22 HelloSDK 예제작성 프로젝트생성 HelloSDK 예제작성 1 단계옵션설정 23 24

HelloSDK 예제작성 1 단계옵션설정 HelloSDK 예제작성 소스파일추가 25 26 HelloSDK 예제작성 코드입력 HelloSDK 예제작성 코드입력 #include <windows.h> // WinMain( ) 함수에서참조하므로함수원형을선언한다. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 27 int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) // 윈도우클래스를초기화하고운영체제에등록한다. wndclass.style = CS_HREDRAW CS_VREDRAW; wndclass.lpfnwndproc = WndProc; wndclass.cbclsextra = 0; wndclass.cbwndextra = 0; wndclass.hinstance = hinstance; 28

HelloSDK 예제작성 HelloSDK 예제작성 wndclass.hicon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hcursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrbackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszmenuname = NULL; wndclass.lpszclassname = "HelloClass"; if(!registerclass(&wndclass)) return -1; // 윈도우를생성하고화면에보이게한다. hwnd = CreateWindow("HelloClass", "HelloSDK Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL); ShowWindow(hwnd, ncmdshow); UpdateWindow(hwnd); 29 // 메시지대기열에서메시지를하나씩꺼내처리한다. while(getmessage(&msg, NULL, 0, 0) > 0) TranslateMessage(&msg); DispatchMessage(&msg); return msg.wparam; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) HDC hdc; PAINTSTRUCT ps; char *str = "Hello, SDK"; 30 HelloSDK 예제작성 HelloSDK 예제작성 // 메시지종류에따라응용프로그램이적절히처리한다. switch(message) case WM_CREATE: return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 100, 100, str, lstrlen(str)); EndPaint(hwnd, &ps); return 0; case WM_LBUTTONDOWN: MessageBox(hwnd, " 마우스를클릭했습니다.", " 마우스메시지 ", MB_OK); return 0; 31 case WM_DESTROY: PostQuitMessage(0); return 0; // 응용프로그램이처리하지않으면윈도우운영체제가처리한다. return DefWindowProc(hwnd, message, wparam, lparam); 32

HelloSDK 예제작성 프로젝트설정변경 HelloSDK 예제 F7 (Build Solution) -> F5 (Start Debugging) 실행화면 33 34 HelloSDK 예제분석 헤더파일 윈도우 API 함수의원형 Data type, 구조체, MACRO 상수들이선언 HelloSDK 예제분석 메인함수 WinMain WinMain() 프로그램을시작하는시작점 windef.h 안에 #define APIENTRY WINAPI라고지정되어있음 #include <windows.h> int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) 35 36

HelloSDK 예제분석 메인함수 WinMain HINSTANCE 는 Process ID ( 즉, Instance Handle) hinstance Win32 프로그램이실행될때시작되는주소값을가지고있는포인터변수 리소스를로드하는함수들이이주소값을참조해서리소스를참조 메모장을 2 개실행하는예 같은프로그램이지만할당되는 hinstance 는다름. 각각고유의값인 hinstance 로구분 hprevinstance 16-bit 윈도우의잔재로사용하지않음. NULL 처리 HelloSDK 예제분석 메인함수 WinMain LPSTR 는 32-bit pointer to a character string ( 즉, char *) lpcomline Command Line 명령행인자를담고있는문자열 HelloSDK TEST1.TXT TEST2.TXT 처럼프로그램을실행하면, lpcomline 은 TEST1.TXT TEST2.TXT 값을가짐 ncmdshow 프로그램이시작될때윈도우모양 ( 최대화면, 아이콘표시등 ) 결정 윈도우의최대, 최소, 정상상태로실행 ShowWindow() 함수호출시사용 int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) 37 int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) 38 HelloSDK 예제분석 HelloSDK 예제분석 메인함수 WinMain HWND Win32 프로그램안에서생성되거나사용되는모든윈도우를구별하거나사용하는데쓰임 hinstance가프로그램에하나씩할당하는반면, HWND는프로그램안의윈도우를다루기위하여다수의 HWND가존재 WNDCLASS 윈도우를생성하는데필요한다양한정보를담고있는구조체 CreateWindow() 함수를사용하기전에윈도우클래스를커널 (kernel) 에등록 int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) HWND hwnd; MSG msg; 윈도우클래스초기화와등록 WNDCLASS GetStockObject() 이용 StockObject 은윈도우가기본적으로제공해주는 GDI (Graphic Device Interface) object. 주로브러쉬와펜이사용됨. wndclass.style = CS_HREDRAW CS_VREDRAW; wndclass.lpfnwndproc = WndProc; // 윈도우프로시저함수주소정의 wndclass.cbclsextra = 0; wndclass.cbwndextra = 0; wndclass.hinstance = hinstance; wndclass.hicon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hcursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrbackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszmenuname = NULL; wndclass.lpszclassname = "HelloClass"; if(!registerclass(&wndclass)) return -1; WNDCLASS wndclass; 39 40

HelloSDK 예제분석 윈도우생성 CreateWindow 윈도우핸들 = CreateWindow( 지정된클래스이름, 윈도우캡션바에표시되는문자열, 윈도우스타일, 윈도우수평위치, 윈도우수직위치, 윈도우폭, 윈도우높이, 부모윈도의핸들, 메뉴핸들, 인스턴스핸들, WM_CREATE 메시지가윈도우프로시저에보내질때의 parameter); hwnd = CreateWindow("HelloClass", "HelloSDK Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL); ShowWindow(hwnd, ncmdshow); // 윈도우가화면에나타나게함 UpdateWindow(hwnd); // 윈도우프로시저가 WM_PAINT 메시지를처리하게함 HelloSDK 예제분석 메시지루프 메시지대기열 (Message Queue) 에서메시지를하나씩꺼내서처리 GetMessage - 메시지관리를위한구조체 Message Queue 에서메시지하나를꺼내서메시지변수에저장 Message 가 WM_QUIT 이면 0 을 return 하고 while loop 종료 GetMessage( message 관리구조체, 메시지핸들, 최소, 최대 ) TranslateMessage Keyboard 관련메시지를처리 DispatchMessage 해당메시지를 Window procedure 에보냄 while(getmessage(&msg, NULL, 0, 0) > 0) TranslateMessage(&msg); DispatchMessage(&msg); return msg.wparam; 41 42 HelloSDK 예제분석 윈도우프로시저 WndProc 윈도우메시지를처리하는핵심함수 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) hwnd 윈도우핸들. 어느윈도우가 window procedure 를호출했는지구분 message 구체적인메시지종류, WM_ 으로시작 wparam, lparam 메시지종류에따라부가적인정보전달 CALLBACK OS 나컴파일러환경에따라서파라미터나리턴값을넘겨주고넘겨받는방식을정하는 MACRO LRESULT long type 과동일 43 HelloSDK 예제분석 윈도우프로시저 WndProc LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) HDC hdc; PAINTSTRUCT ps; char *str = "Hello, SDK"; // 메시지종류에따라응용프로그램이적절히처리한다. switch(message) case WM_CREATE: return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); 44

HelloSDK 예제분석 HelloSDK 예제분석 요약 TextOut(hdc, 100, 100, str, lstrlen(str)); EndPaint(hwnd, &ps); // Device Context 해제 return 0; case WM_LBUTTONDOWN: MessageBox(hwnd, " 마우스를클릭했습니다.", " 마우스메시지 ", MB_OK); return 0; case WM_DESTROY: PostQuitMessage(0); // 메시지큐에 WM_QUIT가들어간다 return 0; // 응용프로그램이처리하지않으면윈도우운영체제가처리한다. return DefWindowProc(hwnd, message, wparam, lparam); 시스템메시지큐 이벤트발생 응용프로그램메시지큐 #3 응용프로그램메시지큐 #2 응용프로그램메시지큐 #1 응용프로그램 #1 메시지루프 윈도우프로시저 메시지핸들러 #1 메시지핸들러 #2 메시지핸들러 #3 DefWindowProc 45 46 WIN32 API 와 MFC MFC Win32 API 를이용해서프로그램을작성할경우코드의길이가매우길어지게되며, 어떠한부분에있어서는모든프로그래머들이반복적으로작성해야하는부분도있음. 이러한단점을보완하기위해서 Microsoft 의수많은개발자들이클래스기반의견고한코드를클래스화해서만든라이브러리임. C API C++ Class, OOP MFC MFC (Microsoft Foundation Class) SDK (Windows API) 의 WinMain() 함수의기능과 Window Procedure 기능을적절히분할하여 2 개의클래스제공 MFC CWinApp CFrameWnd 응용프로그램의초기화코드메시지루프, 종료코드등을제공 Frame window 의기능정의 47 응용프로그램자신만의특징을갖기위하여위의 2 클래스를그대로사용하지않고, OOP 의 inheritance 기능을이용 48

HelloMFC 예제작성 프로젝트생성 HelloMFC 예제작성 1 단계옵션설정 49 50 HelloMFC 예제작성 1 단계옵션설정 HelloMFC 예제작성 소스파일추가 51 52

HelloMFC 예제작성 코드입력 HelloMFC 예제작성 코드입력 #include <afxwin.h> // 클래스선언부 class CHelloApp : public CWinApp public: virtual BOOL InitInstance(); ; class CMainFrame : public CFrameWnd public: CMainFrame(); 53 54 HelloMFC 예제작성 HelloMFC 예제작성 protected: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nflags, CPoint point); DECLARE_MESSAGE_MAP() ; // 응용프로그램객체 CHelloApp theapp; // 클래스정의부 BOOL CHelloApp::InitInstance() m_pmainwnd = new CMainFrame; m_pmainwnd->showwindow(m_ncmdshow); m_pmainwnd->updatewindow(); return TRUE; CMainFrame::CMainFrame() Create(NULL, "HelloMFC Application"); void CMainFrame::OnPaint() char *msg = "Hello, MFC"; CPaintDC dc(this); 55 56

HelloMFC 예제작성 HelloMFC 예제작성 프로젝트설정변경 dc.textout(100, 100, msg, lstrlen(msg)); void CMainFrame::OnLButtonDown(UINT nflags, CPoint point) MessageBox(" 마우스를클릭했습니다.", " 마우스메시지 "); // 메시지맵 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() 57 58 HelloMFC 예제작성 HelloMFC 예제분석 F7 (Build Solution) -> F5 (Start Debugging) 실행화면 헤더파일 #include <afxwin.h> 클래스선언부 SDK 에서 #include <windows.h> 를 MFC 에서는 #include <afxwin.h> 로 class CHelloApp : public CWinApp public: virtual BOOL InitInstance(); ; 59 60

HelloMFC 예제분석 클래스선언부 class CMainFrame : public CFrameWnd public: CMainFrame(); protected: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nflags, CPoint point); DECLARE_MESSAGE_MAP() ; HelloMFC 예제분석 응용프로그램객체 모든 MFC 프로그램은 CWinApp 클래스에서하나의클래스를파생하고이클래스로부터하나의객체를전역변수로생성 WinMain 함수는 MFC 에서제공 CHelloApp theapp; MFC 응용프로그램의구조 하나의응용프로그램객체 여러종류의클래스선언및정의 61 62 HelloMFC 예제분석 클래스정의부 숨겨진 WinMain() 은프로그램이시작되면처음으로 InitInstance 함수를호출 초기화에사용 Virtual 함수로선언해야함 재정의하지않으면 CWinApp 에있는 InitInstance 가수행됨 ShowWindow() 에는윈도우핸들이존재하지않음 윈도우핸들을내부에숨기고있기때문에 BOOL CHelloApp::InitInstance() m_pmainwnd = new CMainFrame; m_pmainwnd->showwindow(m_ncmdshow); m_pmainwnd->updatewindow(); return TRUE; Class CHelloApp: public CWinApp public: virtual BOOL InitInstance(); HelloMFC 예제분석 클래스정의부 SDK 의 CreateWindow() 함수에상응하는역할 CMainFrame::CMainFrame() Create(NULL, "HelloMFC Application"); // 윈도우생성 ; 63 64

HelloMFC 예제분석 HelloMFC 예제분석 클래스정의부 void CMainFrame::OnPaint() char *msg = "Hello, MFC"; CPaintDC dc(this); // SDK 에서 WM_PAINT 역할 메시지맵 윈도우메시지와해당메시지핸들러를연결시키는 MFC 방법 ON_WM_PAINT() WM_PAINT 와 OnPaint() 를연결 ON_WM_LBUTTONDOWN() WM_LBUTTONDOWN 과 OnLButtonDown() 를연결 dc.textout(100, 100, msg, lstrlen(msg)); // SDK 에서 WM_LBUTTONDOWN 역할 void CMainFrame::OnLButtonDown(UINT nflags, CPoint point) MessageBox(" 마우스를클릭했습니다.", " 마우스메시지 "); BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() 65 66 HelloMFC 예제분석 숨겨진 MFC 의 WinMain WinMain( ) // MFC 의내부에숨겨진프로그램실행의시작점 // ptr 은포인터로서응용프로그램객체의주소값을가지고있다. ptr->initinstance( ); // 초기화 : 프레임윈도우객체를생성한다. // 프레임윈도우객체의생성자에서 // 실제윈도우가만들어진다. ptr->run( ); // 메시지루프 : 프레임윈도우에게메시지를보낸다. // 프레임윈도우가받은메시지의종류에따라 // 해당메시지핸들러가적절히호출된다. ptr->exitinstance( ); // 종료 : 각종청소작업을수행한다. 67 Coding Rules 변수표기법 의미있는단어의사용 멤버변수는 m_ 라는접두어추가 헝가리안표기법 접두어 b d h n p 또는 lp sz u w dw str clr 의미 BOOL 형변수 double 형변수 HANDLE 형변수 int 형변수 pointer 변수 NULL 문자로끝나는문자열 unsigned int 형변수 WORD(unsigned short 형변수 ) DWORD(unsigned long 형변수 ) CString 형변수 COLORREF m_lpszfilename m_ : 멤버변수 lp : 포인터변수 sz : 널로끝나는문자열 Filename: 파일이름

Windows Programming MSDN Reference 대표적인윈도우메시지 윈도우메시지 발생상황 메시지처리기 WM_CREATE WM_ACTIVATE WM_PAINT WM_MOUSEMOVE WM_COMMAND WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCILK WM_KEYDOWN WM_KEYUP WM_SIZE WM_MOVE WM_TIMER WM_DESTROY 윈도우가생성될때윈도우가활성화되거나비활성화될때윈도우가다시그려져야할때마우스커서가움직였을때사용자가메뉴등을명령으로내렸을때마우스왼쪽버튼을눌렀을때마우스왼쪽버튼을떼었을때마우스왼쪽버튼이더블클릭됐을때키보드가눌렸을때키보드가떼었을때윈도우의크기가변경되었을때윈도우가이동되었을때설정된타이머시간이다되었을때윈도우가없어질때 OnCreate OnActivate OnPaint OnMouseMove OnDestroy OnLButtonDown OnLButtonUp OnLButtonDblClk OnKeyDown OnKeyUp OnSize OnMove OnTimer OnDestroy 70 Windows API Reference MFC Reference 71 72

Practice HelloSDK 와 HelloMFC 프로그램을이용하여이름, 학과, 학번, 및자기소개를출력하는프로그램을작성하라 WM_PAINT 와 OnPaint 를비교한다 WM_LBUTTONDOWN 과 OnLButtonDown 를비교한다