{{|

|}}

1. MFC?

Microsoft Foundation Classes 를 줄여서 부른다. 기정의된 클래스의 집합으로 Visual C++이 이 클래스들을 가반으로 하고 있다. 이 클래스 군은 MS Windows API를 래핑(Wrapping)하여서 객체지향적 접근법으로 프로그래밍을 하도록 설계되어 있다. 예전에는 볼랜드에서 내놓은 OWL(Object Windows Library)라는 것도 쓰였던 걸로 아는데... -_-; 지금은 어디로 가버렸는지 모른다. ㅋㅋ

2. MFC notation

MFC의 클래스들은 CDocument, CView와 같이 C로 시작하는 이름을 갖는다. 데이터 멤버들에는 m_ 라는 접두어를 붙여서 만들어져 있다. 변수의 이름앞에 p, i, l, h 등을 이용해서 그 종류를 변수의 이름으로 추정가능하게 하는 헝가리안표기법을 이용한다. 이는 과거 C환경하에서 형식 검사기능의 부재로 인한 에러를 막기위해 고안된 측면이 크기 때문에 C++에 들어와서는 반드시 필요한 표기법은 아니다.

3. Simple MFC Window


~cpp 
#include <afxwin.h>		//about class library
class CExApp : public CWinApp {
public:
	virtual BOOL InitInstance();
};

class CExWnd : public CFrameWnd {
public:
	CExWnd() {
		Create(0, "MFC Application");	// 기본설정으로 "MFC Application"이라는 타이틀을 가진 프레임을 생성한다
	}
};

BOOL CExApp::InitInstance(void) {
	m_pMainWnd = new CExWnd;			// 생성된 프레임을 윈도우에 붙인다.
	m_pMainWnd->ShowWindow(m_nCmdShow);
	return TRUE;
}

CExApp Application;						// 운영체제가 윈도우를 만들기위해서는 이를 참조할 전역 변수가 필요하다.

//WinMain() 함수는 MFC 의 클래스 안에 구현이 되어있기 때문에 API로 윈도우를 만들때보다 간편하게 작성하는 것이 가능하다.
simple_mfc_window_showing.JPG

''컴파일 해보고자 하는 분들은 Project/Setting/General 항목에서 MFC DLL을 사용한다는 설정을 해야한다.
그러지 않을 경우 링커가 다음의 에러를 발생시킨다.
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
Debug/ex13_01.exe : fatal error LNK1120: 2 unresolved externals''
Upload:simple_mfc_painter.rar

4. 추천서적

[ISBN-1572316950] [ISBN-0201407213] [ISBN-8931427301] [ISBN-0764543881]
인내심없이 번역서 읽으면 안되는 책. Wrox BegVC++6 내용의 진행방법은 Ivor 할아버지 답게 재미있다.
[ISBN-1556227043] [ISBN-1572313498] [ISBN-0672314924] [ISBN-0201634465]
Com/Dcom PrimerPlus 는 현재 절판. 곽용재씨가 이름을 날리게 된 계기가 된 아주 잘 번역된 책중의 하나

5. 추천 사이트

Code Project(http://www.codeproject.com/)
DevPia(http://www.devpia.com/)

6. Document & View

6.1. Document

하나의 단위로서 다루어지는 프로그람안에 존재하는 프로그램 데이터의 레이블 정도로 생각하면 편하다. MFC에서는 이를 CDocument 라는 클래스로 제공하고 프로그래머는 이 클래스를 상속받아서 자기가 필요한 데이터형을 정의하고 그 데이터를 처리할 메소드를 작성하게 된다.
이를 사용하면 데이터의 저장, 검색에 있어서 MFC가 제공하는 표준적인 메카니즘을 이용하는 것이 가능해진다.

응용프로그램에서 document를 몇개를 다루느냐에 따라서 SDI(single document interface), MDI(multiple document interface)로 구분하여 사용한다.

6.2. View

View는 도큐먼트에 존재하는 데이터의 집합체를 우리가 원하는 방식으로 표현하는 메카니즘이 구현된 객체이다. document 와 마찬가지로 CView라는 클래스를 상속하여 사용하게 된다. View는 윈도우의 개념으로 보아서 프레임 윈도우 영역안의 클라이언트에 속하는 view만의 윈도우안에서 표현된다. 한개의 document 에 대해서 view는 여러개로 나누어서 만들어지는 것이 가능하다.
excel을 생각해보면 될 것이다. 동일한 수치 데이터를 가지고 서로다른 그래프, 그리고 테이블의 형식으로 만들어내는 것이 가능하다.

6.3. Link

Document 객체는 관계된 뷰들의 포인터를 리스트로 관리한다. 뷰는 관계된 도큐먼트에 대한 포인터를 저장할 데이터 멤버 변수를 갖고 있다. 프레임 위도우는 현재 활성화된 뷰 객체에 대한 포인터를 갖는다. 이런식으로 서로 묶여서 한개의 윈도우를 형성한다.

6.3.1. Document Template

도큐먼트 템플릿 객체는 단순히 document 만을 관리하는 것이 아니다. 그들 각각과 관계되어 있는 윈도우와 뷰들도 함께 관리한다. 프로그램에서 각기 다른 종류의 도큐먼트에 대해서 하나씩의 document template이 존재한다. 만약 동일한 형태의 document가 2개이상 존재한다면 그것들을 관리하는데에는 하나의 document template만 있으면 된다.
하나의 document와 frame window는 한개의 document template에 의해서 생성되며 view는 frame window객체가 생성되면서 자동으로 생성되게 된다.
~cpp DocumentTemplateClass : CSingleDocTemplate, CMultiDocTemplate

7. SDI Application Wizard

생성된 코드의 실행 순서
  • ~cpp 응용프로그램 객체 theApp 생성
  • ~cpp MFC에 의해서 기 제공되는 WinMain() 실행
  • ~cpp WinMain() 에서 InitInstance() 수행, document template, main frame window, document, view 를 생성한다.
  • ~cpp WinMain() 에서 Run() 호출. Run()은 메인 메시지 루프를 실행하게된다. (API에서 WinProc를 생각해보면 된다.)

8. 관련되어서 진행되었던 스터디들

9. Related Page

Retrieved from http://wiki.zeropage.org/wiki.php/MicrosoftFoundationClasses
last modified 2021-02-07 05:23:45