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);
}