MFC控件CTabCtrl关联变量

 

1.先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control控件放到对话框中的合适位置上。

再在对话框类中,将该控件绑定一个变量

用两种方法:

1 )

自己定义成员变量 CTabCtrl* m_editLineTab;

在OnInitDialog函数中:关联Tab的ID

m_editLineTab=(CTabCtrl*)GetDlgItem(IDC_EDITLINETAB);

然后就可以设置选项卡

2)用向导绑定一个变量,

在.h文件生成

// Dialog Data
 //{{AFX_DATA(DlgSymbolEdit)
 enum { IDD = IDD_DIALOG_SYMEDIT };
 CTabCtrl m_editLineTab;
 。。。。
 //}}AFX_DATA

.cpp文件中

DoDataExchange函数里也自动生成了DDX_Control(pDX, IDC_EDITLINETAB, m_editLineTab);

然后再OnInitDialog()中首先需要

m_editLineTab.SubclassDlgItem(IDC_EDITLINETAB,this);原因不知道

然后再做其他操作。

 

2.建立两个对话框程序,用来当做Tab Control控件的两个页。别忘了把Style改为Child,Border改为None。然后就可以在上面加其他控件了。

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

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

int m_CurSelTab; CPage1 m_page1; CPage2 m_page2; CDialog* pDialog[2];  //用来保存对话框对象指针

在对话框类的初始化函数中OnInitDialog()需要把CPage1、CPage2和Tab Control关联起来,并保存页面地址,设置初始页面。

  //为Tab Control增加两个页面        
  TCITEM tabItem;
    tabItem.mask = TCIF_TEXT;
    tabItem.pszText = "GDI";
    m_editLineTab->InsertItem(0, &tabItem);
    tabItem.pszText = "AGG";  
    m_editLineTab->InsertItem(1, &tabItem);
    //或者
   m_tab.InsertItem(0, _T("Farm"));
     m_tab.InsertItem(1, _T("Note")); 
    ////创建两个对话框    
   m_tabPage1.Create(IDD_TABPAGE1, &m_editLineTab);   
    m_tabPage2.Create(IDD_TABPAGE2, &m_editLineTab);
    ////设定在Tab内显示的范围     
   CRect rc; 
    m_editLineTab.GetClientRect(rc); 
    rc.top += 3; 
    rc.bottom -= 0; 
    rc.left += 0; 
    rc.right -= 0; 
    m_tabPage1.MoveWindow(&rc);
    m_tabPage2.MoveWindow(&rc);                               
    //把对话框对象指针保存起来       
   pDialog[0] = &m_tabPage1; 
    pDialog[1] = &m_tabPage2; 
    //显示初始页面
    pDialog[0]->ShowWindow(SW_SHOW); 
    pDialog[1]->ShowWindow(SW_HIDE); 
    //保存当前选择
    m_CurSelTab = 0;

 

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

接下来,为Tab Control添加消息处理程序:

ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CTabDlg::OnTcnSelchangeTab1)

 

void CTabDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
 {    
      //把当前的页面隐藏起来     
    pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);     
      //得到新的页面索引     
    m_CurSelTab = m_tab.GetCurSel();    
      //把新的页面显示出来    
    pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);    
     *pResult = 0; 
}

 

 

 
 
3.如果要在Tab Control控件外面获取其内部对话框中控件的数据,就需要使用DDX/DDV机制,还要调用相应的UpdateData函数。

    m_page1.UpdateData();    

   m_page2.UpdateData();

 

 

常见问题:我把Tab Control控件放在Group Box里面,它就不能显示.

 

之前的那个Group Box就像是覆盖了Tab Control.又尝试了很多次,发现Tab Control这个控件有点特殊,它一般会被其它控件遮住,这个也是Group Box的特点.系统应该是采用相似的方式处理它们的显示问题,即将它们设置为最底层,所以当它们重叠时,后建的就要被先建的遮住.

可以通过ctrl+d,然后鼠标点击调整Z序,只要TabCtrl的Z序在GroupBox前就没问题

控件Z序的问题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值