View
61
Download
3
Category
Preview:
DESCRIPTION
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다 . SDK 응용 프로그램 작성 과정 , 기본 구조 , 동작 원리를 이해한다 . MFC 응용 프로그램 작성 과정 , 기본 구조 , 동작 원리를 이해한다 . 비주얼 C++ 개발 환경 사용법을 익힌다. 윈도우 운영체제 특징 (1/3). 그래픽 사용자 인터페이스. 이벤트 발생. 대기. 시스템 메시지 대기열. 응용 프로그램 메시지 대기열 #3. 처리. 응용 프로그램 메시지 대기열 #2. 처리. 응용 프로그램 메시지 대기열 #1. - PowerPoint PPT Presentation
Citation preview
01윈도우 프로그래밍 기초:
학습 목표
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다 .
SDK 응용 프로그램 작성 과정 , 기본 구조 , 동작 원리를 이해한다 .
MFC 응용 프로그램 작성 과정 , 기본 구조 , 동작 원리를 이해한다 .
비주얼 C++ 개발 환경 사용법을 익힌다 .
2
윈도우 운영체제 특징 (1/3)
그래픽 사용자 인터페이스
3
윈도우 운영체제 특징 (2/3)
메시지 구동 구조
시스템메시지대기열
이벤트 발생
응용 프로그램메시지 대기열 #1
응용 프로그램메시지 대기열 #2
응용 프로그램메시지 대기열 #3
...
처리
대기
처리
4
윈도우 운영체제 특징 (3/3)
멀티태스킹여러 개의 응용 프로그램을 수행
멀티스레딩하나의 응용 프로그램에 여러 개의 실행 흐름을 생성
5
윈도우 응용 프로그램 특징 (1/4)
API 호출문 집합API(Application Programming Interface): 윈도우
운영체제가 응용 프로그램을 위해 제공하는 각종 함수 집합
call API#1
응용 프로그램
call API#2...
call API#3call API#4
...call API#n
6
윈도우 응용 프로그램 특징 (2/4)
메시지 핸들러 집합메시지 핸들러 (Message Handler): 메시지를 받았을
때 동작을 결정하는 코드
윈도우 프로시저 : 메시지 핸들러 집합
메시지 핸들러 #1
응용 프로그램
메시지 핸들러 #2메시지 핸들러 #3메시지 핸들러 #4메시지 핸들러 #5메시지 핸들러 #6
...
...
7
윈도우 응용 프로그램 특징 (3/4)
실행 파일과 DLL 집합DLL(Dynamic-Link Library): 프로그램이 실행 중에
호출할 수 있는 함수 ( 코드 ) 와 리소스
실행 파일
응용 프로그램
DLL #1DLL #2DLL #3DLL #4DLL #5
...
8
윈도우 응용 프로그램 특징 (4/4)
장치 독립적
응용 프로그램 API 장치 드라이버 주변 장치
9
윈도우 응용 프로그램 개발 도구 (1/3)
SDK(Software Development Kit)C 언어로 윈도우 API 를 직접 호출해서 프로그램을
구현 장점
API 를 직접 다루기 때문에 세부적인 제어가 가능하고 , 윈도우 운영체제가 제공하는 모든 기능을 사용할 수 있다 .
생성 코드의 크기가 작고 속도가 빠르다 . 단점
생산성이 낮다 .
10
윈도우 응용 프로그램 개발 도구 (2/3)
RAD(Rapid Application Development)시각적으로 화면을 디자인하고 코드를 추가하는
방법으로 프로그램을 빠르게 개발 장점
생산성이 높다 . 단점
일반적으로 생성 코드의 크기가 크고 실행 속도가 느리다 .
운영체제가 제공하는 모든 기능을 활용한 세부적인 제어가 어렵다 .
11
윈도우 응용 프로그램 개발 도구 (3/3)
클래스 라이브러리 (Class Library)윈도우 응용 프로그램 개발에 필수적인 기능을 객체
지향 언어를 이용하여 클래스로 제공 장점
SDK 보다 생산성이 높다 .RAD 보다 생성 코드의 크기가 작고 실행 속도가 빠르다 .
단점초기 학습에 필요한 기간이 길다 .
– 객체 지향 언어– 클래스 라이브러리 구조와 기능 , 각 클래스의 관계 파악
12
HelloSDK 예제 작성 (1/9)
프로젝트 생성
13
HelloSDK 예제 작성 (2/9)
1 단계 옵션 설정
14
HelloSDK 예제 작성 (3/9)
소스 파일 추가
15
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;
16
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);
17
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";
18
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;
19
HelloSDK 예제 작성 (8/9)
case WM_DESTROY: PostQuitMessage(0); return 0; }
// 응용 프로그램이 처리하지 않으면 윈도우 운영체제가 처리한다 . return DefWindowProc(hwnd, message, wParam, lParam);}
20
HelloSDK 예제 작성 (9/9)
실행 화면
21
HelloSDK 예제 분석 (1/7)
헤더 파일
메인 함수
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ ...
22
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;
23
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);
24
HelloSDK 예제 분석 (4/7)
메시지 루프
while(GetMessage(&msg, NULL, 0, 0) > 0){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;
25
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);
26
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);}
27
HelloSDK 예제 분석 (7/7)
요약
시스템메시지대기열
이벤트 발생
응용 프로그램메시지 대기열 #1
응용 프로그램메시지 대기열 #2
응용 프로그램메시지 대기열 #3
...
응용 프로그램 #1
메시지 루프
메시지 핸들러 #1메시지 핸들러 #2메시지 핸들러 #3
...
DefWindowProc
윈도우 프로시저
28
HelloMFC 예제 작성 (1/9)
프로젝트 생성
29
HelloMFC 예제 작성 (2/9)
1 단계 옵션 설정
30
HelloMFC 예제 작성 (3/9)
소스 파일 추가
31
HelloMFC 예제 작성 (4/9)
코드 입력#include <afxwin.h>
// 클래스 선언부class CHelloApp : public CWinApp{public: virtual BOOL InitInstance();};
class CMainFrame : public CFrameWnd{public: CMainFrame();
32
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);
33
HelloMFC 예제 작성 (6/9)
m_pMainWnd->UpdateWindow(); return TRUE;}
CMainFrame::CMainFrame(){ Create(NULL, "HelloMFC Application");}
void CMainFrame::OnPaint(){ char *msg = "Hello, MFC"; CPaintDC dc(this);
34
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()
35
HelloMFC 예제 작성 (8/9)
프로젝트 설정 변경
36
HelloMFC 예제 작성 (9/9)
실행 화면
37
HelloMFC 예제 분석 (1/7)
헤더 파일
클래스 선언부
#include <afxwin.h>
class CHelloApp : public CWinApp{public: virtual BOOL InitInstance();};
38
HelloMFC 예제 분석 (2/7)
class CMainFrame : public CFrameWnd{public: CMainFrame();
protected: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP()};
클래스 선언부 (cont’d)
39
HelloMFC 예제 분석 (3/7)
응용 프로그램 객체
MFC 응용 프로그램의 구조
CHelloApp theApp;
하나의 응용 프로그램 객체
여러 종류의클래스 선언 및 정의
40
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");}
41
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(" 마우스를 클릭했습니다 .", " 마우스 메시지 ");}
42
HelloMFC 예제 분석 (6/7)
메시지맵
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN()END_MESSAGE_MAP()
43
HelloMFC 예제 분석 (7/7)
요약
WinMain( ) // MFC 의 내부에 숨겨진 프로그램 실행의 시작점{ // ptr 은 포인터로서 응용 프로그램 객체의 주소값을 가지고 있다 . ... ptr->InitInstance( ); // 초기화 : 프레임 윈도우 객체를 생성한다 . // 프레임 윈도우 객체의 생성자에서 // 실제 윈도우가 만들어진다 . ptr->Run( ); // 메시지 루프 : 프레임 윈도우에게 메시지를 보낸다 . // 프레임 윈도우가 받은 메시지의 종류에 따라 // 해당 메시지 핸들러가 적절히 호출된다 . ptr->ExitInstance( ); // 종료 : 각종 청소 작업을 수행한다 . ...}
44
비주얼 C++ 통합 개발 환경
45
메뉴
메뉴
팝업 메뉴 = 컨텍스트 메뉴
46
툴바
툴바
사용자 정의 툴바 추가
47
워크스페이스
ClassView FileView ResourceView
48
편집기
49
AppWizard
50
ClassWizard
Recommended