使用过属性表和属性页控件的人,使用感觉方便的同时,又感觉困惑。能不能改变属性页标签的位置,比如放在窗体的左侧,能不能制作出漂亮的界面。这些问题完全可以由CTabCtrl解决。
网上详细讲解这个控件文章很少,大多讲的比较基础。最近做一个项目要用到,因此就好好学习了,写了来供交流。引用请注明出处:
1、CTabCtrl控件概观
CTabCtrl类是MFC类CWnd类的子类。类的层次结构如图1所示。
CObject |
└CCmdTarget |
└CWnd |
└CTabCtrl |
使用CTabCtrl可以做成像属性页(CProperPage)一样的标签页(停靠卡),而且他的位置可以放在界面的左侧。我的项目中做出来的效果如图2所示。
图2 CTabCtrl控件效果
2、CTabCtrl控件成员变量和成员函数介绍
一个“标签控件”类似于一个笔记本中的分隔器,或一个文件柜上的标签。通过使用标签控件,应用程序可以将一个窗口或对话框的相同区域定义为多个页面。每一页包含了一套信息或一组控件,当用户选择了相应的标签时应用程序就会显示相应的信息或控件。一种特殊类型的标签控件把标签显示得像按钮一样。点击一个按钮将立即执行一条命令而不是显示一个页。
CTabCtrl类提供了Windows通用标签控件的性能。这个控件(也就是CTabCtrl类)只对运行在Windows 95和Windows NT 3.51或更新版本下的程序来说是可用的。
有关使用CTabCtrl的更多信息,参见“Visual C++程序员指南”中的“控件主题”和“使用CTabCtrl”。
1、构建CTabCtrl对象
上面是MSDN中的说明。构建一个CTabCtrl对象,我们可以在工具栏中直接添加,然后添加控件变量,也可以使用Create或者CreateEx动态创建或者附加一个CTabCtrl控件。
2、CTabCtrl控件操作
构建好一个空间后,我们开始使用它的成员函数,进行一些操作和控制。成员函数如下:
分一下类,比较常用的主要实现一下三种功能。
功能 | 成员函数 |
操作属性(获得窗口属性,设置窗口属性,设置图像) | GetExtendedStyle获取扩展样式 GetImageList 获取图像 GetItemRect获取控件大小 GetToolTips获取工具提示 SetExtendedStyle设置扩展样式 SetImageList设置图像 SetItemSize设置选项卡大小 SetMinTabWidth设置最小选项卡宽度 SetPadding设置选项卡之间间隔 SetToolTips设置工具提示 HighlightItem高亮显示 RemoveImage取出图像 |
停靠卡对象操作 | InsertItem插入元素 GetItem获得元素 GetItemCount获得元素书目 GetItemState获得元素状态 GetRowCount获得行数 SetItem设置元素 SetItemExtra SetItemState设置元素状态 DeleteAllItems删除所有元素 DeleteItem删除元素 DeselectAll重置所有元素 |
3、常用操作
1、做出放左侧的选项卡
效果如图所示
步骤:
1、添加一个对话框程序,在主界面中添加一个TabCtrl控件,并添加一个变量m_LC_TabCtrl
2、添加三个空对话框,ID分别为IDD_LC_DiALOG1,IDD_LC_DiALOG2,IDD_LC_DiALOG3,并关联三个对话框的类,类名分别为CLCDlg1,CLCDlg2,CLCDlg3
分别删除对话框中的确定和取消按钮并加上不同的静态文字
3、在主对话框的头文件中添加三个对话框变量,并加上头文件。
CLCDlg1 m_lc_dlg1;CLCDlg2 m_lc_dlg2;CLCDlg3 m_lc_dlg3;
#include "LCDlg1.h"
#include "LCDlg2.h"
#include "LCDlg3.h"
4、重写主对话框的OnInitDialog函数。
代码如下
CSize size;
size.cx=10;size.cy=10;
m_LC_TabCtrl.SetPadding(size);
m_LC_TabCtrl.InsertItem(0,_T("文件/文件夹"));
m_LC_TabCtrl.InsertItem(1,_T("快捷方式"));
m_LC_TabCtrl.InsertItem(2,_T("快捷安装"));
m_LC_TabCtrl.HighlightItem(0,TRUE);
m_LC_TabCtrl.HighlightItem(1,TRUE);
m_LC_TabCtrl.HighlightItem(2,TRUE);
CRect rect; rect.left=50;rect.right=500;rect.top=20;rect.bottom=50;
m_LC_TabCtrl.AdjustRect(TRUE,rect);
m_lc_dlg1.Create(IDD_LC_DIALOG1,GetDlgItem(IDD_LC_DIALOG1));
m_lc_dlg2.Create(IDD_LC_DIALOG2,GetDlgItem(IDD_LC_DIALOG2));
m_lc_dlg3.Create(IDD_LC_DIALOG3,GetDlgItem(IDD_LC_DIALOG3));
m_LC_TabCtrl.GetClientRect(&rect);
rect.top+=100;
//rect.bottom-=4;
rect.left+=100;
rect.right-=8;
m_lc_dlg1.MoveWindow(&rect);
m_lc_dlg2.MoveWindow(&rect);
m_lc_dlg3.MoveWindow(&rect);
m_lc_dlg1.ShowWindow(TRUE);
m_LC_TabCtrl.SetCurSel(1);
5、为TabCtrl控件添加OnSelect()消息
void CLocalSpeedyPPage::OnSelchangeLcTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
int curSel=m_LC_TabCtrl.GetCurSel();
switch(curSel)
{
case 0:
m_lc_dlg1.ShowWindow(TRUE);
m_lc_dlg2.ShowWindow(FALSE);
m_lc_dlg3.ShowWindow(FALSE);
break;
case 1:
m_lc_dlg1.ShowWindow(FALSE);
m_lc_dlg2.ShowWindow(TRUE);
m_lc_dlg3.ShowWindow(FALSE);
break;
case 2:
m_lc_dlg1.ShowWindow(FALSE);
m_lc_dlg2.ShowWindow(FALSE);
m_lc_dlg3.ShowWindow(TRUE);
break;
}
*pResult = 0;
}
至此 漂亮的界面就做出来了
回复“资料”,免费获取 一份独家呕心整理的技术资料!