160114_한상훈.

Download Report

Transcript 160114_한상훈.

Pride
Power
P3 in VISION laboratory…
Passion
3nd week Presentation
Vision System Lab, Sang-Hun Han
Plan
• 주차 별 일정
Week
Class
발표자
1주차
Introduction, VS C++ 1
한상훈
2주차
VS C++ 2, MFC 1
한상훈
3주차
MFC 2
한상훈
4주차
MFC 3
한상훈
5주차
OpenCV 1
한상훈
6주차
OpenCV 2
한상훈
8주차
영상처리 1
한상훈
9주차
영상처리 2
한상훈
CWinApp 클래스
• CWinApp 클래스의 구조
– 프로그램이 시작되면 CWinApp 클래스의 인스턴스가 생성되고, 다음과 같이 세 개
의 멤버함수가 차례로 호출되는 구조
InitInstance( );
// 프로그램이 실행되면 InitInstance 함수가 잠깐
Run( );
// 실행되고 Run 함수에서 계속 머무르고 있다가
ExitInstance( ); // 끝나기 직전에 ExitInstance가 잠깐 실행 후 종료
– 여기서 Run 함수는 무한루프를 돌면서 메시지를 처리하는 기능을 하고 있는데, 프로
그램을 종료하라는 메시지인 WM_QUIT 메시지를 만나면 무한루프를 빠져나옴
CWinApp 클래스
• CWinApp 클래스의 활용
– 프로그램은 만들 때는 CWinApp 클래스에서 상속을 받아 파생 클래스를 만듬
– 예를 들어 CMyApp 라는 클래스를 만들었을 때 프로그램은 아래와 같이 수행
CWinApp
프로그램 시작
InitInstance( )
무한 루프
Run( )
ExitInstance( )
프로그램 종료
CWinApp 클래스
• CWinApp 클래스의 활용
– 일반적으로 CWinApp로부터 상속 받는 클래스는 InitInstance 함수를 재정의하고 여
기에 프로그램을 초기화하는 루틴을 넣음
– 아주 특수한 경우가 아니면 Run 함수를 재정의하는 일은 거의 없음
상속
CMyApp
CWinApp
CWinApp
프로그램 시작
InitInstance( )
무한 루프
Run( )
ExitInstance( )
프로그램 종료
InitInstance( )
CWinApp 클래스
• CWinApp 클래스의 활용
– ExitInstance 함수는 재정의된 InitInstance 함수에서 메모리를 할당 받았거나, 프로
그램을 종료할 때 이를 해제 시켜야 하는 필요성이 있을 때만 재정의
상속
CMyApp
CWinApp
CWinApp
프로그램 시작
InitInstance( )
무한 루프
InitInstance( )
Run( )
ExitInstance( )
프로그램 종료
ExitInstance( )
CWnd 클래스
• CWnd 클래스의 역할
– 윈도우라는 오브젝트를 클래스로 구현한 것
– 이 클래스는 약 300 개의 멤버 함수들을 가지고 있는데, 크게 두 부류로 나뉨
•
•
1. 윈도우의 크기, 위치, 모양, 상태 등을 제어하는 함수(약 100 개)
2. 메시지 처리기라고 불리는 멤버 함수로써, 윈도우에서 발생하는 메시지를 처리하는 함수(약 200 개)
윈도우 운영체제
메시지
메시지 큐
{
while(msg !=WM_QUIT){
…
switch(msg){
case WM_CREATE:
OnCreate( );
break;
switch(msg){
case WM_CREATE:
OnCreate( );
break;
switch(msg){
case WM_CREATE:
OnCreate( );
break;
…
}
WM_MOUSEMOVE
WM_PAINT
WM_ACTIVATE
WM_CREATE
차례로 꺼내서 처리함
}
CDocument 클래스
• CDocument 클래스의 역할
– 프로그램에서 처리하는 데이터를 읽고 쓰는 처리하는데 필요한 모든 기능을 수행하
는 눈에 보이지 않는 오브젝트
–
–
–
–
–
–
CDocument 클래스의 기능
1. 파일로부터 데이터를 읽어오는 기능(파일 | 열기 메뉴의 기능)
2. 파일에 데이터를 저장하는 기능(파일 | 저장 메뉴의 기능)
3. 새로운 데이터를 만드는 기능(파일 | 새로 만들기 메뉴의 기능)
4. 작업 중인 데이터를 닫는 기능(파일 | 닫기 메뉴의 기능)
5. 데이터가 변경된 사실을 뷰 오브젝트에 알리는 기능
AppWizard
• AppWizard
ClassView 와 FileView
• ClassView
– ClassView는 현재 프로젝트를 구성하는
클래스들의 목록을 보여줌
– 각각의 클래스는 트리 형태로 되어 있고,
트리의 각 항목을 열면 그 아래에 추가적
인 정보들을 볼 수 있음
– 분홍색 육면체는 멤버 함수를 나타내고
하늘색 육면체는 멤버 변수를 나타냄
ClassView 와 FileView
• FileView
– FileView는 현재 프로젝트를 구성하는 파
일들의 목록을 볼 수 있음
– 클래스의 선언부는 확장자가 *.h인 헤더
파일에 저장되고, 멤버 함수의 구현은 확
장자가 *.cpp인 소스 파일에 저장됨
– 각 클래스는 헤더 파일과 소스 파일을 하
나씩 갖게 됨
Project 파일
• AppWizard가 생성한 프로젝트 디렉터리를 보면, *.dsw 파일과 *.dsp인
파일이 있는데 이것이 바로 여러 개의 소스 파일과 헤더 파일들을 하나
의 프로젝트로 엮어주는 역할을 함
• *.dsp인 파일을 프로젝트 파일이라고 하는데, 하나의 프로젝트 파일은
하나의 실행 파일을 만들어 냄
• 확장자가 *.dsw인 파일을 워크스페이스 파일이라고 하는데, 하나의 워
크스페이스 파일은 여러 개의 프로젝트 파일을 포함할 수 있음
살 붙이기
• MFC가 제공하는 프로그램의 뼈대에 살을 붙이는 방법
– 프로그램의 뼈대에 존재하는 기능의 수정 및 보강 : 파생 클래스에서 기반 클래스의
멤버 함수를 재정하는 것을 말함. 즉, MFC에서 상속을 받아 파생 클래스를 만듦으로
써 프로그램의 뼈대를 구현하고, 기반 클래스에서 상속 받은 기능 중에 수정해야 할
부분이 있다면 재정의를 통해 그 부분만 원하는 방향으로 수정하거나 기능을 추가
– 프로그램의 뼈대에 없는 새로운 기능의 추가 : MFC에서 상속 받아 만들어진 클래스
에 새로운 멤버 함수나 멤버 변수를 추가하는 것을 말함
기능의 수정 및 보강
• 멤버 함수 재정
– ClassWizard : 재정의 가능한 함수를 객관식으로 선택할 수 있게 해줌
기능의 수정 및 보강
• 멤버 함수 재정의
– ClassWizard : 재정의 가능한 함수를 객관식으로 선택할 수 있게 해줌
이를 통해 윈도
우 메시지 처리
기를 재정의 할
수 있음
주의 : 메시지 처리기는 CWnd 클래스에 있는 것이므로 상승 계층 구조에서 CWnd 클래스의 아래쪽에 있는 클래스
에 대해서만 메시지 처리기를 재정의해서 사용할 수 있음
기능의 수정 및 보강
• 멤버 함수/변수 추가
기능의 수정 및 보강
• 이벤트 처리기 추가
– 사용자가 메뉴나 액셀러레이터(단축키)를 누르면 프로그램에 이벤트가 발생
– 이 이벤트를 처리하는 함수를 만들어두면, 특정 메뉴나 액셀러레이터가 눌릴 때마다
실행되는 함수를 만들 수 있음
기능의 수정 및 보강
• 이벤트 처리기 추가
– 이벤트 처리기를 추가하면 메시지 처리기를 추가했을 때와 마찬가지로 코드 상에 다
음과 같은 세 가지 변화가 발생
// 1. 헤더 파일에 함수 선언
class CTestView : public Cview
{
afx_msg void OnFileOpen( );
};
// 2. 소스 파일에 함수의 껍데기가 만들어짐
void CTestView::OnFileOpen( )
{
//TODO: Add your command handler code here
}
// 3. 이벤트 ID와 그 이벤트가 발생되었을 때 실행될 함수가 등록됨
BEGIN_MESSAGE_MAP(CTestView, Cview)
…
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
END_MESSAGE_MAP( )
프로그램의 뼈대 구조 이해
• AppWizard(single document)
CObject
CCmdTarget
CWinApp
CDrawXApp
CDocument
CDrawXDoc
CWnd
CFrameWnd
CMainFrame
CView
CDrawXView
DrawX
• 프로젝트 생성
DrawX
• MFCDrawXView.h 에 그림1과 같이 DrawX(Cpoint point); 함수를 추가
• MFCDrawXView.cpp 에 그림2와 같이 DrawX(Cpoint point); 구현
그림 1
그림 2
DrawX
• 클래스마법사를 열고 그림1과 같이 WM_LBUTTONDOWN 을 더블 클
릭
• 자동으로 MFCDrawXView.h 에 그림2와 같이 자동으로 생성
그림 1
그림 2
DrawX
• MFCDrawXView.cpp 에도 자동으로 아래와 같이 생성
• 아래와 같이 OnLButtonDown 구현
DrawX
• 디버깅 후 실행하면 아래와 같이 window 클릭 시, X 생성
• 하지만 창을 최소화하거나 변화시키거나 다른 프로그램을 실행시켜 가
렸을 경우 X가 지워지는 것을 볼 수 있음
DrawX
• 깨진 화면의 복원 방법
– 메뉴나 마우스 커서의 화면 복원 방법
•
마우스 커서나 메뉴는 화면에서 자신의 밑에 깔리게 되어 지워지는 부분을 메모리에 기억해 뒀다가, 나중
에 그 부분을 복원할 때 사용
– 일반 윈도우의 화면 복원 방법
•
윈도우에 변경사항이 있을 때 운영체제는 그 윈도우로 WM_PAINT 메시지를 보내어 화면에 표시할 내용을
다시 그려줘야만 화면에 항상 제 모습으로 유지
– OnPaint 메시지 처리기
•
•
WM_PAINT 메시지를 처리하는 메시지 처리기는 OnPaint 함수임
따라서 이 함수에 현재 그 윈도우의 모습을 화면에 출력하는 루틴을 추가
– OnDraw 멤버 함수
•
•
CView 클래스의 파생 클래스에서 작업할 때 만큼은 특별히 OnPaint 함수 보다는 OnDraw 함수를 쓰는 것
이 더 좋음
아래와 같은 구조를 보이기 때문임(상관은 없지만, 프린터 출력 기능을 지원시는 OnDraw를 사용하는 것
이 좋음)
CView
CWnd
OnPaint
OnDraw
DrawX
•
•
•
•
CMFCDrawXDoc.h 에 데이터 저장을 위한 멤버 변수 추가
점들을 저장하기 위한 배열 : CPoint m_ptDate[100];
점의 개수를 세기 위한 변수 : int m_nCount;
CMFCDrawXDoc.cpp 에 추가된 멤버 변수 초기화(그림 2)
그림 1
그림 2
DrawX
• CMFCDrawXView.cpp 의 OnLButtonDown 함수 그림1과 같이 구현
• CMFCDrawXView.cpp 에 OnDraw 함수 그림2와 같이 구현
그림 2
그림 1
DrawX
• 이벤트 처리
– 리소스 편집 : 헤더 파일과 소스 파일 외에 사용자 인터페이스를 만드는데 사용, 여
러 가지 파일들을 통틀어 말함
– Caption은 화면에 출력되는 메뉴 항목의 이름, ID는 프로그래밍에 사용
DrawX
• 이벤트 처리
– 프로그램 실행 중에 메뉴가 선택되면, WM_COMMAND 라는 윈도우 메시지가 발생
하고, 어떤 메뉴가 눌렸는지 구별하기 위해 메뉴의 ID가 윈도우 메시지의 WPARAM
을 통해 추가 적인 정보로 전달
– WM_COMMAND 메시지는 일반 윈도우 메시지와는 다른 방식으로 처리 되기 때문
에 특별히 이벤트라고 불림
– WM_COMMAND 를 받는 기능은 CCmdTarget 클래스에 구현되어 있으므로 프로그
램의 뼈대를 이루는 클래스는 모두 WM_COMMAND를 받아서 처리 할 수 있음
– 일반적인 윈도우 메시지의 처리는 CWnd 클래스에 포함
WM_COMMAND 메시지(이벤트) 전달 순서
CView
파생 클래스
CDocumend
파생 클래스
CFrameWnd
파생 클래스
CWinApp
파생 클래스
DrawX
• 이벤트 처리
– EX) 데이터 보기에 관련된 커맨드 처리
같은 방법으로 원래대로 보기 메뉴 추가
DrawX
• 이벤트 처리
– 이벤트 처리기 생성(클래스마법사), 클래스 이름 CMFCDrawXView 로 설정하여 생
성
– CMFCDrawXView.cpp 에 생성된 것을 확인할 수 있음
DrawX
• 이벤트 처리
– CMFCDrawViwe.h 에 크기 조정을 위한 멤버 변수 int m_nMag 추가(그림1)
– CMFCDrawView.cpp의 생성자에 m_nMag = 1 로 초기화(그림2)
그림 1
그림 2
DrawX
• 이벤트 처리
– CMFCDrawView.cpp 에 OnReduction과 OnMagnify를 아래와 같이 구현
– CMFCDrawView.cpp 에 DrawX(CPoint point) 함수 아래와 같이 수정
DrawX
• 이벤트 처리
– 메뉴에서 생성한 메뉴를 선택하면 X가 커지거나 원래대로 돌아오는 것을 볼 수 있음