Chapter 1. MFC 시작하기 1. MFC(Microsoft Foundation Class) 개요 2. Visual Studio 2015 프로그램설치하기 3. 마우스클릭프로그램작성 4. 그림그리기프로그램작성 5. 마우스좌표값구하기프로그램작성 1
1.1. MFC 개요 2
1.1.1. C++ 언어 객체지향언어 (Object-Oriented Programming, OOP) C언어의장점과객체지향속성을가지는언어객체지향의기본구성요소 (1) 클래스 (Class) : 같은종류의속성 (Attributed) 와행위 (behavior) 를정의 (2) 객체 (Object) : 자신소유의속성을가지고, 클래스에서정의한행위수행가능 (3) 메서드 (method) : 생성된객체를사용하는방법으로객체에명령을내리는메시지객체지향언어의특징 (1) 추상화 : 불필요한정보는숨기고중요한정보만표현 -> 프로그램간단화 (2) 상속성 : 새로운클래스와기존의클래스의자료와연산이용가능 (3) 캡슐화 : 안전과보안에의해서객체는독립적으로활용가능 (4) 다형성 : 한요소에여러개념을넣은것으로오버라이딩또는오버로딩을의미 (5) 정보은닉 : 캡슐화와유사, 정보를노출시키지않음 3
1.1.2. 윈도우프로그램 GUI(Graphic User Interface: 그래픽사용자인터페이스 ) 를기반으로인터페이스제공여러개의프로그램을동시에실행가능 Multi-Tasking 하나의프로그램을동시에여러기능으로실행가능 Multi-Threading API ( Application Programming Interface) - 윈도우내에포함된내부코드를프로그램개발에이용 - 프로그램을직접설정 / 제어가능 - 필요한부분만을코딩하여사용가능 코딩의양감소 MFC( Microsoft Foundation Class) - C++ 클래스라이브러리의집합체 - API를쉽게접근하기위한함수의집합 - API보다편리하게프로그래밍가능 - 용량이커지고, 세세한부분의프로그래밍한계가단점 4
1.1.3. MFC Class 구성도 1 CObject CCmdTarget CWinApp CWnd CDocument CDocTemplate CFrameWnd CDialog CView CCtrlView CSingleDocTemplate CMultiDocTemplate 5
1.1.4. MFC Class 구성도 2 CObject : 최상위클래스, 기본클래스 CCmdTarget : 명령관련클래스 CWinApp : 프로그램시작 / 종료제어, Application 을생성하는기본클래스 CCDocTemplate : 단일문서와다중문서에관련된클래스 CWnd : 윈도우크기, 위치, 모양등상태를제어하기위한클래스 CDocument: 파일로부터데이터읽고 / 저장 / 입출력에관련된클래스 CView: 데이터가화면에보여지도록처리하는클래스 CFrameWnd : 윈도우외곽경계정의클래스 CDialog : 다이얼로그컨트롤과멤버변수사이데이터교환클래스 6
1.2. Visual Studio 2015 프로그램설치하기 7
1.2.1. Visual Studio 2015 프로그램설치하기 1 https://www.visualstudio.com 입력 Visual Studio 2015 Community 로 Searching 8
1.2.2. Visual Studio 2015 프로그램설치하기 2 https://www.visualstudio.com 에서 Community 2015 버전을무료다운로드 9
1.3. 마우스클릭프로그램 10
1.3.1. 프로그램구성 마우스이벤트를이용한윈도우프로그램마우스왼쪽 / 오른쪽버튼클릭구분인식 [Win32 프로젝트 ] 로프로그램구성프로그램구성요소 6단계 (1) 헤더파일 (2) 메인함수 (3) 윈도우클래스초기화와등록 (4) 윈도우생성 (5) 메시지루프 (6) 윈도우프로시져 11
1.3.2. 윈도우프로시져 switch (message) // 커널에서들어온메시지를 switch 문으로처리 { case WM_CREATE: return 0; case WM_LBUTTONDOWN: MessageBox(hwnd, TEXT(" 마우스의왼쪽버튼을클릭하셨습니다."), TEXT(" 마우스왼쪽버튼클릭!"), MB_OK); return 0; case WM_RBUTTONDOWN: MessageBox(hwnd, TEXT(" 마우스의오른쪽버튼을클릭하셨습니다."), TEXT(" 마우스오른쪽버튼클릭!"), MB_OK); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 100, 100, str1, lstrlen(str1)); TextOut(hdc, 100, 200, str2, lstrlen(str2)); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } 12
1.3.3. WM_MOUSE 메시지 메시지 WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK WM_MOUSEMOVE WM_MOUSEWHEEL 내용 왼쪽마우스버튼을누를경우왼쪽마우스버튼이뗄경우왼쪽마우스더블클릭할경우오른쪽마우스버튼을누를경우오른쪽마우스버튼을뗄경우오른쪽마우스더블클릭할경우마우스가움직일경우마우스휠이움직일경우 13
1.3.4. GDI Object GDI Object 핸들타입 기능 펜 HPEN 선을생성 브러시 HBRUSH 면을생성 폰트 HFONT 문자출력에사용되는글꼴 비트맵 HBITMAP 미트맵이미지 팔레트 HPALETTE 팔레트 영역 HRGN 영역 14
1.3.5. HBRUSH/HPEN COLOR BLACK_BRUSH GRAY_BRUSH NULL_BRUSH WHITE_BRUSH DKGRAY_BRUSH LTGRAY_BRUSH BLACK_PEN WHITE_PEN NULL_PEN 검정브러시회색브러시투명브러시흰색브러시어두운회색브러시밝은회색브러시검정펜흰색펜투명펜 15
1.3.6. 함수정의 WinMain() 함수 - <window.h> 파일에포함된함수로서, 윈도우어플리케이션에서는 WinMain() 함수가반드시포함되어야프로그램실행 WNDCLASS - 윈도우의여러가지특성을정의하는구조체로서 <window.h> 에정의 WinProc - 메시지가발생할때처리하는메시지처리함수로서 Window Procedure 로서메지시자입력되면윈도우즈에의해호출되서메시지를처리 - 예를들면, WM_CREATE, WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_PAINT, WM_DESTROY 5 개의메시지를처리 TextOut() - 간단한텍스트를출력하는함수 Text() - 문자열상수만포함 16
1.3.7. 프로그램실행결과 왼쪽마우스클릭 오른쪽마우스클릭 17
1.4. 그림그리기프로그램작성 18
1.4.1. 그림그리기프로그램구성 1 마우스를자유롭게움직여서그림작성생성되는윈도우프로그램은 MousePos 변수이용 MousePos 병수로실시간마우스위치좌표탐지마우스위치값을실시간으로지속적으로 update MousePos 변수 - LOWORD(lParam) 에의해서마우스 X좌표값과 HIWORD(lParam) 을의해서마우스 Y좌표값이반환 19
1.4.2. 그림그리기프로그램구성 2 // 윈도우프로시져 LRESULT CALLBACK WndProc(HWND hwnd, UINT imessage, WPARAM wparam, LPARAM lparam) { HDC hdc; PAINTSTRUCT ps; static POINT MousePos; // 마우스 x,y 좌표를저장할변수 static BOOL bdrawing = FALSE; switch (imessage) { case WM_LBUTTONDOWN: MousePos.x = LOWORD(lParam); MousePos.y = HIWORD(lParam); bdrawing = TRUE; SetCapture(hWnd); return 0; 20
1.4.3. 그림그리기프로그램구성 3 case WM_MOUSEMOVE: if (bdrawing == TRUE) { hdc = GetDC(hWnd); MoveToEx(hdc, MousePos.x, MousePos.y, NULL); MousePos.x = LOWORD(lParam); MousePos.y = HIWORD(lParam); LineTo(hdc, MousePos.x, MousePos.y); ReleaseDC(hWnd, hdc); } return 0; case WM_LBUTTONUP: case WM_PAINT: case WM_DESTROY: } 21
1.4.4. 그림그리기프로그램결과 22
1.5. 마우스좌표값구하기 프로그램작성 23
1.5.1. 마우스좌표값구하기프로그램구성 1 MFC 를이용하여마우스좌표값작성 MFC Class Wizard를사용하여멤버함수를생성생성된멤버함수는마우스위치좌표값을 update 멤버함수 (Member Function) / 멤버변수 (Member Variable) - 클래스내부에서정의되고사용되는함수나변수 MFC 응용프로그램 이표시되지않는경우 - [ 템플릿 ]-[Visual C++]-[MFC] 에서 C++ 용 Microsoft Foundation Classes 설치 를선택하여설치해야가능 24
1.5.2. 마우스좌표값구하기프로그램구성 2 클래스위저드 (Class Wizard) 를이용하여 OnDraw() 함수를선택 OnDraw(CDC * pdc) 함수를더블클릭하여다음코드추가 void CMouseMFCView::OnDraw(CDC* /*pdc*/) { CMouseMFCDoc* pdoc = GetDocument( ); ASSERT_VALID(pDoc); if (!pdoc) return; // TODO: 여기에원시데이터에대한그리기코드를추가합니다. CClientDC dc(this); CString strpoint; strpoint.format(_t(" 마우스좌표 (%4d, %4d)"), m_pos.x, m_pos.y); dc.textoutw(0, 0, strpoint); } 25
1.5.3. 마우스좌표값구하기프로그램실행결과 26