MFC TABControl example

假如我现在有个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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值