[MFC] 탭 컨트롤, Tab Control

오늘은 탭 컨트롤에 대해 알아보겠습니다.
탭 컨트롤은 여러 개의 컨트롤들을 하나의 화면에 볼 수 있게 관리해 주는 컨트롤 입니다.
도구 상자에서 탭 컨트롤을 추가해 줍니다.

그 다음은 탭 컨트롤에 표시할 대화 상자를 추가해 줘야합니다.
솔루션 탐색기에서 프로젝트 우클릭 후 추가, 클래스를 선택합니다.

그리고 MFC 선택 후 MFC 클래스를 선택한 후 추가를 선택합니다.

클래스 이름은 CTab1, 기본 클래스는 CDialogEx를 선택 하신후 마침을 선택합니다.

이걸 총 3번 해주셔서 CTab1, CTab2, CTab3 대화 상자를 추가해주시면 됩니다.
그러면 헤더파일, cppp파일, 리소스 뷰에 우리가 만들어준 클래스 파일과 리소스 파일이 생길 겁니다.

생성한 모든 대화상자의 속성에서 Style : Child, System Menu : Fail, Title Bar : Fail로 설정합니다.

이제 각각의 대화 상자의 확인 버튼과 취소 버튼을 더블 클릭 하여 내부를 아래와 같이 주석 처리해줍니다.

void CTab1::OnBnClikcedOk()
{
	// CDialogEx::OnOk();
}

void CTab1::OnBnClickedCancel()
{
	// CDialogEx::OnCancel();
}

주석 처리를 하는 이유는 별거 없습니다.
탭 컨트롤에서만 그런게 아니라, 대화상자를 생성했을 때 나오는 확인, 취소 버튼은 키보드의 Enter, ESC 키를 눌렀을 때 이벤트 호출 함수 인데, CDialogEx::OnOk()와 CDialogEx::OnCancel() 함수는 대화 상자를 종료하기 때문입니다.
간단히 말하자면 Enter, ESC키가 눌렸을 때 종료 안되게 막은 겁니다.
이제 다시 메인 대화 상자로 이동해서 Tab 컨트롤의 ID를 IDC_TAB_TEST로 입력하고 변수명을 m_tabTest로 하여 생성합니다.

그리고 헤더파일에 Tab1, 2, 3클래스를 include 하고 변수로 선언합니다.

#include "Tab1.h"
#include "Tab2.h"
#include "Tab3.h"
class CMFCApplication1Dlg : public CDialogEx
{
	// ...

	CTab1 *pDlg1;
	CTab2 *pDlg2;
	CTab3 *pDlg3;	
}

OnInitDialog에 아래와 같이 코드를 입력합니다.

CRect rect;
m_tabTest.GetWindowRect(rect);

m_tabTest.InsertItem(0, _T("1번째 Tab"));
m_tabTest.InsertItem(1, _T("2번째 Tab"));
m_tabTest.InsertItem(2, _T("3번째 Tab"));

m_tabTest.SetCurSel(0); // 1번째 Tab 표시

pDlg1 = new CTab1;
pDlg1->Create(IDD_TAB1, &m_tabTest);
pDlg1->MoveWindow(0, 20, rect.Width() - 5, rect.Height() - 5);
pDlg1->ShowWindow(SW_SHOW);

pDlg2 = new CTab2;
pDlg2->Create(IDD_TAB2, &m_tabTest);
pDlg2->MoveWindow(0, 20, rect.Width() - 5, rect.Height() - 5);
pDlg2->ShowWindow(SW_HIDE);

pDlg3 = new CTab3;
pDlg3->Create(IDD_TAB3, &m_tabTest);
pDlg3->MoveWindow(0, 20, rect.Width() - 5, rect.Height() - 5);
pDlg3->ShowWindow(SW_HIDE);

탭이 변경되는 이벤트가 발생하면 화면을 변경해야 하므로 탭 컨트롤 우클릭 후 이벤트 처리기 추가를 선택합니다.

TCN_SELCHANGE 선택, 메인 대화상자 클래스 선택 후 추가 및 편집을 선택합니다.

그러면 OnTcnSelchangeTabTest 함수가 추가 되는데 아래와 같이 함수 내부에 코딩을 해줍니다.

void CMFCApplication1Dlg::OnTcnSelchangeTabTest(NMHDR *pNMHDR, LRESULT *pResult)
{
	if (IDC_TAB_TEST == pNMHDR->idFrom)
	{
		int iSelect = m_tabTest.GetCurSel();
		switch(iSelect)
		{
		case 0:
			pDlg1->ShowWindow(SW_SHOW);
			pDlg2->ShowWindow(SW_HIDE);
			pDlg3->ShowWindow(SW_HIDE);
			break;
		case 1:
			pDlg1->ShowWindow(SW_HIDE);
			pDlg2->ShowWindow(SW_SHOW);
			pDlg3->ShowWindow(SW_HIDE);
			break;
		case 2:
			pDlg1->ShowWindow(SW_HIDE);
			pDlg2->ShowWindow(SW_HIDE);
			pDlg3->ShowWindow(SW_SHOW);
			break;
		}
	}
	*pResult = 0;
}

여기까지 코딩을 하고 실행을 하면 Tab1, Tab2, Tab3 화면에 아무것도 없어서 바뀌는건지 아닌지를 확인할 수 없습니다.
리소스 뷰에서 IDD_TAB1을 선택하여 스태틱 컨트롤을 추가 한 뒤 번호를 써서 확인해 봅시다.

모두 추가가 완료되었으면 프로그램을 실행해 봅니다.

이상으로 탭 컨트롤에 대해 알아봤습니다.