티스토리 뷰
MFC란?
- Microsoft사에서 만든 C++기반 윈도우 라이브러리이다.
- Win32 API 는 C기반이지만 MFC Programming은 C++ 기반이다.
왜 MFC를 사용하는가?
- 객체지향 (코드의 재사용)
- 다양한 함수 제공한다.
- MFC Framework에 Win32 API를 섞어 사용 (사실 Win32 API를 클래스화하여 wrapping한 것으로도 봄)
CWnd Class (중요)
- CWnd는 MFC의 부모라 불리는 CObject 클래스와 CCmdTarget 클래스를 상속받은 클래스이다.
- CCmdTarget 클래스는 메세지 맵과 관련된 코드가 구 현된다. ( WinProc()의 switch case문을 대체하고 자 도입된 MFC구조이다.)
- CWnd는 MFC가 제공한 모든 윈도우 클래스의 기본 기능이다.
- Windows 자체를 객채화한 클래스이다보니 CWnd 객체를 선언하여 초기화하고 생성하면 화면에 창이 뜨는거와 같다.
함수 |
역할 |
Create() / CreateEx() |
둘 다 윈도우를 생성하는 함수이다. CreateEx()는 추가로 확장 속성을 갖고있다. |
PreCreateWindow() |
윈도우를 생성하기 직전 호출되는 가상 함수로 재정의하여 생성되는 윈도우의 속성을 변경하는 코드를 추가할 수 있다. |
GetStyle() / GetExStyle() |
윈도우의 기본 스타일과 확장 스타일을 반환하는 함수이다. |
PreSubclassWindow() |
서브 클래싱 직전에 호출되는 가상 함수이다. |
GetSfeHwnd() |
생성된 윈도우의 핸들을 반환하는 함수이다. |
MFC 마법사로 생성한 프로젝트의 기본 클래스 구조
- CAboutDlg = 제품 정보를 출력하는 대화 상자 클래스이다.
- CMainFrame = 툴바와 상태바를 생성한다.
- C프로젝트App, C프로젝트Doc 클래스는 응용 프로그램 자체와 문서를 객체화한 클래스이다.
예제 어디를 살펴봐도 WInMain(()함수나 그 비슷한 함수를 찾을 수없다. 하지만 프로젝트.cpp 파일을 열면 theApp라는 전역 객체가 선언된것을 확인할 수 있다.
CWinApp class
- CWnd 클래스와 마찬가지로 CCmdTarget 클래스를 상속받다가 CWinThread 클래스를 상속받는다.
- CWinApp 클래스는 응용 프로그램 자체를 의미하는 클래스임이다.
멤버 변수 |
의미 |
m_hInstance |
현재 응용 프로그램의 인스턴스 핸들이다. WinMain() 함수의 첫번째 파라미터인 hInstance와 같은 것이다. |
m_lpCmdLine |
WinMain() 함수의 lpCmdLine 파라미터와 가 ㅌ은 것입니다. 프로그램을 실행하였을 때 명령줄 정보가 들어 있다. |
m_nCmdShow |
WinMain() 함수의 마지막 파라미터인 nCmdShow와 같은것 |
m_pAcitveWnd |
응용 프로그램의 최상위 프레임 윈도우에 대한 포인터. SDI 구조에서 이 값은 CMainFrmae 클래스의 객체 포인터이다. |
m_pszAppName |
응용 프로그램의 제목에 해당하는 문자열 포인터이다. |
m_pszExeName |
빌드한 실행 파일에서 활장자(.exe)를 제외한 파일명이다. |
- CWinApp 클래스에는 다양한 메서드가 있는데 이중 InitInstance(), ExitInstance(), Run() 메서드는 반드시 알아야한다.
- CWinApp 클래스의 Run() 메서드가 호출되는 시점 메시지 루프가 시작되는 시점이다. Run() 메서드가 반환하면 응용 프로그램은 종료된다 이건 Win32 API에서 WM_QUIT 메시지가 발생한것과 같다.
- InitInstance() 메서드는 응용 프로그램이 초기화되는 시점에서 호출된다. 그리고 대부분 재정의되어 있으며, 직접 코드 수정이 가능. 프로그램의 시작과 동시에 메모리를 할당한다든지, 시 스템 리소스를 할당받아야 한다면 여기에 넣는게 바람직
- ExitInstance() 메서드는 응용 프로그램을 종료하는 시점에서 호출된다. Run()함수가 반환되는 시점에서 호출이 된다. 메모리나 시스템 리소스 반환하는 코드는 여기게 넣는게 보편적
CFrameWnd class
- SDI 문서/뷰 구조를 갖는 MFC 응용 프로그램을 개발할 대 최상위 프레임 윈도우에 해당하는 CMainFrame이며 이 클래스는 CFrameWnd 클래스를 상속받아 마든다.
- MDI에서는 CMDIFrameWnd 클래스로 대체된다.
- CFrmaeWnd 클래스는 프레임이 있는 윈도우가 가져야 할 기본 기능을 정의한 클래스라 할 수 있다.
- 도구 모음이나, 상태표시줄 같이 특수한 윈도우를 자 식 윈도우로 취할 수 있다.
- OnCreate() 메서드는 WM_CREATE 메시지 핸들러 함수이다. 메인 윈도우가 생성되는 시점에서 호출되는 함수라는 뜻.그리고 그 시점에서 자신의 자식 윈도우인 도구모음, 상태표시줄을 생성한다.
CDocument class
- MFC는 문서와 관련된 처리를 개발자가 논리적으로 분리할 수 있도록 CDocument 클래스를 제공한다.
- 이클래스는 다양한 가상함수를 제공하여 개발자로 하여금 자료를 처리할 수있도록 도와준다. 예를 들어 사용자가 파일 열기 메뉴를 선택하여 파일을 열면 자동으로 어떤 함수가 호출하도록 구조적으로 지원한다.
- OnNewDocument() 문서가 오픈되었을 경우 실행되는 메서드.
- SetModifyiedFlag() 문서가 변경되었음을 설정/해제하는 역할을 한다.
- 이외에도 OnOpenDocument(), OnCloseDocument(), OnSaveDocument() 등.
메세지 맵
- Win32 API 윈도우 프로시저 함수에서 볼 수있는 switch case를 대체하는 역할이다.
- 특정 메세지가 발생했을때 어떤 함수를 호출해야하는지 명시하는 매크로의 집합체이다.
//CMain Frame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
- BEGIN_MESSAGE_MAP() 매크로와 END_MESSAGE_MAP() 매크로를 이용하여 시작과 끝을 명시한다. ON_WM_CREATE() 매크로는 WM_CREATE()메시지 핸들러 함수를 등록할 경우 추가되는 매크로이다. Visual C++을 이용하면 메시지맵을 직접 손대는 경우는 흔하지 않으며 보통은 Wizard를 통해 변경된다.
- Win32 API를 단순 클래스 포장한것에 지나지 않는다는 평가를 받기도 하지만 Win32 API구조를 훌륭한 방법으로 객체지향적인 구조로 바꿔 주는 것 중 하나가 메시지 맵이라고 평하해도 과언이 아니다.
-결국 특정 메시지가 바 ㄹ생하면 우리가 최종적으로 재정의한 함수를 호출하며, 이 함수에서는 재정의된 상위 계층의 함수를 명ㅈ시적으로 호출함으로써 MFC의 코드와 우리가 작성한 코드 모두가 동작한다.
'C++ > MFC Programming' 카테고리의 다른 글
윈도우 기반 MFC Socket 프로그램 구현 (서버/클라이언트) (0) | 2018.05.11 |
---|---|
TCP/IP 소켓 프로그래밍 간단 설명 (0) | 2018.05.06 |
커널 객체와 동기화 (크리티컬 섹션, 뮤텍스와 데드락, 세마포어) (0) | 2018.05.04 |
CSV Format 규칙 (0) | 2018.04.30 |
멀티스레드 (0) | 2018.04.29 |
- Total
- Today
- Yesterday
- 대항해시대 다음 런처
- JNI
- 폴더선택다이얼로그
- 위대한 쇼맨
- 위대한 쇼맨 후기
- JNI INVOKE
- 대항해시대 런처
- OSI 7Layer
- vite.js
- 정보처리기사 실기 후기
- 다클 빈
- 데스큐어
- 다클 코드
- 대항해시대
- Linux
- JNI 시그니처
- EACCES: permission denied
- HTTPie
- 대항해시대 다클
- JNI SIGNITURE
- lxd
- 위대한 쇼맨 ost
- React.js
- 구글 클라우드 플랫폼
- 빈파일
- 대항해시대 로그인
- 대항해시대 넷마블 런처
- 합격 후기
- 정보처리기사 2018 2회
- 정처기 실기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |