MFC 之 Tab Control 控件的使用

Tab Control 标签控件提供了一组标签按钮以及标签按钮所对应的页面,用户通过单击不同的标签来显示不同的页面,通过标签控件,我们可以大大的提高界面对各种组件的容纳程度。

一、标签控件的方法

构造函数

函数名 作用
CTabCtrl 构造一个 CTabCtrl 对象
Create 创建一个标签并将它与一个 CTabCtrl 对象关联

属性函数

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

操作函数

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

可重载函数

函数名 作用
DrawItem 绘制一个标签控件的指定项

二、标签控件的使用

step 1 添加 Tab Control 控件

我们继续使用上节的示例程序,我们在工具栏中拖拽一个 Tab Control 控件到主对话框上,然后右键添加变量:

step 2 创建 Tab 标签对应的子对话框

然后我们在资源视图的 Dialog 中插入两个子对话框,并将属性中的样式设置为 Child,边框设置为 none,然后将默认的两个按钮组件给删除,分别添加一个 Static Text 组件用来区分两个界面:

继续为插入的两个子对话框添加对话框类,右键子对话框,选择添加类:

step 3 在主对话框的头文件中生成子对话框的类

#include "Dialog1.h"
#include "Dialog2.h"

public:
	CTabCtrl m_tabCtrl;
	CDialog1 m_Dlg1;
	CDialog2 m_Dlg2;

step 4 主对话框的初始化

现在我们可以将子对话框插入到主对话框中,在对话框的 OnInitDialog() 中添加如下代码:

/* 为 CTabCtrl 控件插入对话框 */
// 为 CTabCtrl 控件插入标签
m_tabCtrl.InsertItem(0, L"公告", 0);
m_tabCtrl.InsertItem(1, L"其他好物", 1);

// 创建两个子对话框
m_Dlg1.Create(IDD_DIALOG1, &m_tabCtrl);
m_Dlg2.Create(IDD_DIALOG2, &m_tabCtrl);

// 设置对话框在 CTabCtrl 控件内的大小和位置
CRect rc;
m_tabCtrl.GetClientRect(&rc);
CRect rcTabItem;
m_tabCtrl.GetItemRect(0, rcTabItem);
rc.top += rcTabItem.Height() + 4;
rc.left += 4;
rc.bottom -= 4;
rc.right -= 4;
m_Dlg1.MoveWindow(&rc);
m_Dlg2.MoveWindow(&rc);

// 默认标签选中
m_Dlg1.ShowWindow(SW_SHOW);
m_tabCtrl.SetCurFocus(0);

step 5 处理标签选项切换事件

双击主对话框中的 Tab Control 控件会自动跳到 TCN_SELCHANGE 处理函数,我们根据当前选中的标签来展示对应的子对话框:

// 在主对话框中处理 TabCtl 空间的 TCN_SELCHANGE 消息
void CHighSpeedDownloaderDlg::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
	//// TODO: 在此添加控件通知处理程序代码
	switch (m_tabCtrl.GetCurSel())
	{
	case 0:
		m_Dlg1.ShowWindow(SW_SHOW);
		m_Dlg2.ShowWindow(SW_HIDE);
		m_Dlg1.SetFocus();
		break;
	case 1:
		m_Dlg1.ShowWindow(SW_HIDE);
		m_Dlg2.ShowWindow(SW_SHOW);
		m_Dlg2.SetFocus();
		break;
	default:
		break;
	}

	*pResult = 0;
}

效果如下:

三、将子对话框背景设置为白色

我们可以看到生成的程序子对话框不是纯白的,没有那么好看,那么我们怎么样对子对话框的背景颜色进行设置呢?

其实我们只要在子对话框中响应 WM_CTLCOLOR 消息就能够实现这个功能。我们找到需要设置的子对话框右键 -> 建立类向导 -> 消息 -> 加入 WM_CTLCOLOR 消息,会自动生成 OnCtlColor() 函数,我们修改如下:

HBRUSH CDialog1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	//return hbr;
	return (HBRUSH)::GetStockObject(WHITE_BRUSH);
}

这样我们就成功的将子对话框背景设置为了纯白色:

posted @ 2024-09-23 19:59  lostin9772  阅读(777)  评论(0)    收藏  举报