这个东西不必介绍了,现在在一个对话框中,还有几个没有标签页呢?不过尽管是很常见的东西,它的现实并不简单,它不是像VB那样拖拖控件就弄出来的,拖完之后还有比较复杂的一段过程,当然,弄熟了就不复杂了,弄几下就搞点了。不熟的话,就慢慢在网上找资料吧,在当前mfc已经越来越冷门的情况下,哪种找不到的感觉,真的是嘿嘿了。
一、基本目标
下面就举个例子来说明,mfc中的标签页,有一个标签页控件,在标签1标签2标签3中各自有一个输入框,在各个输入框输入完东西之后,点击确定按钮,就能够弹窗,显示用户输入了什么,用户还能返回修改。
二、制作过程
1、首先新建一个静态DLL,没有任何东西,基于对话框的MFC工程,自带的两个按钮放在下方,如下图,在里面拖入一个Tab控件:
2、标签页的样式修改一下,把“多行”勾上,这个“多行”主要是防止之后,你的标签页添加得过多,能够像如下的样子现实,美观一些,不会再后面多出一个蛋疼<>按钮,甚至一些操作系统还没有这个按钮,你就慢慢向前翻吧,不过一般用不到这么多个标签页的。
3、主对话框默认就已经建立好类函数,但依然要打开类向导,在成员变量这个标签页,你看,标签页是多么地常见,你不会你好意思跟别人说你会mfc,为这个标签页添加一个成员变量m_tab,其它的类型什么的默认即可。
4、之后像《【mfc】利用单一对话框内的分页技术实现向导功能》(点击打开链接)一样,新建三个对话框,设置成内接对话框,没有边框,通过类向导为这个三个对话框新建类函数,还是CPage1,2,3...,然后在成员变量的标签页里面,再为各个对话框的编辑框建立一个成员变量,在Class name中的一栏可以选择是哪个对话框里面的成员,以便我们能够操纵它们。不懂就翻翻我之前的文章,那篇文章已经说明得足够详细了,这里就不再赘述。
5、之后同样在主函数对话框中,为这个三个对话框建立成员变量CPage1,2,3 m_p1,2,3,分页的制作都这样,是Add Menber Variable,不是下图的Add Virtual Function,截图时候小手一抖,红包就被抢走了,但是这一次无需建立一个记录翻到第几页的整形变量了。
6、之后为标签页控件建立窗口消息处理函数,虽然这个专业名词好像非常高深的样子,但也就是告诉系统,如果用户切换标签的时候,你怎么做。其实以前在《【mfc】鼠标、键盘响应事件》(点击打开链接)也做过,只不过上次是为一个主对话框创建窗口消息处理函数,告诉系统,但这个对话框被左键点击也怎么做,这次是标签页有动作。
7、得到一个void CTabPagingDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) 函数,再里面写入如下分页算法,与《【mfc】利用单一对话框内的分页技术实现向导功能》(点击打开链接)里面的分页算法都一样,不说了,只是需要利用到int nSel=m_tab.GetCurSel();来取出现在用户是要切到哪个标签去。
void CTabPagingDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here //取出当前用户是选择哪个标签的 int nSel=m_tab.GetCurSel(); CWnd* ps[] = {&m_p1,&m_p2,&m_p3}; for(int i=0;i<sizeof(ps)/sizeof(ps[0]);i++) ps[i]->ShowWindow(i==nSel?SW_SHOW:SW_HIDE); *pResult = 0; }
8、之后就是实现OnOK,哪个确定按钮的功能,也与上次的“确定”按钮功能一模一样,记得UpdateData()就行了,就是一个字都没有改,不说了,做完。
void CTabPagingDlg::OnOK() { // TODO: Add extra validation here //CDialog::OnOK(); CString cs; m_p1.UpdateData(); m_p2.UpdateData(); m_p3.UpdateData(); cs+="第1页输入了:"; cs+=m_p1.m_edit1; cs+="第2页输入了:"; cs+=m_p2.m_edit1; cs+="第3页输入了:"; cs+=m_p3.m_edit1; AfxMessageBox(cs); }