[MFC] 4장: MFC SDI 어플리케이션 흐름
[ 교재 ]
열혈강의 Visual C++ 2008 MFC 윈도우 프로그래밍
저자 최호성 / 출판사 프리렉
4장: MFC SDI 어플리케이션 흐름
코드의 흐름
- SdiSeq프로젝트 생성(createDemo 예제 참조)
CMainFrame 클래스 속성
- 메시지 : OnCreate()(기본설정), OnClose() 추가
- 재정의(가상함수) : OnCreateClient() 추가
- 언제 실행되는지를 알기 위해 메시지박스를 출력
OnCreate()
OnClose(), OnCreateClient()
- 실행 시 메시지박스 출력순서
- 기타 추가해야 할 메시지 & 재정의(가상함수)
WM_ACTIVATE : 창이 활성화되었을 때 발생
WM_ACTIVATEAPP : 새 작업이 활성화될 때 발생
WM_DESTROY : 창이 소멸되려고 할 때 발생
WM_NCDESTROY : non-client영역이이 소멸할 때 발생
WM_SHOWWINDOW : 창이 숨겨지거나 최소화될 때 발생
LoadFrame() : 윈도우가 만들어질 때 호출
DestroyWindow() : Loadframe()의 반대 개념
PostNcDestroy() : 창이 소멸된 후에 호출(Nc : non-client)
CSdisSwqView 클래스 속성
- 추가해야 할 메시지 & 재정의(가상함수)
Create() : 윈도우 자식 창 만듬
DestoryWindow() : Cwnd에 연결된 윈도우 창을 소멸
OninitialUpdate() : 첫째 뷰가 문서에 연결된 후 호출
PostNcDestroy() : 창이 소멸된후 호출
WM_CREATE : 창이 만들어지고 있음을 나타냄
WM_CLOSE : 창 또는 응용프로그램이 종료하도록 신호 보냄
WM_DESTORY : 창이 소멸되려고 함을 나타냄
WM_SHOWWINDOW : 창이 숨겨지거나 표시되려고 함을 나타냄
CSdiSeqApp 클래스 속성
- 추가해야 할 메시지 & 재정의(가상함수)
ExitInstance() : 응용 프로그램 또는 스레드의 해당 인스턴스를 끝내기 위해 호출
Run() : 기본 메시지 루프를 제공
추적점 달기
해당 함수 시작부분에서 오른쪽 클릭 -> 중단점 -> 추적점 선택
확인 선택한 다음과 같은 빨간색 마름모모양의 점이 생김
지금까지 생성한 메시지와 재정의(가상함수)에 전부다 달기
F5 또는 위와 같은 디버그 아이콘을 클릭하면 프로그램이 실행이 되면서
다음과 같은 출력화면이 보임
다음과 같이 함수의 실행순서가 나옴
알기 쉽게 표현하기 위해 아래와 같은 40개의 단계로 요약
CMainFrame의 OnCreate 함수가 리턴되기 전에 OnCreate 함수가 실행되고 OnCreate 함수가 리턴되기 전까지 그 아래의 함수가 실행됨
WM_QUIT 메시지를 받으면 종료(WM_CLOSE메시지를 받아 아래함수 처리)
실행 순서
1. 응용 프로그램
2. 문서(Document)
3. Main
4. View
WinMain 함수의 실행은 어디서?
F9나 위와 같이 중단점 삽입을 하고 디버그를 시키면 아래의 출력부분의 호출스택을 클릭하면 아래의 그림과 같이 InitCtrls이 실행되기 전까지의 단계를 호출 스택에서 보여줌
호출 스택을 따라가면 InitInstance함수를 AfxWinMain함수가 호출하고 AfxWinMain함수는
_tWinMain함수가 호출함(주의 : AfxWinMain함수는 기존 MFC함수이기 때문에 달인이 아닌 이상 건들이면 안됨!)
Window area
Client area : 사진 부분
Non-Client area : 액자 부분
Window message processing
API 흔적이 남아있음(WindowProc())
다양한 방법으로 메시지 처리가능
메인프레임 속성 -> 재정의(가상함수)의 WindowProc 함수 추가
메시지 부분의 OnClose 함수와 가상함수 WindowProc 함수의 차이점
실행후 창을 닫을 때 WindowProc 함수가 먼저 발생한 뒤 OnClose 함수 즉 WM_CLOSE메시지가 발생
또는 가상함수 PreTranslateMessage()를 통해서도 메시지 처리 가능
PreTranslateMessage() : 메시지를 디스패치하기 전에 필터링을 하기 위해 호출
CMainFrame 속성 -> 재정의(가상 함수) PreTranslateMessage() 추가
인자 값으로 메시지 구조체를 받음
위의 if문은 키가 눌러질 떄 메시지 박스 출력
단축키 같은 경우 이 부분에서 처리 가능
PostMessage와 SendMessage 차이점
PostMessage : 메시지 큐에 들어가 루프를 통해 차례대로 전달
SendMessage : 메시지 큐를 거치지 않고 직접적으로 WindowProc 함수 호출
- PostMessage와 SendMessage 함수 호출 예제
CHellowSdiView 클래스 속성 -> 메시지 WM_LBUTTONDBLCLK 추가
View윈도우에서 메인윈도우로 메시지를 보내기 위해 AfxGetMainWnd() 사용(전역함수)
PostMessage의 경우 메시지 큐에 추가하고 리턴
SendMessage의 경우 WindowProc 함수에 직접적으로 접근하여 리턴할 때까지 Send Message 리턴하지 않음
가능하면 PostMessage를 사용
결론적으로 프로그램이 죽음
- 디버그를 이용한 오류 잡기
F5 키를 눌러 디버깅을 하면
호출 스택에 어느 부분을 실행하다가 오류가 났는지 알 수 있음
'프로그래밍 실습 > MFC' 카테고리의 다른 글
[MFC] 6장: 마우스 입력 (0) | 2011.02.25 |
---|---|
[MFC] 5장: 키보드 입력 (1) | 2011.02.16 |
[MFC] 3장: MFC 프로그램 기본 구조 (0) | 2011.02.16 |
[MFC] 2장: CWnd 클래스 (0) | 2011.02.16 |
[MFC] 1장: 윈도우 프로그래밍 모델 (0) | 2011.02.16 |