• MFC中使用Tab Control从CTabCtrl控件类继承自己的类(CTabSheet)来处理。


    使用Tab Control,并且从CTabCtrl控件类继承自己的类(CTabSheet)来处理。
      首先我先介绍一下如何使用CTabSheet。
      先要制作子对话框类,这次的子对话框类不要从CPropertyPage继承,而是直接从CDialog继承。并且各个子对话框资源的属性应设置为:Style为Child, Border为None。
      在主对话框资源中,加入一个Tab Control,并且适当调整位置和大小。利用ClassWizard来为这个Tab Control创建一个CTabSheet的控件变量。

    步骤/方法

    1.   在主对话框的OnInitDialog()加入:
        m_sheet.AddPage("tab1", &m_page1, IDD_DIALOG1);
        m_sheet.AddPage("tab2", &m_page2, IDD_DIALOG2);
        m_sheet.Show();
        就这样就可以在对话框上制作出一个完美的属性页了。效果和上图完全一样。
        下面我就来讲讲CTabSheet类的细节内容。
        CTabSheet是从CTabCtrl继承来的,用于Tab Control的控件类。在类中有一个成员变量用来记录各子对话框的指针CDialog* m_pPages[MAXPAGE]; MAXPAGE是该类所能加载的标签的最大值。
        类中有一个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;
        }
      MFC中使用Tab Control从CTabCtrl控件类继承自己
    2.   在使用AddPage加入了若干子对话框后,必须调用CTabSheet的Show方法来真正生成标签和子对话框。
        void CTabSheet::Show()
        {
        //利用CDialog::Create来创建子对话框,并且使用CTabCtrl::InsertItem来加上相应的标签
        for( int 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();
        }
      MFC中使用Tab Control从CTabCtrl控件类继承自己
    3.   生成好标签和子对话框后,调用CTabSheet::SetRect来计算并调整属性页的大小。
        void CTabSheet::SetRect()
        {
        CRect tabRect, itemRect;
        int nX, nY, nXc, nYc;
        //得到Tab Control的大小
        GetClientRect(&tabRect);
        GetItemRect(0, &itemRect);
        //计算出各子对话框的相对于Tab Control的位置和大小
        nX=itemRect.left;
        nY=itemRect.bottom+1;
        nXc=tabRect.right-itemRect.left-2;
        nYc=tabRect.bottom-nY-2;
        //利用计算出的数据对各子对话框进行调整
        m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);
        for( int nCount=1; nCount < m_nNumOfPages; nCount++ )
        m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);
        }
        在单击标签栏后,应该是相应的子对话框显示,正在显示的子对话框应该隐藏。因此利用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);
        }
        }
        这样利用CTabSheet这个类就可以轻松地在对话框上放置自己的属性页了,并且控件都分散在各子对话框类中,符合对象封装的思想。而且用这个方法来制作属性页就可以利用ClassWizard来轻松地生成消息映射处理Tab Control的消息了。例如:可以处理TCN_SELCHANGE消息来对切换了标签时进行一些动作。
      MFC中使用Tab Control从CTabCtrl控件类继承自己
  • 相关阅读:
    【链接】idea没有svn
    移动端适配解决方案
    项目中多个文件引入同一份公共样式less文件导致编译打包后有多份样式
    2020最新编辑器集成eslint、prettier、stylelint,git提交预检查代码配置
    eslint+prettier学习
    artTempate模版继承父模版之后再引入子模版不生效?
    iOS底层原理开篇
    iOS应用千万级架构:安全与加密
    使用RabbitMQ实现延迟任务
    JAVA三元运算符空指针引用的坑
  • 原文地址:https://www.cnblogs.com/lidabo/p/2810599.html
Copyright © 2020-2023  润新知