1、标签控制的建立方法
CTabCtrl&tabCtrl 建立标签控制对象结构
Create 建立标签控制并绑定对象
标签控制CTabCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定标签控制的风格;rect用来控制标签的大小和位置;pParentWnd用来确定标签控制的父窗口句柄;nID用来确定标签控制的标识符。
标签控制的风格可以是如下值的组合:
TCS_BUTTONS 表示将标签外观定义成类似按钮
TCS_FIXEDWIDTH 使所有标签具有相同的宽度
TCS_FOCUSNEVER 使特定标签永远不接收输入焦点
TCS_FOCUSONBUTTONDOWN 当标签被鼠标点击时接收输入焦点,其仅与TCS_BUTTONS合用
TCS_FORCEICONLEFT 强制图标在左面,剩余部分使标签居中
TCS_FORCELABELLEFT 使图标和标签均左对齐
TCS_MULTILINE 允许标签控制显示多行标签
TCS_OWNERDRAWFIXED 允许父窗口自绘标签
TCS_RIGHTJUSTIFY 使标签右对齐
TCS_SHAREIMAGELISTS 当控制被撤消时标签控制的图像不被撤消
TCS_TOOLTIPS 允许标签控制存在工具提示控制
TCS_TABS 标签正常显示,为默认状态
TCS_SINGLELINE 将标签只显示在一行上,默认状态
TCS_RAGGEDRIGHT 不使标签自动填满控制区域,默认状态
同样,标签控制还可以使用窗口的一些控制风格:
WS_CHILD 为标签控制创建子窗口,只能与WS_POPUP风格一起使用
WS_VISIBLE 建立一个初始可视的标签控制
WS_DISABLED 建立一个初始不可视的标签控制
WS_GROUP 建立标签控制群组的第一个控制
WS_TABSTOP 建立可用TAB键移动的标签控制
2、标签控制的属性类
标签控制的属性类包括取得与标签控制相关联的图像列表GetImageList、设置标签控制的图像列表SetImageList、取得标签控制中标签的总数GetItemCount、取得标签控制中特定标答的相关信息GetItem、设置标签的部分或全部属性SetItem、检测当前被选中的标签GetCurSel、将一个标签设置为选中状态SetCurSel和取得具有当前输入焦点的标签SetCurSel等。
3、标签控制的操作方法
标签控制的操作方法包括在标签控制中插入一个标签InsertItem、删除一个标签 DeleteItem、从标签控制中删除所有项目DeleteAllItems、从标签控制中删除一个图像列表RemoveImage和绘制标签控制中的特定一项DrawItem等。
(三)标签控制的数据结构
在使用标签控制时,必须使用的函数就是在标签控制中插入标签。函数InsertItem的原形如下:
BOOL InsertItem(int nItem,TC_ITEM * pTabCtrlItem);
该函数中的TC_ITEM为添加标签时所使用信息的数据结构,其数据成员的定义方法及含义如下:
typedef struct _TC_ITEM {
UINT mask; // 确定结构成员的屏蔽或设置位
UINT lpReserved1; // 保留未用
UINT lpReserved2; // 保留未用
LPSTR pszText; // 标签名称字符串
int cchTextMax; // 标签名称字符串缓冲区大小
int iImage; // 标签控制的图像索引号
LPARAM lParam; // 应用程序定义的相关32位数据
} TC_ITEM;
当鼠标点击标签控制中的标签时,标签控制就会向其父窗口发送相关的通知消息,通过处理这些通知消息,程序可以实现各种功能。
(四)属性表和属性页的基本用法
在标签控制过程中,属性表对话框和属性页是必不可少的。在MFC类库中,属性表对话框类CpropertySheet是由CWnd类派生而来的,而属性页类CpropertyPage是由Cdialog类派生而来的,它们的用法基本相同:
1、创建所有的属性页。创建属性页的方法与创建一般对话框资源的方法一样,利用对话框编辑器可以为每个属性页创建一个对话框模板,其区别在于,当利用类向导ClassWizard为属性页生成类时应选择属性页类CpropertyPage作为基类,而不是将一般的对话框类Cdialog作为基类;
2、创建属性表对话框,并将事先创建好的各属性页添加进去,两者的创建顺序可以互换,但在创建完之后将属性页添加到属性表对话框中去这一步是必须要做的;
3、显示属性表对话框。虽然属性表对话框类CpropertySheet不是由对话框类Cdialog派生而来的,但两者的操作非常类似,调用DoModal()函数就会显示一个模态属性表对话框,而调用Create()操作就会显示一个非模态的属性表对话框;
4、对数据交换的处理。和对话框类似,属性表对话框与对象之间的数据交换也是通过数据成员2来实现的,只是属性表本身不带数据成员,而实际进行数据交换的是属性页中的数据成员;
5、对向导对话框的处理。如果要显示一个向导对话框,在显示之前应首先调用SetWizardMode()函数对向导对话框进行特殊处理,对于存在按钮的向导对话框,还应调用SetWizardButtons()来对向导对话框的按钮功能进行定制,在用户操作结束时还应调用SetFinishText()函数将“完成”按钮设置为有效状态。
Top
1、首先创建一个MFC对话框框架,在对话框资源上从工具箱中添加上一个Tab Control 控件,根据需要修改一下属性,然后右击控件,为这个控件添加一个变量,将此控件跟一个CTabCtrl类变量绑定在一起,这里设为m_tabctrl
2、创建两个新的对话框资源,其属性作如下修改:
Border:none //边界为空,这样它就没了标题栏
Style :Child // 这样这个模板就可以当作另一个窗口的子窗口了。
其它如果没有必要,就不用改了。
在上面加一些控件什么的,具体操作跟普通对话框没有区别。
完成后从这两个对话框模板生成两个新的对话框类。
3、在主对话框中为新添加进来的两个类增加两个变量:
如:CDialog1 m_mm1;
CDialog2 m_mm2;
4、在主对话框的OnInitDialog()函数中添加如下类似的代码:
TCITEM item;
item.mask = TCIF_TEXT;
item.pszText = "第一页";
m_tabctrl.InsertItem (0,&item);
item.pszText ="第二页";
m_tabctrl.InsertItem (1,&item);
m_mm1.Create (IDD_DIALOG1,&m_tabctrl);
m_mm2.Create (IDD_DIALOG2,&m_tabctrl);
m_mm1.SetWindowPos (NULL,10,30,400,100,SWP_SHOWWINDOW);
m_mm2.SetWindowPos (NULL,10,30,400,100,SWP_HIDEWINDOW );
解释如下:
两个InsertItem函数的调用是为了给标签控件增加两个标签页面,文本是标题。
SetWindowPos()函数设置这两个对话框在Z顺序中的位置,显示或隐藏状态.。
5、在主对话中为标签控件添加一个标签选择改变(TCN_SELCHANGE)的控件通知消息,以便在用户选择标签时通知主对话框。在主对话框的编辑界面右击标签控件,选择添加一个事件可以完成这个操作。
在事件处理中添加如下代码,如下例:
void CtabdialogDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
CRect r;
m_tabctrl.GetClientRect (&r);
switch(m_tabctrl.GetCurSel())
{
case 0:
m_mm1.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_SHOWWINDOW);
m_mm2.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_HIDEWINDOW );
break;
case 1:
m_mm1.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_HIDEWINDOW);
m_mm2.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_SHOWWINDOW );
break;
}
*pResult = 0;
}
要想知道用户选择那个标签页,要通过m_tabctrl.GetCurSel() 函数。为了不使显示的子对话框覆盖标签控件的显示,所以要获得标签控件的尺寸然后设置各页面的尺寸。
是否被别的窗口覆盖了,需要调整一下位置。Top
两个问题,第一WC_TABCONTROL本省就是Class是名字
创建风格没有WS_VISIBLE
int cxChar = 10;
int cyChar = 5;
int ID_TABCONTROL = 10000;
HWND hwndList = CreateWindow (WC_TABCONTROL, NULL,
WS_CHILD | WS_VISIBLE | TCS_OWNERDRAWFIXED|TCS_MULTILINE,
cxChar*3, cyChar * 1,
cxChar * 47 + GetSystemMetrics (SM_CXVSCROLL),
cyChar * 23,
m_hWnd, (HMENU) ID_TABCONTROL,
0,//((LPCREATESTRUCT)lParam)->hInstance,
NULL) ;