01 : 윈도우프로그래밍기초 학습목표 윈도우운영체제와윈도우응용프로그램의특징을이해한다. SDK 응용프로그램작성과정, 기본구조, 동작원리를이해한다. MFC 응용프로그램작성과정, 기본구조, 동작원리를이해한다. 비주얼 C++ 개발환경사용법을익힌다.
윈도우운영체제특징 (1/3) 그래픽사용자인터페이스 1
윈도우운영체제특징 (2/3) 메시지구동구조 이벤트발생... 대기 시스템메시지대기열 응용프로그램메시지대기열 #3 처리 응용프로그램메시지대기열 #2 처리 응용프로그램메시지대기열 #1 2
윈도우운영체제특징 (3/3) 멀티태스킹 여러개의응용프로그램을수행 멀티스레딩 하나의응용프로그램에여러개의실행흐름을생성 Ex) 하나의응용프로그램이사용자가마우스나키보드로입력한내용을처리하면서동시에맞춤법검사루틴을수행 3
윈도우응용프로그램특징 (1/4) API 호출문집합 API(Application Programming g Interface): 윈도우운영체제가응용프로그램을위해제공하는각종함수집합 응용프로그램 call API#1 call API#2... call API#3 call API#4... call API#n 4
윈도우응용프로그램특징 (2/4) 메시지핸들러집합 메시지핸들러 (Message Handler): 메시지를받았을때동작을결정하는코드 응용프로그램... 메시지핸들러 #1 메시지핸들러 #2 메시지핸들러 #3 메시지핸들러 #4 메시지핸들러 #5 메시지핸들러 #6... 윈도우프로시저 : 메시지핸들러집합 5
윈도우응용프로그램특징 (3/4) 실행파일과 DLL 집합 DLL(Dynamic-Link Library): 프로그램이실행중에호출할수있는함수 ( 코드 ) 와리소스 응용프로그램 실행파일 DLL #1 DLL #2 DLL #3 DLL #4 DLL #5... 6
윈도우응용프로그램특징 (4/4) 장치독립적 응용프로그램 API 장치드라이버주변장치 7
윈도우응용프로그램개발도구 (1/3) SDK(Software Development Kit) C 언어로윈도우 API 를직접호출해서프로그램을구현 장점 API 를직접다루기때문에세부적인제어가가능하고, 윈도우운영체제가제공하는모든기능을사용할수있다. 생성코드의크기가작고속도가빠르다. 단점 생산성이낮다. 8
윈도우응용프로그램개발도구 (2/3) RAD(Rapid Application Development) 시각적으로화면을디자인하고코드를추가하는방법으로프로그램을빠르게개발 장점 생산성이높다. 단점 일반적으로생성코드의크기가크고실행속도가느리다. 운영체제가제공하는모든기능을활용한세부적인제어가어렵다. 9
윈도우응용프로그램개발도구 (3/3) 클래스라이브러리 (Class Library) 윈도우응용프로그램개발에필수적인기능을객체지향언어를이용하여클래스로제공 MFC(Microsoft Foundation Class Library) 장점 SDK보다생산성이높다. RAD보다생성코드의크기가작고실행속도가빠르다. 단점 초기학습에필요한기간이길다. 객체지향언어 클래스라이브러리구조와기능, 각클래스의관계파악 10
HelloSDK 예제작성 (1/8) 프로젝트생성 11
HelloSDK 예제작성 (2/8) 옵션설정 12
HelloSDK 예제작성 (3/8) 코드입력 #include <windows.h> // WinMain( ) 함수에서참조하므로함수원형을선언한다. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 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; 13
HelloSDK 예제작성 (4/8) 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); // 윈도우가화면에나타나게하며 ncmdshow의값에따라최소화혹은최대화상태로실행 ShowWindow(hwnd, ncmdshow); // 윈도우프로시저가 WM_PAINT 메시지를곧바로처리하게함으로, // 클라이언트영역이빨리화면에그려지게하는역할 UpdateWindow(hwnd); 14
HelloSDK 예제작성 (5/8) } // 메시지대기열에서메시지를하나씩꺼내처리한다. 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"; 15
HelloSDK 예제작성 (6/8) // 메시지종류에따라응용프로그램이적절히처리한다. 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; 16
HelloSDK 예제작성 (7/8) case WM_DESTROY: PostQuitMessage(0); return 0; } } // 응용프로그램이처리하지않으면윈도우운영체제가처리한다. return DefWindowProc(hwnd, message, wparam, lparam); 17
HelloSDK 예제작성 (8/8) 실행화면 18
HelloSDK 예제분석 (1/7) 헤더파일 #include <windows.h> 메인함수 int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) {... 19
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 lpszmenuname = NULL; wndclass.lpszclassname = "HelloClass"; if(!registerclass(&wndclass)) return -1; 20
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); 21
HelloSDK 예제분석 (4/7) 메시지루프 while(getmessage(&msg, NULL, 0, 0) > 0){ TranslateMessage(&msg); DispatchMessage(&msg); g } return msg.wparam; 22
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: // CreateWindow() 함수호출, 윈도우가생성될때, 한번만받는메시지 return 0; case WM_PAINT: // 윈도우클라이언트영역의일부또는전체를다시그릴필요가있을때메시지를보낸다. hdc = BeginPaint(hwnd, &ps); 23
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);// 자신의메시지대기열에 WM_QUIT 메시지를집어넣음. return 0; } // 응용프로그램이처리하지않으면윈도우운영체제가처리한다. return DefWindowProc(hwnd, message, wparam, lparam); 24
HelloSDK 분석 (7/7) 요약 이벤트발생응용프로그램 #1... 메시지루프 시스템메시지대기열 응용프로그램메시지대기열 #3 응용프로그램메시지대기열 #2 윈도우프로시저 메시지핸들러 #1 메시지핸들러 #2 메시지핸들러 #3... 응용프로그램메시지대기열 #1 DefWindowProc 25
HelloMFC 예제작성 (1/8) 프로젝트생성 26
HelloMFC 예제작성 (2/8) 1 단계옵션설정 27
HelloMFC 예제작성 (3/8) 코드입력 #include <afxwin.h> // 클래스선언부 class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); }; class CMainFrame : public CFrameWnd { public: CMainFrame(); 28
HelloMFC 예제작성 (4/8) 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 pmainwnd->showwindow(m_ncmdshow); ncmdshow); 29
HelloMFC 예제작성 (5/8) } m_pmainwnd->updatewindow(); return TRUE; CMainFrame::CMainFrame() { Create(NULL, "HelloMFC Application"); } void CMainFrame::OnPaint() { char *msg = "Hello, MFC"; CPaintDC dc(this); 30
HelloMFC 예제작성 (6/8) } 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() MAP() 31
HelloMFC 예제작성 (7/8) 프로젝트설정변경 32
HelloMFC 예제작성 (8/8) 실행화면 33
HelloMFC 예제분석 (1/7) 헤더파일 #include <afxwin.h> 클래스선언부 class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); }; 34
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() MAP() }; 35
HelloMFC 예제분석 (3/7) 응용프로그램객체 CHelloApp theapp; MFC 응용프로그램의구조 하나의응용프로그램객체 여러종류의클래스선언및정의 36
HelloMFC 예제분석 (4/7) 클래스정의부 BOOL CHelloApp::InitInstance() { m_pmainwnd = new CMainFrame; m_pmainwnd->showwindow(m_ncmdshow); Wi d dsh m_pmainwnd->updatewindow(); return TRUE; } CMainFrame::CMainFrame() { Create(NULL, "HelloMFC Application"); } 37
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(" 마우스를클릭했습니다.", " 마우스메시지 "); } 38
HelloMFC 예제분석 (6/7) 메시지맵 BEGIN_MESSAGE_MAP(CMainFrame, MAP(CM CFrameWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() 39
HelloMFC 예제분석 (7/7) 요약 WinMain( i ) // MFC 의내부에숨겨진프로그램실행의시작점 { // ptr은포인터로서응용프로그램객체의주소값을가지고있다.... ptr->initinstance( ); // 초기화 : 프레임윈도우객체를생성한다. // 프레임윈도우객체의생성자에서 // 실제윈도우가만들어진다. ptr->run( ); // 메시지루프 : 프레임윈도우에게메시지를보낸다. // 프레임윈도우가받은메시지의종류에따라 // 해당메시지핸들러가적절히호출된다. ptr->exitinstance( ); // 종료 : 각종청소작업을수행한다.... } 40