[MFC] Tab 컨트롤에 모달리스창 넣기

[MFC] Tab 컨트롤에 모달리스창 넣기

Posted by 우담바라
 2008/09/30 13:59  삽질/My_Work 

[ 탭컨트롤(Tab Control) ]

 

1. 대화상자를 이용한 탭컨틀롤 사용을 알아보자.

 

2. 3개의 탭을 만들고 각각 대화상자를 붙여본다.

 

3. 3개의 대화상자를 모델리스형으로 만든다.

각각 CDlgTab1, CDlgTab2, CDlgTab3라고 하자.

 

4. 각각의 대화상자의 “Styles” 옵션중 “Style”은 “Child”로 “Border”는 “None”으로 “Tile Bar”는 언체크 한다.

 

5. 3개의 모델리스를 CMainFrame에 다음과 같이 선언하고

CDlgTab1  *m_pDlgTab1;
CDlgTab2  *m_pDlgTab2;
CDlgTab3  *m_pDlgTab3;

* 생성자에 NULL값으로 초기화 해주는 거와 소멸자에세 NULL이 아니면 delete해주는 거 있지 말자.

 

6. 탭컨트롤에 탭만들기. 이때 탭컨트롤 변수를 m_ctrTab라고 하자.

 

TCITEM   item;
   item.mask  = TCIF_TEXT;
item.pszText = “탭1”;
m_ctrTab.InsertItem(0, &item);   // 첫번째 탭 생성
item.pszText = “탭2”;
m_ctrTab.InsertItem(1, &item);     // 두번째 탭 생성
item.pszText = “탭3”;
m_ctrTab.InsertItem(2, &item);    // 세번째 탭 생성

 

7. 각 탭에 붙여질 모델리스 만들기

 

// 일단 CMainFrame을 찾는다.

CMainFrame *pFrame = (CMainFrame*) AfxGetMainWnd();
CRect  rect;

// 첫번째 모델리스 생성

pFrame->m_pDlgTab1 = new CDlgTab1;
pFrame->m_pDlgTab1->Create(&m_ctrTab);
pFrame->m_pDlgTab1->GetWindowRect(&rect);
pFrame->m_pDlgTab1->MoveWindow(5,25, rect.Width(), rect.Height());

// 탭의 모양에 따라 모델리스를 위치 시킨다.
pFrame->m_pDlgTab1->ShowWindow(SW_HIDE);

// 두번째 모델리스 생성
pFrame->m_pDlgTab2 = new CDlgTab2;
pFrame->m_pDlgTab2->Create(&m_ctrTab);
pFrame->m_pDlgTab2->GetWindowRect(&rect);
pFrame->m_pDlgTab2->MoveWindow(5,25, rect.Width(), rect.Height());
pFrame->m_pDlgTab2->ShowWindow(SW_HIDE);
// 세번째 모델리스 생성

pFrame->m_pDlgTab3 = new CDlgTab3;
pFrame->m_pDlgTab3->Create(&m_ctrTab);
pFrame->m_pDlgTab3->GetWindowRect(&rect);
pFrame->m_pDlgTab3->MoveWindow(5,25, rect.Width(), rect.Height());
pFrame->m_pDlgTab3->ShowWindow(SW_HIDE);
8. 기본적으로 선택될 탭 설정과 탭에 보여줘야 할 모델리스 표시

 

// 기본적으로 선택될 탭 설정
m_ctrTab.SetCurSel(0);
// 선택된 탭에서 보여줄 대화상자 표시

pFrame->m_pDlgTab1->ShowWindow(SW_SHOW);

 

9. 탭 클릭에 따른 모델리스 표시 전환

 

// 탭이 변경 되는 중에 발생되는 메세지. TCN_SELCHANGING

int   nTab = m_ctrTab.GetCurSel(); // 변경되기 전에 선택된 탭 번호

 

CMainFrame *pFrame = (CMainFrame*) AfxGetMainWnd();
switch(nTab)
{
case 0:
pFrame->m_pDlgTab1->ShowWindow(SW_HIDE);
break;
case 1:
pFrame->m_pDlgTab2->ShowWindow(SW_HIDE);
break;
case 2:
pFrame->m_pDlgTab3->ShowWindow(SW_HIDE);
break;
}

 

// 탭이 변경 되고 난 후에 발생되는 메세지. TCN_SELCHANGE

int   nTab = m_ctrTab.GetCurSel(); // 변경되고 난후에 선택된 탭 번호

CMainFrame *pFrame = (CMainFrame*) AfxGetMainWnd();
switch(nTab)
{
case 0:
pFrame->m_pDlgTab1->ShowWindow(SW_SHOW);
break;
case 1:
pFrame->m_pDlgTab2->ShowWindow(SW_SHOW);
break;
case 2:
pFrame->m_pDlgTab3->ShowWindow(SW_SHOW);
break;
}
* 탭변경전에 기존 모델리스를 감추고 탭변경후 변경된 위치의 모델리스를 표시하면 된다.
Lynn 2007.3.25

.h
CTabCtrl m_ctrlTab;
CDlgHwTab *m_pDlgTab1;
CDlgHw2Tab *m_pDlgTab2;
::oninitDialog()
TCITEM item;
item.mask = TCIF_TEXT;
item.pszText = “HW #1”;
m_ctrlTab.InsertItem(0,&item);
item.pszText = “HW #2”;
m_ctrlTab.InsertItem(1,&item);
m_pDlgTab1 = new CDlgHwTab;
//m_pDlgTab1->Create(&m_ctrlTab);
m_ctrlTab.GetWindowRect(rect);
m_pDlgTab1->Create(IDD_HW1DIALOG);
//m_pDlgTab1->GetWindowRect(&rect);
m_pDlgTab1->MoveWindow(rect.left,rect.top,rect.Width()-20,rect.Height()-60);
m_pDlgTab1->ShowWindow(SW_HIDE);
m_pDlgTab2 = new CDlgHw2Tab;
//m_pDlgTab2 ->Create(&m_ctrlTab);
m_pDlgTab2 ->Create(IDD_HW2DIALOG);
m_ctrlTab.GetWindowRect(rect);
m_pDlgTab2->MoveWindow(rect.left,rect.top,rect.Width()-20,rect.Height()-60);
m_pDlgTab2->ShowWindow(SW_HIDE);

m_ctrlTab.SetCurSel(0);
m_pDlgTab1->ShowWindow(SW_SHOW);
void CComputerVision1Dlg::OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
int nTab = m_ctrlTab.GetCurSel();
switch(nTab)
{
case 0:
m_pDlgTab1->ShowWindow(SW_SHOW);
break;
case 1:
m_pDlgTab2->ShowWindow(SW_SHOW);
break;
}

*pResult = 0;
}

void CComputerVision1Dlg::PostNcDestroy()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
delete m_pDlgTab1 ;
delete  m_pDlgTab2;
CDialog::PostNcDestroy();
}