CTabCtrl 部分用法

Tab控件


#include <afxcmn.h>

CTabCtrl m_Tab;


要用Tab控件,在窗口中插入Tab控件的同时,还要为每一页创建一个子窗口。

具体步骤如下,插入Dialog,设置样式为“下层”,边框“无”。


为上面的对话框创建新类,继承CDialog.

class CPage1 : public CDialog

{

};


在主窗口中为每个子窗口添加一个变量,用于对子窗口的创建,消息传递等(窗口间的消息传递通过主窗口实现)

protected:

CPage1 page1;

CPage2 page2;


在主窗口的OnInitDialog中初始化Tab控件和子窗口

//关联变量与控件ID

m_Tab1.SubclassDlgItem(IDC_TAB1,this);

//添加页标题
m_Tab1.InsertItem(0,"第一页");
m_Tab1.InsertItem(1,"第二页");

//创建子窗口
page1.Create(IDD_PAGE1,GetDlgItem(IDC_TAB1));
page2.Create(IDD_PAGE2,GetDlgItem(IDC_TAB1));

//把子窗口大小改成Tab控件大小
CRect rect;
m_Tab1.GetClientRect(rect);
rect.top += 20;
rect.left -= 4;
rect.right -= 4;
rect.bottom -= 4;
page1.MoveWindow(&rect);
page2.MoveWindow(&rect);
page1.ShowWindow(SW_SHOW);
page2.ShowWindow(SW_HIDE);


在主窗口添加消息映射

ON_NOTIFY(TCN_SELCHANGE,IDC_TAB1,OnSelChangeTab)

TCN_SELCHANGE 在当前页改变后发送
TCN_SELCHANGING 在当前页改变时发送可以通过返回TRUE来禁止页面的改变

消息响应函数一般设置为

void OnSelChangeTab(NMHDR* pNMHDR,LRESULT* pResult);


void OnSelChangeTab(NMHDR* pNMHDR,LRESULT* pResult)
{
int n = m_Tab1.GetCurSel();
switch(n)
{
case 0:
page1.ShowWindow(SW_SHOW);
page2.ShowWindow(SW_HIDE);
break;
case 1:
page1.ShowWindow(SW_HIDE);
page2.ShowWindow(SW_SHOW);
break;
}
return 0;
}



下面是页之间传递消息的例子

第一页有一个列表控件,第二页有一个编辑框和一个按钮

要实现的功能是:按下第二页按钮时,把第二页编辑框中内容添加到第一页的列表控件

class CPage1 : public CDialog
{
public:
CPage1(CWnd *pParentWnd = NULL);
public:
CListBox m_List1;
protected:
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
};

class CPage2 : public CDialog
{
public:
CPage2(CWnd *pParentWnd = NULL);
protected:
virtual BOOL OnInitDialog();

//按下按钮时,向主窗口发送消息
afx_msg void OnButton();
DECLARE_MESSAGE_MAP()
};

//下面是主窗口类

class CMainDialog : public CDialog
{
public:
CMainDialog (CWnd* pParentWnd = NULL);
protected:
CTabCtrl m_Tab1;
CPage1 page1;
CPage2 page2;
protected:
virtual BOOL OnInitDialog();
afx_msg BOOL OnSelChangeTab(NMHDR* pNMHDR,LRESULT* pResult);
afx_msg void OnPage2Button(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
};


当在第二页按下按钮时,程序转到消息响应函数OnButton

void CPage2::OnButton()
{

//因为Page1的父窗口时Tab控件,Tab控件的父窗口才是主窗口,所以这里要用两个GetParent

//WM_PAGE2ONBUTTON是自定义消息,#define WM_PAGE2ONBUTTON WM_USER+1
::PostMessage(GetParent()->GetParent()->m_hWnd,WM_PAGE2ONBUTTON,NULL,NULL);
}

注: PostMessage:不需要指定接收消息的窗口,但是消息只能发往本窗口
::PostMessage:需要指定接收消息的窗口,但是消息可以发往任意窗口


主窗口添加消息响应

ON_MESSAGE(WM_PAGE2ONBUTTON,OnPage2Button)

void CMainDialog::OnPage2Button(WPARAM wParam,LPARAM lParam)
{
CString Text;
page2.GetDlgItemText(IDC_EDIT1,Text);
page1.m_List1.InsertString(-1,Text);
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* 使用方法: 添加对话框资源,并且各个子对话框资源的属性应设置为:Style为Child,Border为None。 为这些对话框建立类(直接从CDialog继承)如CPage1、CPage2…… 在主对话框的类中添加成员变量:CPage1 m_Page1;、CPage2 m_Page2;…… 在主对话框资源中,加入一个Tab Control,并且适当调整位置和大小。利用ClassWizard来为这个Tab Control创建 一个CTabSheet的控件变量m_TabSheet。 在主对话框的OnInitDialog()加入: m_TabSheet.AddPage("tab1", &m_page1, IDD_DIALOG1); m_TabSheet.AddPage("tab2", &m_page2, IDD_DIALOG2); …… 如果要给标签加上图标,在AddPage之前设置好ImageList: //为TabCtrl控件添加图标 m_imageList.Create(16, 16, ILC_COLOR32, 1, 1); CBitmap bitmap1,bitmap2; bitmap1.LoadBitmap(IDB_BITMAP1); bitmap2.LoadBitmap(IDB_BITMAP2); m_imageList.Add(&bitmap1, RGB(0,0,0)); m_imageList.Add(&bitmap2, RGB(0,0,0)); m_TabSheet.SetImageList(&m_imageList); //给TabCtrl添加页 m_TabSheet.AddPage(_T("Page1"), &m_Page1, m_Page1.IDD, 0); m_TabSheet.AddPage(_T("第二页"), &m_Page2, m_Page2.IDD, 1); 很不可思议的是,我在测试中,如果在工程中没有把TabCtrl的标签设置成左边或右边的话, 那么在运行时修改标签的位置为左边或右边时会出现问题,但是只要曾经设置过TabCtrl的标签为左边或右边后, 以后运行不管工程中的TabCtrl的标签是怎样设置的,在运行时都可以正确的修改其标签的位置。 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值