zoukankan      html  css  js  c++  java
  • MFC中 使用Tab Control 控件在对话框中添加属性页

    对于使用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 <m_nNumOfPages; i++ )
        {
            m_pPages[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 <m_nNumOfPages; nCount++ )
           m_pPages[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消息来对切换了标签时进行一些动作。

  • 相关阅读:
    NFS 服务器实验
    ssh服务实验
    dhcp服务实验
    邮件服务器
    搭建 DNS 服务器
    搭建 web 服务器
    Feign下的数据传递
    基于Spring Cloud Feign的Mock工具
    Git 使用注意事项
    基于redisson的延迟队列
  • 原文地址:https://www.cnblogs.com/lxt287994374/p/3125281.html
Copyright © 2011-2022 走看看