MFC Tab控件最简单的实现(还能不能再简单一点!) 2014-10-14 18:06:14

( 7人已投票,[高质量] )
分享: ╬收藏
31.3K

这个Tab控件确实封装的太不敢恭维,要写一堆代码才是实现一个简单的tab样式,此版文章只为最初级的入门级菜鸟,鉴于网上好多代码都是easy said than done。
个人总结出来三点,抛开所有东西,说到底实现tab控件总共分三步:(界面,初始化,控制)
环境关键词: VC6.0 MFC 对话框


一:拼凑界面:

新建好对话框工程后把上面的确定啦之类的点中Delete掉
添加Tab 把这个Tab的ID改为IDC_TAB 右健ClassWized(类向导)里在变量那里为IDC_TAB添加一个变量(从CTabCtrl)
在资源里新建对话框属性改一下:样式是下层,边框是无(看好啊)(当前的对话框的ID为IDD_DIALOG1)
在上面再加个字吧(静态变量)例如第一页(别放在最顶上,怕把后面小标题挡住了,字放中间吧)
直接拖这个对话框IDD_DIALOG1复制一份(你一拖就看到了小加号松手就行)这个名字自动是IDD_DIALOG2
把里面的静态量改了例如第二页。

第一步完成了,下面我们来初始化


二:初始化参数:

在主对话框类里右键添加变量,CDlgPar1 m_para1;CDlgPar2 m_para2;这是你刚生成的两个对话框类,这里实例一下呆会用//这不会得可以查一下如何添变量的
的OnInitDialog中加入如下代码:

m_tab.InsertItem(0,"num1");
m_tab.InsertItem(1,"num2");

还记得m_tab是什么不,就是刚添的tab控件,我们给它插入元素啦,当然你也可以多加几项
现在就你可以测试一下了,小样子是不是出来了,就是没有定义的两个对话框的内容


接着添加:

//把第一个对话框IDD_DIALOG1给映射到那个TAB上去,鬼知道做了什么事
m_para1.Create(IDD_DIALOG1,GetDlgItem(IDC_TAB));
m_para2.Create(IDD_DIALOG2,GetDlgItem(IDC_TAB));
CRect rs;
//这要个矩行区域了,因为你要是IDD_DIALOG1太大太小太长太短,放里面也不合适啊
m_tab.GetClientRect(&rs);
rs.top += 10;
//你的tab用于点击的小图标在上面的时候把这个就加大点50吧,我是在放在下面的
rs.bottom -=50;
//这里的数字你改改看,小心别挡着东西就行
rs.left +=10;
rs.right -=10;
m_para1.MoveWindow(&rs);
m_para2.MoveWindow(&rs);
//到这儿两个对话框框口都移过来了,就先默认的显示一个吧
m_para1.ShowWindow(TRUE);//就是你了
m_para2.ShowWindow(FALSE);          
m_tab.SetCurSel(0);
//因为以上是在OnInitDialog中所以运行时,对话框会被以上代码初始化一次

第二步结束,你可以运行看一下了,没有数据的话,你看看是不是丢了哪一步,有数据了就下一步


三:设置控制逻辑

还是右键那个Tab进入类查看,在message maps里object ID有你刚定义的IDC_TAB,往右边看里面是不是有个小名叫TCN_SELCHANGE的添加它后点edit
加入如下代码,加代码后是这样的

void CTestTabDlg::OnSelchangeTab(NMHDR* pNMHDR, LRESULT* pResult)
{
 // TODO: Add your control notification handler code here
 int Cursel = m_tab.GetCurSel();
 switch (Cursel)
 {
 case 0://这里的0,1你刚在OnInitDialog中设定
 m_para1.ShowWindow(TRUE);
 m_para2.ShowWindow(FALSE);
 break;
 case 1:
 m_para1.ShowWindow(FALSE);//
 m_para2.ShowWindow(TRUE);
 break;
 default:
 break;
 }
 *pResult = 0;
}


三步完成,总结一下,这些事确实多,但是我想省掉些东西的时候发现还就不正常了,慢慢了解吧,先知道怎么用就行
光看文章长,其实事不多,都是我的费话,你要想搞懂点就静下心来,别跳着看,有不懂的可以问我
再说一下扩展的事项:
主框上想画个按纽怎么办,我也不知道哦,你画一个在主框上看看呗,你会发现居然显示在了最上面了,这是不是你想要的效果,不是的话,你再查再改,我也不会哇@.@~!
另外我想在对话框1和2上加输入框然后把两个里面的数据集到主对话框里,像网上的某位网友说的,可以在1,2里写个函数呀,就一句话就return那个值就行了,反正第二步定义了
两个实例,就是两个对话框里的人,直接就能把值取出来了;你把我所说的都了解了,再多想想,就融会贯通了
一起加油,共同进步!







  • 超弦的头像
    超弦 - 2014-10-17 16:59:42

    楼主你好,如果需要tab上某个标签对应的对话框大小大于Tab控件甚至主对话框的大小,有没有办法实现呢?

    超弦的头像

    X
  • 花花世界的头像
    花花世界 To: 超弦 - 2014-10-28 18:00:42

    啊?比主对话框还大?那得伪造界面造成错觉效果,这是我CSDN的文章,多年不用MFC了,我给你说个思想吧,你看看合不合理:不管是不是标签、或是控件,都只当成一个元素来对待,如果你上QQ,细心的人会发现,QQ的登录框并不是扁形的矩形,而是一个很高的长方形,只不过四周大范围是透明的,你可以把超出部分也显示出来,外围搞成透明的,就像最新版的Photoshop4S一样,“不规则界面”,不知你觉得这样行不。哎呀,关于不规则界面我以前也研究过,好几年前的事了,文章么有了,sorry啦,你再研究研究

    花花世界的头像

    X
头像

snowcoal
  • C++
  • MFC
  • Tab控件对话框

本文标签:

C++MFCTab控件对话框

收藏到我的私密空间

标题: MFC Tab控件最简单的实现(还能不能再简单一点!)

作者:花花世界

你暂未登录,请登录后才可收藏至您的私密空间 确认取消
雪炭网

键盘操作 更便捷 -雪炭网雪中送炭-乐趣无限