MFC--Tab Control


  标签控件的通知消息
       在对标签控件进行一些操作,比如点击标签时,标签控件也会向父窗口发送一些通知消息。我们可以为这些通知消息添加处理函数,实现各种功能。标签控件的主要通知消息及含义如下所示:
       TCN_SELCHANGE:通知父窗口控件的标签选择项已经改变
       TCN_SELCHANGING 通知父窗口控件的标签选择项正在改变
       TCN_KEYDOWN:通知父窗口在控件范围内键盘被按下
       TCN_GETOBJECT:具有TCS_EX_REGISTERDROP扩展特性并且对象被拖动时的通知消息
       TCN_FOCUSCHANGE:通知父窗口控件的按钮聚焦已经改变
       NM_CLICK:通知父窗口用户在控件区域范围内点击了鼠标左键
       NM_RCLICK:通知父窗口用户在控件区域范围内点击了鼠标右键
       NM_RELEASEDCAPTURE:通知父窗口在控件区域范围内释放鼠标捕获消息
        标签控件的相关结构体
       标签控件在使用中也有一些相关的结构体经常用到,主要以下几个:
        1. TCITEMHEADER结构体
       该结构体用来指定或获取标签控件本身的属性。用在TCM_INSERTITEM、TCM_GETITEM和TCM_SETITEM消息中。
1
2
3
4
5
6
7
8
typedef struct tagTCITEMHEADER {
UINT mask; // 掩码,可以为TCIF_IMAGE(iImage成员有效)、TCIF_RTLREADING、TCIF_TEXT(pszText成员有效)
UINT lpReserved1; // 预留
UINT lpReserved2; // 预留
LPTSTR pszText; // 标签文本字符串
int cchTextMax;
int iImage; // 图标在标签控件图像序列中的索引
} TCITEMHEADER, *LPTCITEMHEADER;
 
        2. TCITEM结构体
       该结构体用来指定或获取标签页的属性。用在TCM_INSERTITEM、TCM_GETITEM和TCM_SETITEM消息中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct tagTCITEM {
UINT mask; // 掩码,可以是TCIF_IMAGE(iImage成员有效)、TCIF_PARAM(lParam成员有效)、TCIF_RTLREADING、TCIF_STATE、TCIF_TEXT(pszText成员有效)
#if (_WIN32_IE >= 0x0300)
DWORD dwState;
DWORD dwStateMask;
#else
UINT lpReserved1;
UINT lpReserved2;
#endif
LPTSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam; // 与标签页关联的32位数据
} TCITEM, *LPTCITEM;
        3. TCHITTESTINFO结构体
       该结构体包含了鼠标单击测试的信息。
1
2
3
4
typedef struct tagTCHITTESTINFO {
POINT pt; // 鼠标点击测试的客户区坐标
UINT flags; // 接收点击测试的结果。有以下几种:TCHT_NOWHERE(坐标点不在标签上)、TCHT_ONITEM(坐标点在标签上但不在标签文本或图标上)、TCHT_ONITEMICON(坐标点在标签图标上)、TCHT_ONITEMLABEL(坐标点在标签文本上)
} TCHITTESTINFO, *LPTCHITTESTINFO;
        4. NMTCKEYDOWN结构体
       该结构体包含了标签控件中键盘按下的相关信息。主要用在TCN_KEYDOWN通知消息中。
1
2
3
4
5
typedef struct tagNMTCKEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} NMTCKEYDOWN;
      
    标签控件的创建
       MFC为标签控件的操作提供了CTabCtrl类。
       与之前的控件类似,创建标签控件可以在对话框模板中直接拖入Tab Control,也可以使用CTabCtrl类的Create成员函数创建。Create函数的原型如下:
1
2
3
4
5
6
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
       参数dwStyle为标签控件的风格,rect为标签控件的位置和大小,pParentWnd为指向标签控件父窗口的指针,nID指定标签控件的ID。这里还是要具体说下dwStyle,下面列出了几种主要的控件风格:
       TCS_BUTTONS:标签(控件上部用来选择标签页的位置)外观为按钮风格,且整个控件周围没有边框。
       TCS_FIXEDWIDTH :所有标签具有相同的宽度。
       TCS_MULTILINE:标签以多行显示,如果需要,可以显示所有标签。
       TCS_SINGLELINE:只显示一行标签,用户可以滚动着看其他标签。
       TCS_TABS:标签以普通标签样式显示,且整个控件周围有边框。
       如果想了解标签控件的所有风格,可以查阅MSDN。
        CTabCtrl类的主要成员函数
        int GetCurSel( ) const;
       获取标签控件中当前选择标签的索引。如果成功则返回选择标签的索引,否则返回-1。
        BOOL GetItem(int nItem,TCITEM* pTabCtrlItem) const;
       获取标签控件中某个标签的信息。参数nItem为标签索引,pTabCtrlItem为指向TCITEM结构体的指针,用来接收标签信息。若获取成功返回TRUE,否则返回FALSE。
        int GetItemCount( ) const;
       获取标签控件中标签的数量。
        int SetCurSel(int nItem);
       在标签控件中选择某标签。参数nItem为要选择的标签的索引。如果成功则返回之前选择标签的索引,否则返回-1。
        BOOL SetItem(int nItem,TCITEM* pTabCtrlItem);
       设置某标签的所有或部分属性。参数nItem为标签的索引,pTabCtrlItem为指向TCITEM结构体的指针,包含了新的标签属性。成功则返回TRUE,否则返回FALSE。
        BOOL DeleteAllItems( );
       删除标签控件中所有标签。
        BOOL DeleteItem(int nItem);
       删除标签控件中的某个标签。参数nItem为要删除标签的索引。
        LONG InsertItem(int nItem,LPCTSTR lpszItem);
       在标签控件中插入新的标签。参数nItem为新标签的索引,lpszItem为标签文本字符串。如果插入成功则返回新标签的索引,否则返回-1。


具体代码:

//导入图片,绑定imagelist为实现带图标的头
void CTabCtrlDlg::InitTab()
{
导入图片,绑定imagelist为实现带图标的头
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP_1);
m_imgList.Create(16, 16, ILC_COLOR24 | ILC_MASK, 6, 1);
m_imgList.Add(&bmp, RGB(255, 255, 255));
TCITEM tcitem;

        //添加选项卡
m_TabCtrl.InsertItem(0,TEXT("Tab1"));  //添加参数一选项卡
m_TabCtrl.InsertItem(1,TEXT("Tab2"));  //添加参数二选项卡
m_TabCtrl.InsertItem(2,TEXT("Tab3"));    //添加参数三选项卡
m_TabCtrl.SetMinTabWidth(100);//设置选项卡宽度
m_TabCtrl.SetImageList(&m_imgList);//绑定imagelist
m_imgList.Detach();
tcitem.mask=TCIF_IMAGE;//设置图标格式
for (int i=0;i<3;i++)
{
m_TabCtrl.GetItem(i,&tcitem);
tcitem.iImage=i;
m_TabCtrl.SetItem(i,&tcitem);
}
m_Dlg1.Create(IDD_TAB1DLG,GetDlgItem(IDC_TAB_1));//创建对话框 父类为Tab Control所在的对话框
m_Dlg2.Create(IDD_TAB2DLG,GetDlgItem(IDC_TAB_1));
m_Dlg3.Create(IDD_TAB3DLG,GetDlgItem(IDC_TAB_1));
}

//调整位置

void CTabCtrlDlg::ResetPosition()
{
if(m_TabCtrl.GetSafeHwnd())
{
CRect rs;
m_TabCtrl.GetClientRect(&rs);
//调整子对话框在父窗口中的位置
rs.top += 23; 
rs.bottom -= 4; 
rs.left += 2; 
rs.right -= 4; 


//设置子对话框尺寸并移动到指定位置
m_Dlg1.MoveWindow(&rs);
m_Dlg2.MoveWindow(&rs);
m_Dlg3.MoveWindow(&rs);
//调整子对话框里控件的位置
//m_Dlg1.GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL, 500, 4,  50, 22, SWP_NOZORDER);

//分别设置隐藏和显示
m_Dlg1.ShowWindow(true);
m_Dlg2.ShowWindow(false);
m_Dlg3.ShowWindow(false);


//设置默认的选项卡
m_TabCtrl.SetCurSel(0);
}
}

//添加消息处理

void CTabCtrlDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
int CurSel = m_TabCtrl.GetCurSel();
switch(CurSel)
{
case 0:
m_Dlg1.ShowWindow(true);
m_Dlg2.ShowWindow(false);
m_Dlg3.ShowWindow(false);
break;
case 1:
m_Dlg1.ShowWindow(false);
m_Dlg2.ShowWindow(true);
m_Dlg3.ShowWindow(false);
break;
case 2:
m_Dlg1.ShowWindow(false);
m_Dlg2.ShowWindow(false);
m_Dlg3.ShowWindow(true);
break;
default:
;
}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值