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

简介: 使用Tab Control,并且从CTabCtrl控件类继承自己的类(CTabSheet)来处理。  首先我先介绍一下如何使用CTabSheet。  先要制作子对话框类,这次的子对话框类不要从CPropertyPage继承,而是直接从CDialog继承。
使用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控件类继承自己
目录
相关文章
|
24天前
|
设计模式 开发框架 算法
【QML 创建界面】QML界面的动态创建及其其他方法 (Dynamic Creation of QML Interfaces and Other Methods)
【QML 创建界面】QML界面的动态创建及其其他方法 (Dynamic Creation of QML Interfaces and Other Methods)
54 0
|
9月前
|
C# C++
vb窗体实例化与set语句的用法
vb窗体实例化与set语句的用法
|
9月前
control基类使用
control基类使用
29 0
Winform控件优化之继承Control重写实现Layer遮罩层
通过继承Control控件类,进行重写,实现Layer效果的遮罩层,具体使用可直接看后面的介绍。主要功能如下:1. 遮罩层的透明度Alpha,默认125。255表示不透明。2. 设置遮罩层中心的图片
467 0
Winform控件优化之继承Control重写实现Layer遮罩层
MFC CFileFind类用法总结
MFC CFileFind类用法总结
329 0
|
Windows C++ API
MFC 定制控件(Customize Control) 及 MFC CWnd和WIN32 HWND关联方法
MFC 定制控件(Customize Control) 及 MFC CWnd和WIN32 HWND关联方法  文档将概述MFC中定制自定义控件的3种方法: 拥有者绘制控件(Owner Drawing Control and Menu)   自绘制控件(self drawing contro...
1459 0
|
C#
WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性
原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? 我向大家介绍一个用 依赖属性(DependencyProperty) 实现的方法。
2437 0
|
C#
WPF整理-为User Control添加依赖属性
原文:WPF整理-为User Control添加依赖属性 依赖属性 ".NET properties are nothing more than syntactic sugar over set and get methods." 我们知道.NET的属性只不过是get/set方法的语法糖衣。
827 0
|
Web App开发 .NET C#
Class vs. Component vs. Control 类、组件和控件
本主题对组件和控件进行了定义;此处进行的讨论可以帮助您决定何时实现一个是组件或控件的类。  说明 本主题介绍 Windows 窗体和 ASP.NET 类。 此处进行的讨论不适用于 WPF 类。
1126 0