MFC를 사용한 프로그램 작성 예제
Download
Report
Transcript MFC를 사용한 프로그램 작성 예제
Microsoft Foundation Class (MFC) Library
MFC (Microsoft Foundation Class) Library
• Windows 프로그래밍에 필요한 여러가지 기능을 class 형태로 제공함
• 사용자는 이 class를 상속받아 사용하면 됨
MFC와 SDK (Software Development Kit)를 사용한 프로그램 작성 비교
사용자 프로그램
SDK
Windows XP
사용자 프로그램
MFC
SDK
Windows XP
프로그래밍 응용 #6
1
프로그램 작성 비교
MFC와 SDK (Software Development Kit)를 사용한 프로그램 작성 비교
main() {
CMainFrame 생성
메모리 할당
그래픽 관련 최기화
…
메시지 처리 루틴
}
SDK 사용 프로그램
프로그래밍 응용 #6
MFC 사용
2
MFC를 사용한 프로그램 작성 예제
아무 것도 하지 않는 Windows 프로그램을 한 번 만들어 봄
File New 선택
project 이름 및
경로 선택
MFC Application Wizard 선택
프로그래밍 응용 #6
3
MFC를 사용한 프로그램 작성 예제
MFC Application Wizard – Step 1 : Single Document 선택
프로그래밍 응용 #6
4
MFC를 사용한 프로그램 작성 예제
MFC Application Wizard – Step 2 - 5 : 계속해서 NEXT 선택
프로그래밍 응용 #6
5
MFC를 사용한 프로그램 작성 예제
MFC Application Wizard를 사용하여 필요한 class 생성
프로그래밍 응용 #6
6
MFC를 사용한 프로그램 작성 예제
Compile하여 실행시키면 다음과 같은 프로그램이 실행됨
첫번째 Windows 프로그램을 만들었음.
프로그래밍 응용 #6
7
MFC를 사용한 프로그램 작성 예제
생성된 프로그램은 기본적인 Windows 프로그램의 뼈대와 기능을 가지고 있음
• Window의 크기를 변경하거나 위치를 이동시킬 수 있음
• minimize, maximize, 종료 등의 기능이 가능함
Windows의 기본기능 이외에는 어떠한 기능도 가지고 있지 않음.
• 지금부터 C++ 프로그램을 해서 우리가 원하는 기능을 구현해야 됨
지정된 경로의 test directory에 여러가지 파일이 생겼음
• 나중에 이 파일들을 선택할 때에는 File Open Workspace를 하여 test.dsw를 선택하면
됨.
프로그래밍 응용 #6
8
Application Wizard가 만든 class
MFC의 class
거의 모든 MFC 클래스의 기반 클래스
CObject
커맨드 메세지를 받는 기능
CCmdTarget
CWinApp
CDocument
CWnd
프로그램을 구동시키는 기능
CTestApp
데이터를 저장하고 처리하는 기능
CTestDoc
윈도우에 관련된 기능 ( 눈에 보이는 오브젝트)
CFrameWnd
CView
프로그램 윈도우 프레임( 외곽) 을 관리하는 기능
CMainFrame
데이터를 보여주는 윈도우 관리하는 기능
CTestView
MFC의 base class
파생된 class
4개의 class를 자동으로 만들었음
• CTestView, CTestApp, CMainFrame, CTestDoc
프로그래밍 응용 #6
9
class를 object 단위로 분리
object 단위로 class를 분리하여 사용
• 간단한 프로그램의 경우에는 약간 귀찮은 면도 있음
CFram eWnd
CView
윈도우의 프레임( 틀) 을 관리 데이터를 보여주는 윈도우
CDocum ent
데이터를 저장, 처리
( 눈에는 안보임)
CWinApp
위의 세 오브젝트를 묶어주고, 프로그램을 구동 시킴 ( 눈에는 안보임)
프로그래밍 응용 #6
10
4개의 class 및 member 함수들
CMainFrame class
member function
프로그래밍 응용 #6
11
CWinApp class
CWinApp 클래스의 역할
• 프로그램의 시작과 종료를 담당
• 프로그램이 시작될 때, 메인 프레임 윈도우를 생성
• 무한루프를 돌면서 메시지를 뿌려줌
• WM_QUIT 메시지를 만나면 무한루프를 빠져 나옴
• 프로그램을 전체를 대표하는 기능들을 수행
CWinApp
프로그램 시작
InitInstance( )
무한 루프
나머지 3개의 class도 여기서 만듬
Run( )
ExitInstance( )
프로그램 종료
프로그래밍 응용 #6
12
Windows의 메시지
일반적인 Program
• main의 처음에서 시작하여 main의 끝에서 끝남
Windows Program
• Event-driven program
• Windows XP에서 응용프로그램으로 계속해서 메시지를 보냄
• 응용프로그램에서는 주로 이 메시지를 처리하기 위한 프로그램을 작성함
자주 사용되는 윈도우 메시지들
• WM_CREATE : 윈도우가 생성될 때
• WM_MOUSEMOVE : 마우스 커서가 움직였을 때
• WM_LBUTTONDOWN : 마우스 왼쪽 버튼이 눌렸을 때
• WM_LBUTTONUP : 마우스 왼쪽 버튼이 떼어졌을 때
• WM_LBUTTONDBCLK : 마우스 왼쪽 버튼이 더블 클릭 됐을 때
• …
• 질문 : 마우스를 double click 하면 발생되는 메시지는?
프로그래밍 응용 #6
13
Event Driven 프로그램
Event Drvien
계속해서 메시지가 날라옴
Windows
응용프로그램
(여러분이 작성하는 프로그램)
메시지 무시 또는 처리
공부 열심히 해라!
아침에 일찍 일어나라
숙제 다음 주 까지 해 와라.
심부름 해라
프로그래밍 응용 #6
14
Event Driven 프로그램
메모장 프로그램의 작성
• message 처리를 위해서 해야 할 일
가장 기본적인 메시지 처리기능은 이미
구현이 되어 있음
(예: x를 누르면 프로그램이 종료됨,
마우스로 Window를 이동할 수 있음)
keyboard를 눌렀을 때의 처리 루틴
(글자 저장 및 화면 출력)
메뉴 선택 처리 루틴
여러분이 작성해야 될 부분
프로그래밍 응용 #6
15
CWnd의 class의 메시지 처리기 (멤버함수임)
메시지 처리기
• CWnd의 멤버함수
• 메시지가 발생되면 자동으로 실행됨
• 예:
-
WM_CREATE 메시지 OnCreate
WM_PAINT 메시지 OnPaint
WM_LBUTTONDOWN 메시지 OnLButtonDown
WM_LBUTTONUP 메시지 OnLButtonUp
WM_LBUTTONDBLCLK OnLButtonDblClk
프로그래밍 응용 #6
16
WM_LBUTTONDOWN 메시지 처리 프로그램 추가
View ClassWizard 메뉴 선택
프로그래밍 응용 #6
17
OnLButtonDown 멤버함수가 추가됨
프로그래밍 응용 #6
18
추가된 메시지 핸들러
마우스 왼쪽 버튼이 눌려졌을 때의 메시지 핸들러
• 뼈대가 있고 아무 내용은 없음 어떻게 할 것인지 추가해야됨
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
}
CPoint class
• 멤버 변수 : x, y
• +, - 등의 연산자가 override 되어 있음
- CPoint p1;
- p1.x = 5; p1.y = 76;
프로그래밍 응용 #6
19
OnLButtonDown
마우스 click 된 곳에 사각형을 그림
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
dc.Rectangle(point.x-10,point.y -10,point.x+10,point.y+10);
// Rectangle(x1,y1,x2,y2)
CView::OnLButtonDown(nFlags, point);
}
참고 : 좌표계
(x1,y1)
x
y
프로그래밍 응용 #6
(x2,y2)
20
WM_LBUTTONUP 메시지 처리 프로그램 추가
다음 프로그램은 어떻게 동작하는가?
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.TextOut(point.x-5,point.y-5,"O");
CView::OnLButtonDown(nFlags, point);
}
void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.TextOut(point.x-5,point.y-5,"X");
CView::OnLButtonUp(nFlags, point);
}
프로그래밍 응용 #6
21
멤버변수의 추가
Cview class에 멤버변수 추가
• 멤버변수의 초기화는 어디서 하는가?
프로그래밍 응용 #6
22