윈도우프로그래밍 Visual C++ 2010 MFC Programming 1 장. 윈도우프로그래밍기초
윈도우운영체제의특징 그래픽사용자인터페이스 시스템메뉴타이틀바메뉴최소 / 최대 / 닫기버튼 툴바 대화상자 클라이언트영역 상태표시줄 스크롤바
윈도우운영체제의특징 메시지구동구조
윈도우운영체제의특징 멀티태스킹과멀티스레딩 멀티태스킹 (Multitasking) 운영체제가여러개의응용프로그램을동시에실행 멀티스레딩 (Multithreading) 응용프로그램내부에서여러개의실행흐름 (= 스레드 ) 을동시에진행
윈도우응용프로그램의특징 API 호출문집합 API (Application Programming Interface) 윈도우운영체제가응용프로그램을위해제공하는각종함수의집합
윈도우응용프로그램의특징 메시지핸들러집합 메시지핸들러 (message handler) 메시지를받았을때동작을결정하는코드 윈도우프로시저 : 메시지핸들러의집합
윈도우응용프로그램의특징 실행파일과 DLL 집합 DLL ( Dynamic-Link Library ) 프로그램이실행중에결합하여사용할수있는코드와리소스의집합
윈도우응용프로그램의특징 장치독립성 주변장치가바뀌어도장치드라이버 (Device Driver) 만설치하면프로그램을수정하지않고실행할수있음 하드웨어장치 ( 예 : 프린터, 모니터, 키보드, 네트워크 ) 의제조사및모델에관계없이동일한응용프로그램작성가능
윈도우응용프로그램의개발방식 SDK (Software Development Kit) 특징 윈도우 API 응용프로그램코드 (C/C++ 언어 ) 장점 API를직접다루기때문에세부제어가가능함 윈도우운영체제가제공하는모든기능을사용가능 생성코드의크기가작고속도도빠름 단점 다른개발방식에비해생산성이매우낮음
윈도우응용프로그램의개발방식 RAD (Rapid Application Development) 특징 시각적화면디자인 응용프로그램코드 (Visual Basic 등 ) 장점 간편하게직관적으로프로그래밍할수있음 ( 생산성이높음 ) 단점 생성코드의크기가크고실행속도도떨어지는편임 윈도우운영체제가제공하는모든기능을활용한세부적인제어가어려운경우가있음
윈도우응용프로그램의개발방식 클래스라이브러리 특징 클래스라이브러리 응용프로그램코드 ( 객체지향언어 ) 장점 SDK를이용한방식보다생산성이높음 RAD 개발방식보다코드크기와실행속도면에서유리함 단점 초기학습에필요한시간이길다 객체지향프로그래밍 클래스라이브러리의구조와기능, 각클래스의관계파악
윈도우응용프로그램의개발방식.NET 프레임워크 윈도우운영체제에설치할수있는소프트웨어개발및실행환경 특징 공용언어런타임 (CLR, Common Language Runtime) 이라는소프트웨어가상머신을제공하며, 가상머신의제어하에응용프로그램이구동됨 ( 장치독립성 ) 윈도우 API 에버금가는방대한라이브러리를제공하며, 언어에상관없이라이브러리를사용가능 ( 언어독립성 )
간단한 SDK 프로그램작성 - HelloSDK SDK 프로그램기본골격 실습 1-1 (p.36) 1 윈도우클래스를정의 ( 초기화 ) 하고운영체제에등록함 2 윈도우를생성하고화면에보이게함 3 메시지루프를구동함 4 윈도우프로시저에서메시지를처리함
간단한 SDK 프로그램작성 - HelloSDK 프로젝트종류선택
간단한 SDK 프로그램작성 - HelloSDK 프로젝트옵션변경
간단한 SDK 프로그램작성 - HelloSDK 소스파일추가 (1)
간단한 SDK 프로그램작성 - HelloSDK 소스파일추가 (2)
간단한 SDK 프로그램작성 - HelloSDK 실행결과
간단한 SDK 프로그램작성 - HelloSDK HelloSDK 예제코드 (1/4) #include <windows.h> 1 헤더파일 // WinMain 함수에서참조하므로함수원형을선언한다. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASS wndclass; HWND hwnd; MSG msg; 2 메인함수 // 윈도우클래스를초기화하고운영체제에등록한다. wndclass.style = CS_HREDRAW CS_VREDRAW; // 스타일지정 wndclass.lpfnwndproc = WndProc; // 윈도우프로시저이름 wndclass.cbclsextra = 0; // 여분메모리 (0 바이트 ) wndclass.cbwndextra = 0; // 여분메모리 (0 바이트 ) wndclass.hinstance = hinstance; // 인스턴스핸들 wndclass.hicon = LoadIcon(NULL, IDI_APPLICATION); // 아이콘모양 wndclass.hcursor = LoadCursor(NULL, IDC_ARROW); // 커서모양 3 윈도우클래스초기화와등록
간단한 SDK 프로그램작성 - HelloSDK HelloSDK 예제코드 (2/4) wndclass.hbrbackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 배경 ( 흰색 ) wndclass.lpszmenuname = NULL; // 메뉴 (NULL-> 메뉴없음 ) wndclass.lpszclassname = TEXT("HelloClass ); // 윈도우클래스이름 if(!registerclass(&wndclass)) return 1; // 윈도우를생성하고화면에나타낸다. hwnd = CreateWindow(TEXT("HelloClass ), TEXT("HelloSDK ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL); ShowWindow(hwnd, ncmdshow); // 메시지큐에서메시지를하나씩꺼내서처리한다. while(getmessage(&msg, NULL, 0, 0) > 0){ TranslateMessage(&msg); DispatchMessage(&msg); } 4 윈도우생성 5 메시지루프 } return msg.wparam;
간단한 SDK 프로그램작성 - HelloSDK HelloSDK 예제코드 (3/4) LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { HDC hdc; PAINTSTRUCT ps; TCHAR *str = TEXT("Hello, SDK ); 6 윈도우프로시저 // 발생한메시지의종류에따라적절히처리한다. switch(message){ case WM_CREATE: return 0; case WM_LBUTTONDOWN: MessageBox(hwnd, TEXT(" 마우스클릭! ), TEXT(" 마우스메시지 ), MB_OK); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 100, 100, str, lstrlen(str)); EndPaint(hwnd, &ps); return 0;
간단한 SDK 프로그램작성 - HelloSDK HelloSDK 예제코드 (4/4) case WM_DESTROY: PostQuitMessage(0); return 0; } } // 응용프로그램이처리하지않은메시지는운영체제가처리한다. return DefWindowProc(hwnd, message, wparam, lparam);
SDK 프로그램기본구조 SDK 프로그램동작원리
간단한 MFC 프로그램작성 - HelloMFC MFC 프로그램기본골격 1 응용프로그램클래스정의 2 메인 (= 프레임 ) 윈도우클래스정의 3 응용프로그램객체선언 4 메시지맵선언 실습 1-2 (p.47)
간단한 MFC 프로그램작성 - HelloMFC 프로젝트종류선택
간단한 MFC 프로그램작성 - HelloMFC 프로젝트옵션변경
간단한 MFC 프로그램작성 - HelloMFC 소스파일추가 (1)
간단한 MFC 프로그램작성 - HelloMFC 소스파일추가 (2)
간단한 MFC 프로그램작성 - HelloMFC 프로젝트속성변경
간단한 MFC 프로그램작성 - HelloMFC 실행결과
간단한 MFC 프로그램작성 - HelloMFC HelloMFC 예제코드 (1/3) #include <afxwin.h> // 응용프로그램클래스를선언한다. class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); }; 1 헤더파일 2 클래스선언부 // 메인윈도우클래스를선언한다. class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nflags, CPoint point); DECLARE_MESSAGE_MAP() };
간단한 MFC 프로그램작성 - HelloMFC HelloMFC 예제코드 (2/3) // 응용프로그램객체를선언한다. CHelloApp theapp; // 응용프로그램클래스를정의한다. BOOL CHelloApp::InitInstance() { m_pmainwnd = new CMainFrame; m_pmainwnd->showwindow(m_ncmdshow); return TRUE; } 3 응용프로그램객체 4 클래스정의부 // 메인윈도우클래스를정의한다. CMainFrame::CMainFrame() { Create(NULL, _T("HelloMFC )); }
간단한 MFC 프로그램작성 - HelloMFC HelloMFC 예제코드 (3/3) void CMainFrame::OnPaint() { CPaintDC dc(this); TCHAR *msg = _T("Hello, MFC ); dc.textout(100, 100, msg, lstrlen(msg)); } void CMainFrame::OnLButtonDown(UINT nflags, CPoint point) { MessageBox(_T(" 마우스클릭! ), _T( " 마우스메시지 )); } // 메시지맵을선언한다. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() 5 메시지맵
MFC 프로그램기본구조 MFC 프로그램동작원리
비주얼 C++ 개발환경 비주얼 C++ 통합개발환경 메뉴 툴바 편집창 솔루션과프로젝트 출력창 상태표시줄
비주얼 C++ 개발환경 솔루션과프로젝트 프로젝트추가
비주얼 C++ 개발환경 소스파일추가
비주얼 C++ 개발환경 솔루션탐색기 / 클래스뷰 / 리소스뷰