假如我现在有个SDI程序,View是Form View,想在上面放个Tab Control,包含3个Page。
首先当然要增加一个Tab Control资源,然后利用Class Wizard,在View中增加一个Control变量。
接着建立3个对话框资源,把Style改为Child,Border改为None。3个对话框分别添加RICHEDIT;
接着利用Class Wizard,分别为这3个对话框建立3个类,
然后在View类头文件中,加入这两个对话框对象。
为了避免用户在切换Tab时,程序对Tab Index的枚举,可以利用数组来做这个事情。
在View的初始化函数中需要把CDialog1 m_mm1;CDialog2 m_mm2;CDialog3 m_mm3;和Tab Control关联起来,并保存页面地址,设置初始页面,等等。
1.
class CTestForFunDlg : public CDialog
{
CDialog1 m_mm1;
CDialog2 m_mm2;
CDialog3 m_mm3;
CTabCtrl m_tabctrl;
CRichEditCtrl m_redit_log;
CDialog *pDialog[3];
afx_msg void OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult);
void InitTabDialog();
}
2.
// tab selection
void CTestForFunDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
CString str;
switch(m_tabctrl.GetCurSel())
{
case 0:
pDialog[0]->ShowWindow(SW_SHOW);
pDialog[1]->ShowWindow(SW_HIDE);
pDialog[2]->ShowWindow(SW_HIDE);
break;
case 1:
pDialog[0]->ShowWindow(SW_HIDE);
pDialog[1]->ShowWindow(SW_SHOW);
pDialog[2]->ShowWindow(SW_HIDE);
break;
case 2:
pDialog[0]->ShowWindow(SW_HIDE);
pDialog[1]->ShowWindow(SW_HIDE);
pDialog[2]->ShowWindow(SW_SHOW);
break;
default:
break;
}
*pResult = 0;
}
void CTestForFunDlg::InitTabDialog()
{
//initial tab control
m_tabctrl.InsertItem(0,_T("Log"));
m_tabctrl.InsertItem(1,_T("Internal memory"));
m_tabctrl.InsertItem(2,_T("External memory"));
m_mm1.Create(IDD_DIALOG1,&m_tabctrl);
m_mm2.Create(IDD_DIALOG2,&m_tabctrl);
m_mm3.Create(IDD_DIALOG3,&m_tabctrl);
CRect rc;
m_tabctrl.GetClientRect(rc);
rc.top +=20;
rc.bottom -=8;
rc.left +=8;
rc.right -=8;
m_mm1.MoveWindow(&rc);
m_mm2.MoveWindow(&rc);
m_mm3.MoveWindow(&rc);
pDialog[0] = &m_mm1;
pDialog[1] = &m_mm2;
pDialog[2] = &m_mm3;
pDialog[0]->ShowWindow(SW_SHOW);
pDialog[1]->ShowWindow(SW_HIDE);
pDialog[2]->ShowWindow(SW_HIDE);
}
//show log on tag control
void CTestForFunDlg::PrintLog(CString line)
{
int pos = m_redit_log.GetWindowTextLength();
m_redit_log.SetSel(pos,pos);
m_redit_log.ReplaceSel(line + _T("/n"));
m_redit_log.PostMessage(WM_VSCROLL,SB_BOTTOM,0);
MSG msg;
if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE))//force to refresh the richedit
{
if(msg.message == WM_VSCROLL)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
}
//clear log
void CTestForFunDlg::ClearLog()
{
this->m_redit_log.HideSelection(true,false);
this->m_redit_log.SetReadOnly(false);
this->m_redit_log.SetSel(0,-1);
this->m_redit_log.Clear();
this->m_redit_log.SetSel(-1,-1);
this->m_redit_log.SetReadOnly();
this->m_redit_log.HideSelection(false,false);
}