Tab控件 各Tab之间切换混乱

wjx0109 2011-03-08 02:03:26
很简单的一个程序,不知道为什么点击各Tab切换标签时显示出现问题。
打开程序是显示的是窗口IDD_MainTab1,此时点击Tab2,显示窗口还是为IDD_MainTab1,此时再点击Tab1,显示窗口为IDD_MainTab2,此时再点击Tab2,显示窗口为IDD_MainTab1,此时点击Tab3显示窗口为IDD_MainTab2,此时再点击Tab1,显示窗口为IDD_MainTab3。真的把我搞糊涂了,UpdateTab()应该没错,问题貌似出现在OnSelchanging中。请教各位了,在线等。

代码如下:


void CTestDlg::UpdateTab()
{

m_MainTab.InsertItem(0,"TAB1");
m_MainTab.InsertItem(1,"TAB2");
m_MainTab.InsertItem(2,"TAB3");
page1.Create(IDD_MainTab1,GetDlgItem(IDC_MainTab));
page2.Create(IDD_MainTab2,GetDlgItem(IDC_MainTab));
page3.Create(IDD_MainTab3,GetDlgItem(IDC_MainTab));
CRect rect;
m_MainTab.GetClientRect(&rect);
rect.top+=20;
rect.bottom-=5;
rect.left+=5;
rect.right-=5;
page1.MoveWindow(&rect);
page2.MoveWindow(&rect);
page3.MoveWindow(&rect);

m_MainTab.SetCurSel(0);
}

void CTestDlg::OnSelchangingMainTab(NMHDR* pNMHDR, LRESULT* pResult)
{
switch(m_MainTab.GetCurSel())
{
case 0:
page1.ShowWindow(SW_SHOW);
page2.ShowWindow(SW_HIDE);
page3.ShowWindow(SW_HIDE);
break;
case 1:
page1.ShowWindow(SW_HIDE);
page2.ShowWindow(SW_SHOW);
page3.ShowWindow(SW_HIDE);
break;
case 2:
page1.ShowWindow(SW_HIDE);
page2.ShowWindow(SW_HIDE);
page3.ShowWindow(SW_SHOW);
break;
default:
break;
}
*pResult = 0;
}
...全文
217 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjx0109 2011-03-08
  • 打赏
  • 举报
回复
问题解决了 不应该使用::OnSelchangingMainTab
应该用::OnSelchangeMainTab

详见:http://topic.csdn.net/u/20081205/13/36f274ef-1969-484d-9968-0f76a457955e.html

不过还是谢谢你了!
wjx0109 2011-03-08
  • 打赏
  • 举报
回复
已经在主窗口中
#include "Tab1.h"
#include "Tab2.h"
#include "Tab3.h"
wjx0109 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sxqinge 的回复:]
呵呵,还是你之前那样定义吧,就是定义为成员变量,在.h里:
CTab *pDlg;
然后再初始化函数里面进行变量的定义:
pDlg = new CTab(&m_tab);//就是得进行初始化定义
pDlg->Create(XXX,XXX);
[/Quote]
我分别在Tab1.h,Tab2.h,Tab3.h中定义了CTab1 *pDlg1;,CTab2 *pDlg2;,CTab3 *pDlg3;。
可是在主窗口的OnInitDialog()函数中*pDlg1 = new CTab1(&m_MainTab);还是提示我pDlg1未定义。
sxqinge 2011-03-08
  • 打赏
  • 举报
回复
呵呵,还是你之前那样定义吧,就是定义为成员变量,在.h里:
CTab *pDlg;
然后再初始化函数里面进行变量的定义:
pDlg = new CTab(&m_tab);//就是得进行初始化定义
pDlg->Create(XXX,XXX);
wjx0109 2011-03-08
  • 打赏
  • 举报
回复
在OnSelchanging中在定义一次
CTab1* pDlg1 = new CTab1(&m_MainTab);
CTab2* pDlg2 = new CTab2(&m_MainTab);
CTab3* pDlg3 = new CTab3(&m_MainTab);
切换标签时程序会崩溃
wjx0109 2011-03-08
  • 打赏
  • 举报
回复
我开始是直接
CTab1 page1;
CTab2 page2;
CTab3 page3;
请问这样定义和用指针这种方式有什么区别呢?
wjx0109 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sxqinge 的回复:]
在你的UpdateTab()里定义就行了,记得加上头文件哦
[/Quote]
是的,定义了 ,可是OnSelchanging中,提示指针未定义。


void CTestDlg::OnSelchangingMainTab(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
//int CurSel = m_MainTab.GetCurSel();

switch(m_MainTab.GetCurSel())
{
case 0:
pDlg1->ShowWindow(SW_SHOW);
pDlg2->ShowWindow(SW_HIDE);
pDlg3->ShowWindow(SW_HIDE);
break;
case 1:
pDlg1->ShowWindow(SW_HIDE);
pDlg2->ShowWindow(SW_SHOW);
pDlg3->ShowWindow(SW_HIDE);
break;
case 2:
pDlg1->ShowWindow(SW_HIDE);
pDlg2->ShowWindow(SW_HIDE);
pDlg3->ShowWindow(SW_SHOW);
break;
default:
break;
}
*pResult = 0;
}
sxqinge 2011-03-08
  • 打赏
  • 举报
回复
在你的UpdateTab()里定义就行了,记得加上头文件哦
wjx0109 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sxqinge 的回复:]
page1等指针你都得赋个初值吧?也不new下?
CSetCommandDlg* pDlg = new CSetCommandDlg(&m_tab);
pDlg->Create(IDD_SETCOMMAND, &m_tab);
[/Quote]

请问
CTab1* pDlg1 = new CTab1(&m_MainTab);
CTab2* pDlg2 = new CTab2(&m_MainTab);
CTab3* pDlg3 = new CTab3(&m_MainTab);
这个应该在哪定义呢?我是新手见笑了。
sxqinge 2011-03-08
  • 打赏
  • 举报
回复
page1等指针你都得赋个初值吧?也不new下?
CSetCommandDlg* pDlg = new CSetCommandDlg(&m_tab);
pDlg->Create(IDD_SETCOMMAND, &m_tab);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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