博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC中 使用Tab Control 控件在对话框中添加属性页
阅读量:4490 次
发布时间:2019-06-08

本文共 2887 字,大约阅读时间需要 9 分钟。

 

对于使用Tab Control 给对话框加属性页的方法有很多,下面记录下感觉比较方便点的方法。(也是来自网上的资料,只是稍加整理)

 

首先需要自己建一个类,如:CTabSheet。这个类是从CTabCtrl继承来的,是用于Tab Control的控件类。

添加成员变量:

    CDialog* m_pPages[MAXPAGE]; //记录各子对话框的指针

    int m_nNumOfPages;

    int m_nCurrentPage;
    UINT m_IDD[MAXPAGE];
    LPCTSTR m_Title[MAXPAGE];

记得这个:#define MAXPAGE 20  //该类所能加载的标签的最大值

然后在构造函数里初始化:

    m_nNumOfPages = 0;

    m_nCurrentPage = 0;

接下来给此类添加方法:

1.AddPage方法,用于记录子对话框的指针和所使用对话框资源的ID号。

BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID){    if( MAXPAGE == m_nNumOfPages )        return FALSE;    //保存目前总的子对话框数    m_nNumOfPages++;    //记录子对话框的指针、资源ID、要在标签上显示的文字    m_pPages[m_nNumOfPages-1] = pDialog;    m_IDD[m_nNumOfPages-1] = ID;    m_Title[m_nNumOfPages-1] = title;    return TRUE;}

 

2.在使用AddPage加入了若干子对话框后,必须调用CTabSheet的Show方法来真正生成标签和子对话框。

void CTabSheet::Show(void){    int i;    //利用CDialog::Create来创建子对话框,并且使用CTabCtrl::InsertItem来加上相应的标签    for( i=0; i 
Create(m_IDD[i],this ); InsertItem( i, m_Title[i] ); } //由于对话框显示时默认的是第一个标签被选中,所以应该让第一个子对话框显示,其他子对话框隐藏 m_pPages[0]->ShowWindow(SW_SHOW); for( i=1; i < m_nNumOfPages;i++) m_pPages[i]->ShowWindow(SW_HIDE); SetRect();}

3.生成好标签和子对话框后,调用CTabSheet::SetRect来计算并调整属性页的大小。

void CTabSheet::SetRect(void){    CRect tabRect;   // 标签控件客户区的位置和大小    GetClientRect(&tabRect);    // 获取标签控件客户区Rect     // 调整tabRect,使其覆盖范围适合放置标签页          tabRect.left += 25;                         tabRect.right -= 1;          tabRect.top += 1;          tabRect.bottom -= 1;       // 根据调整好的tabRect放置子对话框,并设置为显示          m_pPages[0]->SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);          // 根据调整好的tabRect放置其他子对话框,并设置为隐藏       for( int nCount=1; nCount 
SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);}

 

4.在单击标签栏后,应该是相应的子对话框显示,正在显示的子对话框应该隐藏。因此利用类向导ClassWizard来处理WM_LBUTTONDOWN消息。

void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point) {    CTabCtrl::OnLButtonDown(nFlags, point);    //判断是否单击了其他标签    if(m_nCurrentPage != GetCurFocus())    {        //将原先的子对话框隐藏        m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);        m_nCurrentPage=GetCurFocus();        //显示当前标签所对应的子对话框        m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);    }}

 

OK ,此类添加成功,下面就开始使用Tab Control控件给对话框添加属性页了。

步骤如下:

1.添加基于MFC的子对话框类,继承于CDialog。

2.设置各个子对话框资源的属性:Style为Child, Border为None。

3.在主对话框资源中,加入一个Tab Control,并且适当调整位置和大小。利用类向导ClassWizard来为这个Tab Control创建一个CTabSheet的控件变量,如:m_sheet。

4.在主对话框的.h文件中实例化子对话框的对象,如:m_page1,m_page2。

5.在OnInitDialog()中加入:

m_sheet.AddPage(L"tab1", &m_page1, IDD_DIALOG1);m_sheet.AddPage(L"tab2", &m_page2, IDD_DIALOG2);m_sheet.Show();

O了~~~

这样利用CTabSheet这个类就可以轻松地在对话框上放置自己的属性页了,并且控件都分散在各子对话框类中,符合对象封装的思想。而且用这个方法来制作属性页就可以利用ClassWizard来轻松地生成消息映射处理Tab Control的消息了。例如:可以处理TCN_SELCHANGE消息来对切换了标签时进行一些动作。

 

转载于:https://www.cnblogs.com/lxt287994374/archive/2013/06/07/3125281.html

你可能感兴趣的文章
mysql 分组之后统计记录条数
查看>>
New STL Algorithms That Will Make A More Productive Developer
查看>>
js 对象 浅拷贝 和 深拷贝
查看>>
初识 python
查看>>
PCL Examples
查看>>
spring boot
查看>>
浏览器URL传参最大长度问题
查看>>
学习进度条
查看>>
Linux crontab 定时任务详解
查看>>
string成员函数
查看>>
onSaveInstanceState()方法问题
查看>>
[转]CocoaChina上一位工程师整理的开发经验(非常nice)
查看>>
大数据时代侦查机制有哪些改变
查看>>
L1-047 装睡
查看>>
雷林鹏分享:jQuery EasyUI 菜单与按钮 - 创建链接按钮
查看>>
Apache Traffic Server服务搭建
查看>>
poj1990两个树状数组
查看>>
学习python-day1
查看>>
Zend_Db_Table->insert ()和zend_db_adapter::insert方法返回值不同
查看>>
递归问题
查看>>