VC CTabCtrl控件 选项卡控件
这篇文章适合刚开始用选项卡控件的朋友.这里我将自己新建一个类,然后继承CTabCtrl类,然后自己再创建二个非模式的对话框,并将其加入到选项卡控件中去.通过切换每个标签来显示不同的对话框.
思路:当我们调用InsertItem()这个函数的时候,选项卡控件将会添加一个标签页,这个时候,我们将自己的对话框的窗体的指针与此标签页关联起来,当用户进行标签页的切换的时候,我们根据当前是哪个标签页,显示哪个对话框,不是与当前标签页关联的对话框,我们将其隐藏即可.这样我们便可以实现选项卡控件.
第一步:新建一个自己的类CTabSheet继承CTabCtrl.
第二步:定义有用的成员变量
CDialog* m_dlgWnd[MAXTABPAGE]; //这个是存放对话框指针的指针数组
int m_curTabNumber; //记录当前用户添加了几个标签页
int m_selTabID; //当前用户点击的标签页的ID
第三步:添加成员函数
//通过这个函数,可以将一个对话框指针与添加的标签页关联起来,insWnd是创建的非模式对话框的指针,wndID是对话框的ID,pageText是标签页的标题
void CreateTabPage(CWnd *insWnd, int wndID,CString pageText)
//添加控件的点击事件的处理,当点击后得到当前点击的标签页的ID,然后将与此标签页相关的对话框显示,其它的隐藏即可
void OnLButtonDown(UINT nFlags, CPoint point)
通过添加以上的成员变量及成员函数即可实现一个简单的选项卡控件的用法
下面我将这两个成员函数的代码贴出来,并详细讲解
//创建并且增加一个标签页
//创建并且增加一个标签页
void CTabSheet::CreateTabPage(CWnd *insWnd, int wndID,CString pageText)
{
if (m_curTabNumber >= MAXTABPAGE)
{
MessageBox("标签页己经达到最大!","创建出错!",MB_OK);
return;
}
//首先new一个对话框的指针,但是不要调用create函数,再将些指针当成参数传进来即可,创建己由此函数做完
if (NULL == insWnd)
{
MessageBox("标签页为空","创建出错",MB_OK);
return;
}
//创建对话框,并且增加标签页
CDialog* curDlg = (CDialog*)insWnd;
curDlg->Create(wndID,this);
int suc = InsertItem(m_curTabNumber,pageText);
if (-1 == suc)
{
MessageBox("插入标签页失败","失败",MB_OK);
return;
}
curDlg->ShowWindow(SW_SHOW);
//将这个对应的窗体指针存放起来
m_dlgWnd[m_curTabNumber] = curDlg;
//此时选择当前页面
SetCurSel(m_curTabNumber);
m_selTabID = m_curTabNumber;
m_curTabNumber ++;
}
//点击左键事件,处理
void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CTabCtrl::OnLButtonDown(nFlags, point);
//得到当前用户点击的标签页的ID
int curSelect = GetCurSel();
//得到当前标签页的位置以便设置对话框显示的位置
CRect curRect;
GetClientRect(curRect);
if (-1 == curSelect)
{
return;
}
//查找标签页,将与当前用户点击的标签页相关的对话框显示出来,其它的对话框隐藏
for (int i = 0; i < m_curTabNumber; i ++)
{
if (i == curSelect)
{
m_dlgWnd[i]->SetWindowPos(NULL,0,20,curRect.Width(),curRect.bottom,SWP_SHOWWINDOW);
}
else
{
m_dlgWnd[i]->SetWindowPos(NULL,0,20,curRect.Width(),curRect.bottom,SWP_HIDEWINDOW);
}
}
m_selTabID = curSelect;
Invalidate();
//CTabCtrl::OnLButtonDown(nFlags, point);
}
以上为关键的两个函数,下面介绍调用的方法
创建非模式的对话框
CTabSheet m_tabSheet;
CMyDlg* m_dlg = new CMyDlg;
m_tabSheet.CreateTabPage(m_dlg ,IDD_DLG_ID,"第一个标签页");
这样就可以产生一个标签页了,当然还可以继续调用此函数添加标签页