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);
}
这样我们就成功的将子对话框背景设置为了纯白色: