您的位置:首页 > 其它

MFC中 Tab Control 控件的使用

2013-06-04 09:35 274 查看
实现的功能:

在一个标签控件中加入两个标签页,标签文本分别为“标签1”和“标签2”,点击不同的标签显示不同的标签页。

具体步骤如下:

1. 创建一个基于对话框的MFC工程,名称设置为“TestTap”。

2. 在自动生成的对话框模板IDD_TESTTAP_DIALOG中,删除“TODO: Place dialog controls here.”静态文本框、“OK”按钮和“Cancel”按钮。添加一个Tab Control控件,并为其关联一个CTabCtrl类型的控件变量m_tab。

3. 添加两个基于MFC对话框的类,类名为CTab1Dlg,CTab2Dlg。在资源视图里,就自动新生成了两个对话框IDD_TAB1DLG和IDD_TAB2DLG。然后两者都将Border属性设为 None,Style属性设为Child。

4. 在“TestTapDlg.h”文件中添加头文件:

#include “Tab1Dlg.h”

#include “Tab2Dlg.h”

然后继续在“TestTapDlg.h”文件中为CTestTapDlg类添加两个成员变量:

CTab1Dlg m_tab1Dlg;
CTab2Dlg m_tab2Dlg;

5. 在CTestTapDlg对话框初始化时,我们也初始化标签控件。修改CTestTapDlg::OnInitDialog()函数如下:

BOOL CTestTapDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);            // 设置大图标
SetIcon(m_hIcon, FALSE);        // 设置小图标

// TODO: 在此添加额外的初始化代码

//初始化标签控件
CRect tabRect;   // 标签控件客户区的位置和大小
m_tab.InsertItem(0, _T("标签1")); // 插入第一个标签
m_tab.InsertItem(1, _T("标签2"));  // 插入第二个标签

m_tab1Dlg.Create(IDD_POETSORTDLG, &m_tab);    // 创建第一个标签页
m_tab2Dlg.Create(IDD_POETRYSORTDLG, &m_tab); // 创建第二个标签页

m_tab.GetClientRect(&tabRect);    // 获取标签控件客户区Rect

// 调整tabRect,使其覆盖范围适合放置标签页
tabRect.left += 25;
tabRect.right -= 1;
tabRect.top += 1;
tabRect.bottom -= 1;

// 根据调整好的tabRect放置m_poetsortDlg子对话框,并设置为显示
m_tab1Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
// 根据调整好的tabRect放置m_poetrysortDlg子对话框,并设置为隐藏
m_tab2Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


6. 运行程序,查看结果,这时我们发现切换标签时,标签页并不跟着切换,而总是显示标签1。

7. 我们要实现的是标签页的切换效果,所以还要为m_tab标签控件的通知消息TCN_SELCHANGE添加处理函数,并修改如下:

void CTestTapDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;

CRect tabRect;    // 标签控件客户区的Rect

// 获取标签控件客户区Rect,并对其调整,以适合放置标签页
m_tab.GetClientRect(&tabRect);
tabRect.left += 25;
tabRect.right -= 1;
tabRect.top += 1;
tabRect.bottom -= 1;

switch (m_tab.GetCurSel())
{
// 如果标签控件当前选择标签为“标签1”,则显示m_tab1Dlg对话框,隐藏m_tab2Dlg对话框
case 0:
m_tab1Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
m_tab2Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
break;
// 如果标签控件当前选择标签为“标签2”,则隐藏m_tab1Dlg对话框,显示m_tab2Dlg对话框
case 1:
m_tab1Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_tab2Dlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
break;
default:
break;
}
}


8.运行程序,大功告成~~~ ^_^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: