标签控件Tab

来源:互联网 发布:pla算法 迭代次数 编辑:程序博客网 时间:2024/05/16 17:27

1、创建一个对话框应用程序,并创建3个子对话框。ID分别为:IDD_PAGE1、IDD_PAGE2、IDD_PAGE3。设置属性:child、无边框。

2、为三个对话框分别绑定一个类:CPage1、CPage2、CPage3

3、为tab控件绑定一个控件变量:m_tab

4、在主对话框的头文件中定义3个对话框类的对象:

class CTabCtrlDlg : public CDialogEx{public:CPage1 m_p1;CPage2 m_p2;CPage3 m_p3;CTabCtrl m_tab;//......

5、在OnInitDialog()函数中进行如下初始化工作:

BOOL CTabCtrlDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码m_tab.InsertItem(0,"标签1");//添加三个标签m_tab.InsertItem(1,"标签2");m_tab.InsertItem(2,"标签3");m_p1.Create(IDD_PAGE1,this);//创建3个非模态对话框m_p2.Create(IDD_PAGE2,this);m_p3.Create(IDD_PAGE3,this);CRect r,r1;m_tab.GetItemRect(0,&r);//获取第一个标签的矩形框的大小m_tab.GetWindowRect(&r1);//获取整个tab控件对话框的大小this->ScreenToClient(&r1);//转换成主对话框的客户区坐标r1.top += r.Height()+2;//漏出标签文字r1.DeflateRect(1,1);//四周向中央缩进1个单元,露出tab的边框m_p1.MoveWindow(&r1);m_p2.MoveWindow(&r1);m_p3.MoveWindow(&r1);m_p1.ShowWindow(SW_SHOW);m_p1.SetFocus();return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}

6、为消息 TCN_SELCHANGE 添加消息响应函数:

void CTabCtrlDlg::OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult){int i = 0;int nCurSel = m_tab.GetCurSel();//获取当前选择tab页的索引 CWnd* ps[] = {&m_p1,&m_p2,&m_p3};while (i < sizeof(ps)/sizeof(ps[0])){ps[i]->ShowWindow(i == nCurSel?SW_SHOW:SW_HIDE);i++;}ps[nCurSel]->SetFocus();*pResult = 0;}

完毕。



注意:TCN_SELCHANGING 和 TCN_SELCHANGE 两个消息不能添加错:

小心=TCN_SELCHANGE和=TCN_SELCHANGING,今天使用CTabCtrl的时候,没有注意有两个消息都可以在选择选项卡的时候都有相应,想当然的用了SELCHANGING那个,但是在进入消息响应之后,获取当前选项卡的序列号一直不对,一直都是前一个的序列号,后来发现,还有一个SELCHANGE消息,查了之后,才发现,选项卡改变之后,是先执行=TCN_SELCHANGING,后执行=TCN_SELCHANGE,在执行=TCN_SELCHANGING的时候,选项卡还未最终完成切换,所以获取的当前序列一直都是之前哪一个的,而这里要获取切换后的,要用=TCN_SELCHANGE消息。