500 likes | 685 Views
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다 . SDK 응용 프로그램 작성 과정 , 기본 구조 , 동작 원리를 이해한다 . MFC 응용 프로그램 작성 과정 , 기본 구조 , 동작 원리를 이해한다 . 비주얼 C++ 개발 환경 사용법을 익힌다. 윈도우 운영체제 특징 (1/3). 그래픽 사용자 인터페이스. 이벤트 발생. 대기. 시스템 메시지 대기열. 응용 프로그램 메시지 대기열 #3. 처리. 응용 프로그램 메시지 대기열 #2. 처리. 응용 프로그램 메시지 대기열 #1.
E N D
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다. SDK 응용 프로그램 작성 과정, 기본 구조, 동작 원리를 이해한다. MFC 응용 프로그램 작성 과정, 기본 구조, 동작 원리를 이해한다. 비주얼 C++ 개발 환경 사용법을 익힌다.
윈도우 운영체제 특징 (1/3) • 그래픽 사용자 인터페이스
이벤트 발생 ... 대기 시스템 메시지 대기열 응용 프로그램 메시지 대기열 #3 처리 응용 프로그램 메시지 대기열 #2 처리 응용 프로그램 메시지 대기열 #1 윈도우 운영체제 특징 (2/3) • 메시지 구동 구조
윈도우 운영체제 특징 (3/3) • 멀티태스킹 • 여러 개의 응용 프로그램을 수행 • 멀티스레딩 • 하나의 응용 프로그램에 여러 개의 실행 흐름을 생성
응용 프로그램 call API#1 call API#2 ... call API#3 call API#4 ... call API#n 윈도우 응용 프로그램 특징 (1/4) • API 호출문 집합 • API(Application Programming Interface): 윈도우 운영체제가 응용 프로그램을 위해 제공하는 각종 함수 집합
응용 프로그램 ... 메시지 핸들러 #1 메시지 핸들러 #2 메시지 핸들러 #3 메시지 핸들러 #4 메시지 핸들러 #5 메시지 핸들러 #6 ... 윈도우 응용 프로그램 특징 (2/4) • 메시지 핸들러 집합 • 메시지 핸들러(Message Handler): 메시지를 받았을 때 동작을 결정하는 코드 윈도우 프로시저: 메시지 핸들러 집합
응용 프로그램 실행 파일 DLL #1 DLL #2 DLL #3 DLL #4 DLL #5 ... 윈도우 응용 프로그램 특징 (3/4) • 실행 파일과 DLL 집합 • DLL(Dynamic-Link Library): 프로그램이 실행 중에 호출할 수 있는 함수(코드)와 리소스
윈도우 응용 프로그램 특징 (4/4) • 장치 독립적 응용 프로그램 API 장치 드라이버 주변 장치
윈도우 응용 프로그램 개발 도구 (1/3) • SDK(Software Development Kit) • C 언어로 윈도우 API를 직접 호출해서 프로그램을 구현 • 장점 • API를 직접 다루기 때문에 세부적인 제어가 가능하고, 윈도우 운영체제가 제공하는 모든 기능을 사용할 수 있다. • 생성 코드의 크기가 작고 속도가 빠르다. • 단점 • 생산성이 낮다.
윈도우 응용 프로그램 개발 도구 (2/3) • RAD(Rapid Application Development) • 시각적으로 화면을 디자인하고 코드를 추가하는 방법으로 프로그램을 빠르게 개발 • 장점 • 생산성이 높다. • 단점 • 일반적으로 생성 코드의 크기가 크고 실행 속도가 느리다. • 운영체제가 제공하는 모든 기능을 활용한 세부적인 제어가 어렵다.
윈도우 응용 프로그램 개발 도구 (3/3) • 클래스 라이브러리(Class Library) • 윈도우 응용 프로그램 개발에 필수적인 기능을 객체 지향 언어를 이용하여 클래스로 제공 • 장점 • SDK보다 생산성이 높다. • RAD보다 생성 코드의 크기가 작고 실행 속도가 빠르다. • 단점 • 초기 학습에 필요한 기간이 길다. • 객체 지향 언어 • 클래스 라이브러리 구조와 기능, 각 클래스의 관계 파악
HelloSDK 예제 작성 (1/9) • 프로젝트 생성
HelloSDK 예제 작성 (2/9) • 1단계 옵션 설정
HelloSDK 예제 작성 (3/9) • 소스 파일 추가
HelloSDK 예제 작성 (4/9) • 코드 입력 #include <windows.h> // WinMain( ) 함수에서 참조하므로 함수 원형을 선언한다. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS wndclass // 윈도우 클래스를 초기화하고 운영체제에 등록한다. wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance;
HelloSDK 예제 작성 (5/9) 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);
HelloSDK 예제 작성 (6/9) // 메시지 대기열에서 메시지를 하나씩 꺼내 처리한다. 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";
HelloSDK 예제 작성 (7/9) // 메시지 종류에 따라 응용 프로그램이 적절히 처리한다. 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;
HelloSDK 예제 작성 (8/9) case WM_DESTROY: PostQuitMessage(0); return 0; } // 응용 프로그램이 처리하지 않으면 윈도우 운영체제가 처리한다. return DefWindowProc(hwnd, message, wParam, lParam); }
HelloSDK 예제 작성 (9/9) • 실행 화면
HelloSDK 예제 분석 (1/7) • 헤더 파일 • 메인 함수 #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ...
HelloSDK 예제 분석 (2/7) • 윈도우 클래스 초기화와 등록 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;
HelloSDK 예제 분석 (3/7) • 윈도우 생성 hwnd = CreateWindow("HelloClass", "HelloSDK Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd);
HelloSDK 예제 분석 (4/7) • 메시지 루프 while(GetMessage(&msg, NULL, 0, 0) > 0){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;
HelloSDK 예제 분석 (5/7) • 윈도우 프로시저 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);
HelloSDK 예제 분석 (6/7) TextOut(hdc, 100, 100, str, lstrlen(str)); EndPaint(hwnd, &ps); return 0; case WM_LBUTTONDOWN: MessageBox(hwnd, "마우스를 클릭했습니다.", "마우스 메시지", MB_OK); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } // 응용 프로그램이 처리하지 않으면 윈도우 운영체제가 처리한다. return DefWindowProc(hwnd, message, wParam, lParam); }
이벤트 발생 응용 프로그램 #1 메시지 루프 ... 시스템 메시지 대기열 윈도우 프로시저 응용 프로그램 메시지 대기열 #3 메시지 핸들러 #1 메시지 핸들러 #2 메시지 핸들러 #3 ... 응용 프로그램 메시지 대기열 #2 DefWindowProc 응용 프로그램 메시지 대기열 #1 HelloSDK 예제 분석 (7/7) • 요약
HelloMFC 예제 작성 (1/9) • 프로젝트 생성
HelloMFC 예제 작성 (2/9) • 1단계 옵션 설정
HelloMFC 예제 작성 (3/9) • 소스 파일 추가
HelloMFC 예제 작성 (4/9) • 코드 입력 #include <afxwin.h> // 클래스 선언부 class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); }; class CMainFrame : public CFrameWnd { public: CMainFrame();
HelloMFC 예제 작성 (5/9) 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);
HelloMFC 예제 작성 (6/9) m_pMainWnd->UpdateWindow(); return TRUE; } CMainFrame::CMainFrame() { Create(NULL, "HelloMFC Application"); } void CMainFrame::OnPaint() { char *msg = "Hello, MFC"; CPaintDC dc(this);
HelloMFC 예제 작성 (7/9) 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()
HelloMFC 예제 작성 (8/9) • 프로젝트 설정 변경
HelloMFC 예제 작성 (9/9) • 실행 화면
HelloMFC 예제 분석 (1/7) • 헤더 파일 • 클래스 선언부 #include <afxwin.h> class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); };
HelloMFC 예제 분석 (2/7) • 클래스 선언부 (cont’d) class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() };
HelloMFC 예제 분석 (3/7) • 응용 프로그램 객체 • MFC 응용 프로그램의 구조 CHelloApp theApp; 하나의 응용 프로그램 객체 여러 종류의 클래스 선언 및 정의
HelloMFC 예제 분석 (4/7) • 클래스 정의부 BOOL CHelloApp::InitInstance() { m_pMainWnd = new CMainFrame; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } CMainFrame::CMainFrame() { Create(NULL, "HelloMFC Application"); }
HelloMFC 예제 분석 (5/7) • 클래스 정의부 (cont’d) void CMainFrame::OnPaint() { char *msg = "Hello, MFC"; CPaintDC dc(this); dc.TextOut(100, 100, msg, lstrlen(msg)); } void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { MessageBox("마우스를 클릭했습니다.", "마우스 메시지"); }
HelloMFC 예제 분석 (6/7) • 메시지맵 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP()
HelloMFC 예제 분석 (7/7) • 요약 WinMain( ) // MFC의 내부에 숨겨진 프로그램 실행의 시작점 { // ptr은 포인터로서 응용 프로그램 객체의 주소값을 가지고 있다. ... ptr->InitInstance( ); // 초기화: 프레임 윈도우 객체를 생성한다. // 프레임 윈도우 객체의 생성자에서 // 실제 윈도우가 만들어진다. ptr->Run( ); // 메시지 루프: 프레임 윈도우에게 메시지를 보낸다. // 프레임 윈도우가 받은 메시지의 종류에 따라 // 해당 메시지 핸들러가 적절히 호출된다. ptr->ExitInstance( ); // 종료: 각종 청소 작업을 수행한다. ... }
메뉴 팝업 메뉴 = 컨텍스트 메뉴 메뉴
툴바 툴바 사용자 정의 툴바 추가
워크스페이스 ClassView FileView ResourceView