[CHAPTER 02] MFC 개요 및 아키텍처

2023. 5. 12. 08:56기타(이론)/C++ MFC 윈도우 프로그래밍

1) MFC란?

윈도우 애플리케이션을 생성하기 위해 만들어진 C++ 클래스 라이브러리, 애플리케이션 프레임워크를 제공
MFC 라이브러리는 Win32 API 위에 구축

2) MFC 프로그램의 구조

☞ SDI(Single Document Interface) ↔ 단일 템플릿 애플리케이션

  • CWinApp 파생 클래스 : 애플리케이션 전체를 나타내는 클래스
  • CFrameWnd 파생 클래스 : 애플리케이션에서 메뉴와 상태 표시줄, 도구바를 포함한 외부 프레임을 나타내는 클래스
  • CView 파생 클래스 : 애플리케이션의 클라이언트 또는 작업 영역을 나타내는 클래스
  • CDocument 파생 클래스 : 애플리케이션 내부에서 데이터를 읽고, 저장하는 기능을 가진 클래스

☞ MDI(Multiple Document Interface) ↔ 여러 템플릿 애플리케이션

  • CWinApp 파생 클래스 : 애플리케이션 전체를 나타내는 클래스
  • CMDIFrameWnd 파생 클래스 : 애플리케이션에서 메뉴와 상태 표시줄, 도구바를 포함한 외부 프레임을 나타내는 클래스
  • CMDDIChildWnd 파생 클래스 : 애플리케이션에서 자식 윈도우의 외부 프레임을 나타내는 클래스
  • CView 파생 클래스 : 애플리케이션에서 자식 윈도우의 클라이언트 또는 작업 영역을 나타내는 클래스
  • CDocument 파생 클래스 : 애플리케이션 내부에서 데이터를 읽고, 저장하는 기능을 가진 클래스

3) Visual C++의 시작

[새 프로젝트 만들기] 선택
[MFC 앱] 템플릿을 선택. 없을 경우 스크롤을 밑으로 내려 [추가 도구 및 기능 설치]
설치 세부 정보의 [최신 v143~MFC]
사진과 같이 입력 후 [만들기] 선택 / 위치는 개인별 설정
위와 같이 설정 후 [마침] 선택
ctrl+shift+C = [보기] -[클래스뷰]

https://naturis.tistory.com/5

 

[TIP] MFC 단축키 모음

**Debug Hot Key 동작 Ctrl+Shift+F5 Debugging을 처음부터 다시 시작한다. ( restart ) Shift+F5 Debugging을 종료한다. Alt+F10 Debugging중 변경된 code를 적용시킨다. F11 한 명령 Line을 실행한다. 함수내의 문장 안으로

naturis.tistory.com

4) MFC 애플리케이션 아키텍처

<주요 클래스>

  • CObject
  • CCmdTarget
  • CWinThread
  • CSinApp
  • CWnd
  • CFrameWnd
  • CVie
  • CDialog
  • CDocument

https://learn.microsoft.com/ko-kr/cpp/mfc/reference/mfc-classes?view=msvc-170

 

MFC의 클래스

MFC 클래스에 대해 자세히 알아보기

learn.microsoft.com

<윈도우 크기 나타내는 변수 추가>
[클래스 뷰]-[cPractice2bView]-[추가]-[변수추가]
형식은 직접 입력
함수 내용
GetLength() 설정된 문자의 길이를 반환한다.
IsEmpty() 현재 문자열 버퍼가 비어 있는가?
Empty() 문자열을 삭제하여 버퍼를 비운다.
GetAt() 문자열 특정 위치의 문자 값을 얻는다.
SetAt() 문자열의 특정 위치에 새로운 문자를 삽입한다.
Compare() 문자열과 인자의 문자열을 비교한다.
MakeUpper() 문자열의 소문자를 대문자로 바꾼다.
MakeLower() 문자열의 대문자를 소문자로 바꾼다.
Format() 형식을 지정하여 문자열에 넣는다.
Find() 문자열에서 특정 문자나 부분 문자열을 찾는다.

[프로젝트]-[클래스마법사] = ctrl+shift+x 후에 코드 편집 누르고
//아래와 같이 수정
void CPractice2bView::OnSize(UINT nType, int cx, int cy) //추가됨
{
	CView::OnSize(nType, cx, cy);

	// TODO: 여기에 메시지 처리기 코드를 추가합니다.
	//윈도우 크기가 변경될 때 윈도우 크기를 나타내는 문자열 생성
	m_strWindowSize.Format(_T("윈도우 크기는 넓이 %d, 높이 %d입니다."), cx, cy);
	//화면 갱신
	Invalidate();
}
//[클래스뷰]-[OnDraw(CDC+pDC)]
void CPractice2bView::OnDraw(CDC* pDC)
{
	CPractice2bDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
	// 윈도우 크기를 나타내는 문자열을 윈도우 좌측 상단(10,10)에 출력
	pDC->TextOut(10, 10, m_strWindowSize);
}
void CPractice2bView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	m_strOutput = _T("왼쪽 마우스 버튼을 눌렀습니다.");
	Invalidate();

	CView::OnLButtonDblClk(nFlags, point);
}

 

<만든 변수들의 함수>

void CPractice2bView::OnSize(UINT nType, int cx, int cy) //추가됨
{
	CView::OnSize(nType, cx, cy);

	// TODO: 여기에 메시지 처리기 코드를 추가합니다.
	//윈도우 크기가 변경될 때 윈도우 크기를 나타내는 문자열 생성
	m_strWindowSize.Format(_T("윈도우 크기는 넓이 %d, 높이 %d입니다."), cx, cy);
	//화면 갱신
	Invalidate();
}


//void CPractice2bView::OnLButtonDblClk(UINT nFlags, CPoint point)
//{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
//	m_bDrag = TRUE;
//	m_strOutput = _T("왼쪽 마우스 버튼을 눌렀습니다.");
//	Invalidate();
//
//	CView::OnLButtonDblClk(nFlags, point);
//}


void CPractice2bView::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	m_strOutput = _T("오른쪽 마우스 버튼을 눌렀습니다.");
	Invalidate();

	CView::OnRButtonDown(nFlags, point);
}


void CPractice2bView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	m_strOutput = _T("키보드를 눌렀습니다.");
	Invalidate();

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}


void CPractice2bView::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	if (m_bDrag == TRUE) //마우스가 클릭 된 상태일 때
	{
		m_strOutput = _T("마우스를 드래그하고 있습니다.");
	}
	else //마우스가 클릭되지 않은 상태일 때 
	{
		m_strOutput = _T("마우스를 이동 중입니다.");
	}
	Invalidate();
	CView::OnMouseMove(nFlags, point);
}


void CPractice2bView::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	m_bDrag = FALSE;

	CView::OnLButtonUp(nFlags, point);
}


//void CPractice2bView::OnNcLButtonDown(UINT nHitTest, CPoint point)
//{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
//	m_bDrag = TRUE;
//	m_strOutput = _T("왼쪽 마우스 버튼을 눌렀습니다.");
//	Invalidate();
//
//	CView::OnNcLButtonDown(nHitTest, point);
//}


void CPractice2bView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	m_bDrag = TRUE;
	m_strOutput = _T("왼쪽 마우스 버튼을 눌렀습니다.");
	Invalidate();

	CView::OnLButtonDown(nFlags, point);
}