MFC 기초 윈도우 응용프로그램 개발 간략한 역사 Microsoft Foundation Classes 연도 개발 도구 MFC 버전 주요 특징 1992 MS C/C++ 7.0 1.0 16비트 윈도우 API를 클래스화 1994 비주얼 C++ 2.0 3.0 32비트 윈도우 API로 전환, 멀티스레드 지원 1998 비주얼 스튜디오 6.0 6.0 ATL 업그레이드. MFC로 비주얼 스튜디오 6.0 개발 2005 비주얼 스튜디오 2005 8.0 Windows Forms 지원 2010 비주얼 스튜디오 2010 10.0 윈도우 7에 새로 도입된 UI 지원 2015 비주얼 스튜디오 2015 14.0 비주얼 C++에서 MFC 선택적 설치 2019 비주얼 스튜디오 2019 14.20
MFC 구성 요소 (1) MFC 구성 요소 CObject 파생 클래스: 188개 MFC 클래스 나머지: 40개 매크로, 전역 변수, 전역 함수 CObject 파생 클래스: 188개 나머지: 40개 (※MFC 6.0 기준)
MFC 구성 요소 (2) MFC 클래스 계층도
CObject 클래스 CObject 서비스 서비스 이름 기능 실행 시간 클래스 정보 프로그램 실행 중 객체 정보를 알아낸다. 동적 객체 생성 객체를 동적으로 생성한다. 직렬화 객체를 저장하거나 읽어들인다. 타당성 점검 객체 상태를 점검한다. 집합 클래스와의 호환성 서로 다른 클래스 객체를 집합 클래스에 저장할 수 있게 한다.
MFC 전역 함수 함수 이름 기능 AfxMessageBox() 메시지 상자를 표시한다. AfxGetApp() 응용 프로그램 객체의 주소를 리턴한다. AfxGetMainWnd() 메인 윈도우 객체의 주소를 리턴한다. AfxGetAppName() 응용 프로그램의 이름을 리턴한다. AfxGetInstanceHandle() 인스턴스 핸들을 리턴한다. AfxRegisterWndClass() 윈도우 클래스를 등록한다. AfxBeginThread() 스레드를 시작한다. AfxEndThread() 스레드를 종료한다.
CString 클래스 가변 길이 문자열 지원 CString 객체 생성과 초기화 프로그램 실행 중에 문자열 길이를 자유롭게 변경 가능 CString 객체 생성과 초기화 CString str = TEXT("안녕하세요."); str += TEXT(" 하하하"); CString str1; // 기본 생성자 str1 = TEXT("안녕하세요."); // 대입 연산 Cstring str2("오늘은"); // 문자열 초기화 Cstring str3(str2); // 복사 생성자 Cstring str4 = str1 + TEXT(" ") + str2 + TEXT(" 즐거운 날입니다.");
CPoint 클래스 생성자 사용 예 CPoint(int x, int y); CPoint pt1(10, 20); pt1.Offset(40, 30); // x 좌표에 40, y 좌표에 30을 더한다 pt2.Offset(20, 10); // x 좌표에 20, y 좌표에 10을 더한다 if (pt1 == pt2) cout << "두 점의 좌표가 같습니다." << endl; // OK in VS2005 else cout << "두 점의 좌표가 다릅니다." << endl;
CRect 클래스 (1) 생성자 직사각형의 폭과 높이 좌표의 포함 여부 판단 CRect(int left, int top, int right, int bottom); int CRect::Width(); int CRect::Height(); BOOL CRect::PtInRect(CPoint pt);
CRect 클래스 (2) 사용 예 CRect rect1; rect1.SetRect(0, 0, 200, 100); if (rect1 == rect2) cout << "두 직사각형의 좌표가 같습니다." << endl; else cout << "두 직사각형의 좌표가 다릅니다." << endl; CRect rect3(100, 100, 300, 200); cout << rect3.Width() << " " << rect3.Height() << endl; CPoint pt(200, 150); if (rect3.PtInRect(pt)) cout << "점이 직사각형 내부에 있습니다." << endl; cout << "점이 직사각형 외부에 있습니다." << endl;
CSize 클래스 생성자 사용 예 CSize(int x, int y); // 폭과 높이 CSize size1(100, 200); CSize size2(100, 200); cout << size2.cx << " " << size2.cy << endl; if (size1 == size2) cout << "크기가 같습니다." << endl; else cout << "크기가 다릅니다." << endl;
HelloMFC 예제 작성 (1) MFC 프로그램 기본 골격 ① 응용 프로그램 클래스 정의 ② 메인(=프레임) 윈도우 클래스 정의 ③ 응용 프로그램 객체 선언 ④ 메시지 처리용 멤버 함수 정의 응용 프로그램 클래스 (CHelloApp) 프레임 윈도우 클래스 (CMainFrame) 프레임 윈도우 생성 메시지 루프 제공 프레임 윈도우 기능 제공
HelloMFC 예제 작성 (2) Win32 프로젝트
HelloMFC 예제 작성 (2) 프로젝트 설정 변경 (프로젝트 설정, Alt+F7)
HelloMFC 예제 작성 (3) 비주얼 스튜디오 2017 화면
MFC 프로그램 기본 구조 (1) HelloMFC 예제 코드 (1/3) #include <afxwin.h> // 응용 프로그램 클래스를 상속을 통해 정의한다. class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); }; // 메인 윈도우 클래스를 상속을 통해 정의한다. class CMainFrame : public CFrameWnd { // 생성자 CMainFrame() { Create(NULL, TEXT("HelloMFC Application")); } protected: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP()
MFC 프로그램 기본 구조 (2) HelloMFC 예제 코드 (2/3) // 응용 프로그램 객체를 선언한다. CHelloApp theApp; // 1. 윈도우 클래스(종류)를 초기화하고 운영체제에 등록한다. // 3. 메시지 큐에서 메시지를 하나씩 꺼내서 처리한다. // 응용 프로그램 클래스의 멤버 함수 InitInstance()를 정의한다. BOOL CHelloApp::InitInstance() { m_pMainWnd = new CMainFrame; // 2. 윈도우를 생성하고 m_pMainWnd->ShowWindow(m_nCmdShow); // 2. 화면에 보이게 한다. return TRUE; }
MFC 프로그램 기본 구조 (3) HelloMFC 예제 코드 (3/3) // 4. 발생한 메시지의 종류에 따라 적절히 처리한다. void CMainFrame::OnPaint() { TCHAR *str = TEXT("Hello, MFC"); CPaintDC dc(this); dc.TextOut(100, 100, msg, _tcslen(str)); } void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) MessageBox(TEXT("마우스를 클릭했습니다.“), TEXT("마우스 메시지")); // 메시지맵을 선언한다. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP()