标签控件提供了一组标签按钮以及与按钮对应的显示页面,用户可以单击标签按钮选择不同的显示页面,这个不同的页面实际上是不同的对话框。要使用标签控件需包含的头文件为afxcmn.h,可以在头文件中加入一下代码:

#include <afxcmn.h>
CTabCtrl 类的成员函数如下(摘自MSDN Library):

构造

CTabCtrl构造一个CTabCtrl对象
Create创建一个标签控件并将它与一个CTabCtrl对象连接


属性

GetImageList获取与一个标签控件相关的图像列表
SetImageList将一个图像列表分配给一个标签控件
GetItemCount获取此标签控件中的标签的数目
GetItem获取此标签控件中的某一个标签的信息
SetItemExtra设置一个标签控件中的每一个标签为应用程序定义的数据所保留的字节数
GetItemRect获取一个标签控件中的一个标签的边界矩形
GetCurSel确定在一个标签控件中当前选择的标签
SetCurSel在一个标签控件中选择一个标签
SetCurFocus将焦点设置到一个标签控件中的指定标签上
SetItemSize设置某个项的宽度和高度
SetPadding设置一个标签控件中的每一个标签的图标和标签周围的空间(填料)
GetRowCount获取一个标签控件中的标签的当前行数
GetToolTips获取与一个标签控件相关联的工具提示控件的句柄
SetToolTips将一个工具提示控件赋给一个标签控件
GetCurFocus获取一个标签控件的具有当前焦点的标签
SetMinTabWidth设置一个标签控件中的项的最小宽度
GetExtendedStyle获取标签控件当前使用的扩展风格
SetExTendedStyle设置一个标签控件的扩展风格
GetItemState获取指定标签控件项的状态
SetItemState设置指定标签控件项的状态


操作

InsertItem在一个标签控件中插入一个新的标签
DeleteItem从一个标签控件中删除一项
DeleteAllItems从一个标签控件中删除所有的项
AdjustRect根据一个给定的窗口矩形来估算一个标签控件的的显示区域,或根据一个给定的显示区域来估算与之对应的窗口矩形
RemoveImage从一个标签控件的图像列表中删除一个图像
HitTest确定哪一个标签(如果有的话)位于指定的屏幕位置
DeselectAll重新设置一个标签控件中的项,清除任何被按下的项
HighlightItem设置一个标签项的加亮状态


可重载函数

DrawItem绘制一个标签控件的指定项

下面以实例来演示CTabCtrl控件的创建,常用成员函数的应用。

1.新建MFC对话框项目。在对话框中添加一个CTabCtrl控件,如下:

2.为该控价关联一个一个变量,如下:

 3. 为让运行后的程序界面更好看一些,在对话框中添加一个GroupBox控件,并将先前添加的CTabCtrl控件拖到GroupBox控件中,并添加一个按钮,如下图示:

上面有显示顺序,如果 GroupBox控件的顺序为1,CTabCtrl控件会被GroupBox控件覆盖而显示不出来。

 4. 插入内容 在对话框的OnInitDialog()函数中添加如下代码:

完整的 OnInitDialog()函数代码如下:

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

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

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

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		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: 在此添加额外的初始化代码
	m_TabCtrl.InsertItem(0,_T("产品设计"));
	m_TabCtrl.InsertItem(1, _T("模具设计与制造"));
	m_TabCtrl.InsertItem(2, _T("治具及配套专机设计与制造"));
	m_TabCtrl.InsertItem(3, _T("样品制作与确认"));
	m_TabCtrl.InsertItem(4, _T("量试及移交量产"));
	m_TabCtrl, ShowWindow(SW_SHOW);
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

开始执行不调试,结果如下:

 5. 设计标签对话框  分别设计对应的对话框,将新设计的对话框的Style设置为child,并为对话框添加相应的类。如下:

 

 

6. 在CTabCtrlTestDlg.h中包含新建对话框响应类的头文件,如下:


#include "CPTest.h"
#include "CSample.h"
#include "CMoldDesignAndManufacture.h"
#include "CTMDesignAndManufacture.h"
#include "CDialog_PDesign.h"

7. 在CTabCtrlTestDlg.h中声明变量,如下:

   CDialog_PDesign* pCDialog_PDesign;
    CPTest* pCPTest;
    CSample* pCSample;
    CMoldDesignAndManufacture* pCMoldDesignAndManufacture;
    CTMDesignAndManufacture* pCTMDesignAndManufacture;

8. CTabCtrlTestDlg.cpp的OnInitDialog()中添加如下代码:

 添加代码后的OnInitDialog()如下:

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

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

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

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		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: 在此添加额外的初始化代码
	m_TabCtrl.InsertItem(0,_T("产品设计"));
	m_TabCtrl.InsertItem(1, _T("模具设计与制造"));
	m_TabCtrl.InsertItem(2, _T("治具及配套专机设计与制造"));
	m_TabCtrl.InsertItem(3, _T("样品制作与确认"));
	m_TabCtrl.InsertItem(4, _T("量试及移交量产"));
	pCDialog_PDesign = new CDialog_PDesign();
	pCDialog_PDesign->Create(IDD_DIALOG_PDESIGN,&m_TabCtrl);
	pCPTest = new CPTest();
	pCPTest->Create(IDD_DIALOG_PTEST, &m_TabCtrl);
	pCSample = new CSample();
	pCSample->Create(IDD_DIALOG_SAMPLING, &m_TabCtrl);
	pCMoldDesignAndManufacture = new CMoldDesignAndManufacture();
	pCMoldDesignAndManufacture->Create(IDD_DIALOG_MOLDDM, &m_TabCtrl);
	pCTMDesignAndManufacture = new CTMDesignAndManufacture();
	pCTMDesignAndManufacture->Create(IDD_DIALOG_TMDM, &m_TabCtrl);
	pCDialog_PDesign->CenterWindow();
	pCDialog_PDesign->ShowWindow(SW_SHOW);
	
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

 9.为对话中的CTabCtrl控件添加OnTcnSelchange消息处理函数,如下:

void CCTabCtrlTestDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	int mSel = m_TabCtrl.GetCurSel();
	switch (mSel)
	{
	case 0:
		pCDialog_PDesign->CenterWindow();
		pCDialog_PDesign->ShowWindow(SW_SHOW);
		pCPTest-> ShowWindow(SW_HIDE);
		pCSample-> ShowWindow(SW_HIDE);
		pCMoldDesignAndManufacture-> ShowWindow(SW_HIDE);
		pCTMDesignAndManufacture-> ShowWindow(SW_HIDE);
		break;
	case 1:
		pCDialog_PDesign->ShowWindow(SW_HIDE);
		pCPTest->ShowWindow(SW_HIDE);
		pCSample->ShowWindow(SW_HIDE);
		pCMoldDesignAndManufacture->CenterWindow();
		pCMoldDesignAndManufacture->ShowWindow(SW_SHOW);
		pCTMDesignAndManufacture->ShowWindow(SW_HIDE);
		break;
	case 2:
		pCDialog_PDesign->ShowWindow(SW_HIDE);
		pCPTest->ShowWindow(SW_HIDE);
		pCSample->ShowWindow(SW_HIDE);
		pCMoldDesignAndManufacture->ShowWindow(SW_HIDE);
		pCTMDesignAndManufacture->CenterWindow();
		pCTMDesignAndManufacture->ShowWindow(SW_SHOW);
		break;
	case 3:
		pCDialog_PDesign->ShowWindow(SW_HIDE);
		pCPTest->ShowWindow(SW_HIDE);
		pCSample->CenterWindow();
		pCSample->ShowWindow(SW_SHOW);
		pCMoldDesignAndManufacture->ShowWindow(SW_HIDE);
		pCTMDesignAndManufacture->ShowWindow(SW_HIDE);
		break;
	case 4:
		pCDialog_PDesign->ShowWindow(SW_HIDE);
		pCPTest->CenterWindow();
		pCPTest->ShowWindow(SW_SHOW);
		pCSample->ShowWindow(SW_HIDE);
		pCMoldDesignAndManufacture->ShowWindow(SW_HIDE);
		pCTMDesignAndManufacture->ShowWindow(SW_HIDE);
		break;
	default:
		pCDialog_PDesign->CenterWindow();
		pCDialog_PDesign->ShowWindow(SW_SHOW);
		pCPTest->ShowWindow(SW_HIDE);
		pCSample->ShowWindow(SW_HIDE);
		pCMoldDesignAndManufacture->ShowWindow(SW_HIDE);
		pCTMDesignAndManufacture->ShowWindow(SW_HIDE);
		break;
	}
	*pResult = 0;
}

执行程序(不调试),结果如下:

 点击“模具设计与制造”,结果如下:

 这里已完整演示了CTabCtrl(标签)控件的创建过程,对话框中的实现就不去完成了。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐