호서대학교 컴퓨터공학
1
Microsoft Foundation Class
고급 프로그래밍 Chapter 4 MFC 코드의 흐름
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작
응용 프로그램의 시작되는 시점
응용 프로그램을 실행시켜 메시지 루프가 활성화 되는 시점 .
메시지 루프가 활성화 된 상태에서는 모든 초기화가 끝남 .
모니터 상에서 응용 프로그램의 출력 상태를 확인할 수 있음 .
응용 프로그램의 시작 함수
윈도우 응용 프로그램의 시작은 모두 WinMain() 함수로 시작 .
InitInstance() 함수는 내부적으로 WinMain() 함수를 호출함 .
MFC 에서는 WinMain() 함수를 수정할 필요도 할 수도 없음 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작
InitInstance() 함수
응용 프로그램의 초기화와 관련된 코드를 넣을 수 있음 .
InitInstance() 함수에서 설정 가능한 내용 . •
응용프로그램의 설정 정보 로딩 ( 윈도우 크기 , 옵션 , 스타일 등 )
•
응용 프로그램의 중복 실행 방지
•
시험 버전의 기간 검사 루틴
•
운영체제 버전의 확인과 프로그램 실행 허용 여부
•
프로그램 사용자의 인증 ( ID / PASSWORD )
•
프로그램 실행 시 인자로 전달되는 파라미터 처리 등
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작
응용 프로그램의 생성되는 순서
CSdiSeqDoc 클래스 객체 생성 .
CMainFrame 클래스 객체 생성 .
CSdiSeqView 클래스 객체 생성 .
각 클래스들간의 호출
실행되는 함수들은 내부적으로 다른 클래스의 함수를 호출 .
직접적인 함수 호출과 메시지 발생을 이용한 호출이 있음 .
WM_CRATE 메시지에 의해 실행된 OnCreate() 함수는 OnCreateClient() 함수를 호출 함 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12:
Function: CSdiSeqApp::CSdiSeqApp( ) Function: CSdiSeqApp::InitInstance( ) Function: CSdiSeqDoc::CSdiSeqDoc(void) Function: CMainFrame::CMainFrame(void) Function: CMainFrame::LoadFrame( ) Function: CMainFrame::PreCreateWindow( ) Function: CMainFrame::PreCreateWindow( ) Function: CMainFrame::OnCreate( ) Function: CMainFrame::OnCreateClient( ) Function: CSdiSeqView::CSdiSeqView( ) Function: CSdiSeqView::Create( ) Function: CSdiSeqView::PreCreateWindow( )
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
Function: CSdiSeqView::OnCreate( ) Function: CSdiSeqView::OnShowWindow( ) CMainFrame::OnCreateClient( ) - Return CMainFrame::OnCreate( ) – Return Function: CSdiSeqDoc::OnNewDocument( ) Function: CSdiSeqView::OnInitialUpdate( ) Function: CMainFrame::OnActivateApp( ) Function: CMainFrame::OnActivate( ) Function: CMainFrame::OnShowWindow( ) Function: CSdiSeqView::GetDocument( ) Function: CSdiSeqApp::Run( )
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작
InitInstance( )
MFC 에서 매우 중요한 함수 .
응용 프로그램이 초기화되는 부분이며 , 이와 관련한 코드들이 집결 되는 곳 ( 윈도우 크기 , 옵션 등 ).
OnCreate( )
WM_CREATE 메시지를 받았을 때 호출되는 메시지 핸들러 .
LoadFrame() 함수가 호출되면 자동으로 발생 .
OnCreateClient() 함수를 호출 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작
OnCreateClient( )
상위 클래스의 명시적 호출로 인해 호출되는 함수 .
클라이언트 뷰를 생성 .
Create() 함수를 호출 .
OnInitialUpdate( )
WM_INITALUPDATE 메시지에 의하여 동작하는 핸들러 .
클라이언트 뷰의 생성이 완료되면 응용 프로그램의 프레임 윈도우는 자신의 클라이언트 뷰에 메시지 전달 .
새로운 문서가 열릴 때마다 호출 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작
Run( )
응용 프로그램 객체의 메시지 루프를 시작하는 함수 .
내부적으로 PeekMessage() 함수를 호출하여 자신에게 메시지가 있 는지 없는지를 검사 함 .
OnIdle() 함수는 메시지 큐가 비었을 때 호출되는 함수 .
비어있는 메시지 큐에 메시지가 발생하면 PumpMessage 멤버 함수 를 호출 .
PumpMessage 함수는 CWinThread 의 멤버 함수로써
:: GetMessage, ::TranslateMessage, ::DispatchMessage 등의
함수를 루프를 돌면서 호출 함 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. MFC 응용 프로그램의 종료
응용 프로그램의 종료되는 시점
WM_QUIT 메시지를 받아 메시지 루프가 종료 되는 시점 .
Alt + F4, 닫기 버튼 (X), 파일 - 종료 등의 이벤트에 의해 발생 .
WM_CLOSE, WM_DESTROY 메시지와 같은 역할을 함 .
응용 프로그램의 종료되는 순서
종료 할 응용프로그램을 활성화 시킴 .
자식 윈도우를 먼저 종료하고 부모 윈도우가 종료 됨 .
응용 프로그램 초기화의 역순으로 종료 됨 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. MFC 응용 프로그램의 종료 24: Function: CMainFrame::OnClose( ) 25: Function: CMainFrame::OnShowWindow( ) 26: Function: CMainFrame::OnActivate( ) 27: Function: CMainFrame::OnActivateApp( ) 28: Function: CMainFrame::DestroyWindow( ) 29: Function: CMainFrame::OnDestroy( ) 30: Function: CSdiSeqView::OnDestroy( ) 31: Function: CSdiSeqView::PostNcDestroy( ) 32: Function: CSdiSeqView::~CSdiSeqView( ) 33: Function: CMainFrame::OnNcDestroy( ) 34: Function: CMainFrame::PostNcDestroy( )
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. MFC 응용 프로그램의 종료 35: Function: CMainFrame::~CMainFrame( ) 36: CMainFrame::OnNcDestroy( ) - Return 37: Function: CSdiSeqDoc::~CSdiSeqDoc( ) 38: CMainFrame::OnClose( ) - Return 39: Function: CSdiSeqApp::ExitInstance( ) 40: CSdiSeqApp::Run( ) - Return
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작
OnClose( )
Alt +F4, 닫기 버튼 (X), 파일 - 종료를 누를 때 발생되는 WM_CLOSE 메시지에 의해 호출되는 함수 .
OnClose() 함수가 호출될 때 자원의 반납이나 차일드 윈도우의 내용 을 저장하는 일 발생 .
최상위 윈도우인 프레임 윈도우에 붙어 있는 차일드 윈도우들이 이 시점에서 파괴 .
내부적으로 DestroyWindow() 함수를 호출하여 WM_DESTROY 메 시지를 발생시키고 OnDestroy() 함수를 호출함 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작
OnDestroy( )
DestroyWindow() 함수가 보낸 WM_DESTROY 메시지를 받아 호출 되는 핸들러 .
OnClose() 나 OnDestroy() 함수와 비슷함 .
OnDestroy() 함수에서 클라이언트 뷰와 같은 차일드 윈도우의 파괴 가 시작 .
차일드 윈도우에 WM_DESTROY 메시지를 보내서 파괴를 알림 .
OnNcDestroy( )
PostNcDestroy() 함수는 Non-Client 영역을 파괴 함 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. MFC 응용 프로그램의 시작
ExitInstance( )
모든 객체들이 소멸한 가운데 응용 프로그램의 최종 종료에 앞서서 마지막으로 호출되는 함수 .
응용 프로그램의 설정을 저장한다거나 중복 실행 방지를 위해 획득 했던 시스템 리소스를 반납 하거나 메모리를 해제 하는 등 최종 마무 리 작업 시행 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 3. 윈도우 영역의 구분 Client view window Client area
Non-client area Frame window Client area
Non-client area
호서대학교 컴퓨터공학
Microsoft Foundation Class 4. 메시지의 발생과 처리
MFC 에서의 메시지
하나의 메시지에 대해 여러 곳에서 처리가 가능 .
메시지는 메시지 핸들러 함수를 등록하여 처리 .
메시지를 처리만 하는 것이 아니라 직접 메시지 발생 가능 .
메시지 핸들러를 이용한 메시지 처리 예
WM_CREATE = 메시지 핸들러로 OnCreate() 함수 등 록.
WM_CLOSE = 메시지 핸들러로 OnClose() 함수 등록 .
WM = 윈도우 메시지 , On = 윈도우 메시지 처리 함수 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 4. 메시지의 발생과 처리 메시지 탭
윈도우 메시 지 함수 등록 호서대학교 컴퓨터공학
Microsoft Foundation Class 4. 메시지의 발생과 처리
SendMessage() 함수
보내고자 하는 메시지를 메시지큐에 추가하지 않음 .
메시지와 관련된 함수를 직접적으로 호출하고 결과를 반환 .
PreTranslateMessage() 함수를 이용하여 필터링 할 수 없음 .
PostMessage() 함수
보내고자 하는 메시지를 메시지큐에 추가하는 함수 .
메시지 큐에 메시지를 추가하면 반환 .
PreTranslateMessage() 함수를 이용하여 필터링 할 수 있음 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 4. 메시지의 발생과 처리 Message queue 2
1 A
B
C
PostMessage()
D
SendMessage() Message loop 3
CMainFrame CMainFrame::PreTranslateMessage() 4 CMainFrame::WindowProc() 5 CMainFrame message handler function
호서대학교 컴퓨터공학
Microsoft Foundation Class Q&A
Q&A 호서대학교 컴퓨터공학