MFC 的控件Tab Control 郁闷了半天没解决!

zdbszy521 2011-07-13 11:39:09
在网上关于tab control控件的讲解都是vc6.0并且是基于对话框的我用08的直接在应用上!
但是我也按他们说的做了!效果没出来挺悲剧的!

也就是最好几步是这样的:最后是要求 为Tab Control添加消息处理程序void CTab_testView::OnInitialUpdate()函数

问题是添加这个函数时 、他直接出现在Tab control 的模板的文件中、我引用其他文件的变量就引用不到;

还有就是Tab control 对话框的上边你不给他添加类文件 、上边是没有消息处理的;

你要是想把oid CTab_testView::OnInitialUpdate()视图类中 就添加不进去;


或者说你们谁有08的 tab control控件的使用方法;
不是单独建立对话框模式的那中、在SDI单文档程序里面的那中;


你们若是要代码我也不知道发 那一部分;
都是系统自己生成的;我也就是分割了下
不知道说清楚了没;
帮帮忙!谢谢
我刚搞MFC!
...全文
173 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-08-09
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
zdbszy521 2011-07-13
  • 打赏
  • 举报
回复
假如我现在有个SDI程序,View是Form View,想在上面放个Tab Control,包含两个Page。现在让我们来看看应该怎样处理。

首先当然要增加一个Tab Control资源,然后利用Class Wizard,在View中增加一个Control变量。

接着建立两个对话框资源,别忘了把Style改为Child,Border改为None。然后就可以在上面加其他控件了。

接着利用Class Wizard,分别为这两个对话框建立两个类,比如CPage1和CPage2。

然后在View类头文件中,加入这两个对话框对象。同时增加一个变量int m_CurSelTab,用了表明是哪个Page即将被切换。

为了避免用户在切换Tab时,程序对Tab Index的枚举,可以利用数组来做这个事情。

在View的初始化函数中需要把CPage1、CPage2和Tab Control关联起来,并保存页面地址,设置初始页面,等等。

void CTab_testView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();

//为Tab Control增加两个页面
m_tab.InsertItem(0, _T("First"));
m_tab.InsertItem(1, _T("Second"));

//创建两个对话框
m_page1.Create(IDD_DIALOG1, &m_tab);
m_page2.Create(IDD_DIALOG2, &m_tab);

//设定在Tab内显示的范围
CRect rc;
m_tab.GetClientRect(rc);
rc.top += 20;
rc.bottom -= 8;
rc.left += 8;
rc.right -= 8;

m_page1.MoveWindow(&rc);
m_page2.MoveWindow(&rc);

//把对话框对象指针保存起来
pDialog[0] = &m_page1;
pDialog[1] = &m_page2;

//显示初始页面
pDialog[0]->ShowWindow(SW_SHOW);
pDialog[1]->ShowWindow(SW_HIDE);

//保存当前选择
m_CurSelTab = 0;
}

这里面需要注意的是,我用了一个CDialog指针数组来进行保存,数组的大小是Tab Control页面的个数,数组下标对应着每个页面的索引(这样方便快速存取)。

用户切换时,需要响应相关的消息。

void CTab_testView::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here

pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);
m_CurSelTab = m_tab.GetCurSel();
pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);

*pResult = 0;
}

首先我们先把当前的页面隐藏起来,然后得到新的页面索引,最后就把相关页面显示出来即可。这比一个个去枚举简单多了。

还有一点比较有意思,那就是DDX/DDV机制的运用。要想获得Tab Control各个页面的数据,可以利用DDX/DDV机制,但需要注意,因为这是多个页面,所以需要显式调用多次。

void CTab_testView::OnButton1()
{
// TODO: Add your control notification handler code here
m_page1.UpdateData();
m_page2.UpdateData();
CString str1 = m_page1.m_str1;
CString str2 = m_page2.m_str2;
AfxMessageBox(str1);
AfxMessageBox(str2);
}
zdbszy521 2011-07-13
  • 打赏
  • 举报
回复
http://hi.baidu.com/blue_never_died/blog/item/04398694249ef71ed21b7007.html

你们看看这个是什么意思
你们觉得他说起清楚 了吗!

allenhiman 2011-07-13
  • 打赏
  • 举报
回复
没说清楚 如果你会用tab控件 找教程看看 应该一大把

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧