[ 교재 ]

열혈강의 Visual C++ 2008 MFC 윈도우 프로그래밍

저자 최호성 / 출판사 프리렉

4장: MFC SDI 어플리케이션 흐름

  1. 코드의 흐름

  • SdiSeq프로젝트 생성(createDemo 예제 참조)
  1. 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)

  1. CSdisSwqView 클래스 속성

  • 추가해야 할 메시지 & 재정의(가상함수)

    Create() : 윈도우 자식 창 만듬

    DestoryWindow() : Cwnd에 연결된 윈도우 창을 소멸

    OninitialUpdate() : 첫째 뷰가 문서에 연결된 후 호출

    PostNcDestroy() : 창이 소멸된후 호출

    WM_CREATE : 창이 만들어지고 있음을 나타냄

    WM_CLOSE : 창 또는 응용프로그램이 종료하도록 신호 보냄

    WM_DESTORY : 창이 소멸되려고 함을 나타냄

    WM_SHOWWINDOW : 창이 숨겨지거나 표시되려고 함을 나타냄

  1. CSdiSeqApp 클래스 속성

  • 추가해야 할 메시지 & 재정의(가상함수)

    ExitInstance() : 응용 프로그램 또는 스레드의 해당 인스턴스를 끝내기 위해 호출

    Run() : 기본 메시지 루프를 제공

  1. 추적점 달기

    해당 함수 시작부분에서 오른쪽 클릭 -> 중단점 -> 추적점 선택

    확인 선택한 다음과 같은 빨간색 마름모모양의 점이 생김

    지금까지 생성한 메시지와 재정의(가상함수)에 전부다 달기

    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함수이기 때문에 달인이 아닌 이상 건들이면 안됨!)

  1. Window area

Client area : 사진 부분

Non-Client area : 액자 부분

  1. Window message processing

API 흔적이 남아있음(WindowProc())

  1. 다양한 방법으로 메시지 처리가능

메인프레임 속성 -> 재정의(가상함수)의 WindowProc 함수 추가

메시지 부분의 OnClose 함수와 가상함수 WindowProc 함수의 차이점

실행후 창을 닫을 때 WindowProc 함수가 먼저 발생한 뒤 OnClose 함수 즉 WM_CLOSE메시지가 발생

또는 가상함수 PreTranslateMessage()를 통해서도 메시지 처리 가능

PreTranslateMessage() : 메시지를 디스패치하기 전에 필터링을 하기 위해 호출

CMainFrame 속성 -> 재정의(가상 함수) PreTranslateMessage() 추가

인자 값으로 메시지 구조체를 받음

위의 if문은 키가 눌러질 떄 메시지 박스 출력

단축키 같은 경우 이 부분에서 처리 가능

  1. 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
,