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

摘要:
首先,让我介绍一下如何使用CTabSheet。在主对话框资源中,添加TabControl,并适当调整位置和大小。现在我将讨论CTabSheet类的细节。CTabSheet是从CTabCtrl继承的控件类,用于TabControl。无效CTabSheet::Show(){//使用CDialog::Create创建子对话框,并使用CTabCtrl::InsertItem为{m_pPages[i]-˃Create;InsertItems;}//添加相应的标签由于显示对话框时默认选择了第一个标签,因此应显示第一个子对话框,其他子对话框应为hidden_pPages[0]-˃ShowWindow;form_ pPages[i]-˃显示窗口;SetRect();}生成标签和子对话框后,调用CTabSheet::SetRect计算并调整属性页的大小。因此,ClassWizard用于处理WM_LBUTTONDOWN消息。VoidCTabSheet::OnLButtonDown{CTabCtrl::OnLButtonDown;//如果(m_nCurrentPage!
使用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控件类继承自己

免责声明:文章转载自《MFC中使用Tab Control从CTabCtrl控件类继承自己的类(CTabSheet)来处理。》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇服务器ipmi远程管理IPython notebook(Jupyter notebook) 设置密码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VC++ MFC CheckBox

MFC中复选框CheckBox的基类是CButton! 得到复选框状态的函数:CButton* pBtn = (CButton*)GetDlgItem(IDC_CHECK_MIXI); int state = pBtn->GetCheck(); 当state == 0时表示该复选框没有被选中; 当state == 1时表示该复选框被选中; 当stat...

C++ MFC学习 (六)

   由于微软在VS2013 及之后不建议再使用 C/C++ 的传统库函数   scanf,strcpy,sprintf 等,所以直接使用这些库函数会提示 C4996 错误   VS建议采用带 _S的函数,如: scanf_s, strcpy_s , 但这些不是标准 C/C++ 函数。要想继续使用此函数,需要添加  _CRT_SECURE_NO_WARNI...

MFC 消息类型

---恢复内容开始--- 1、命令消息(WM_COMMAND) 所有派生自 CCmdTarget 的类都有资格接受WM_COMMAND。 2、Window消息(WM_xxx) 所有派生自 CWnd 的类都有资格接受 WM_xxx。 3、控件消息(WM_NOTIFY) 控件向其父窗口通知消息。 消息处理 1、WM_xxx 消息处理 窗口类(自身)处理→基类处...

MFC录制音频和播放音频

一、录制音频   在windows中提供了相应的API函数(waveIn这个族的函数)实现录音功能;在使用这些函数时,一定要引入相应的头文件 #include <windows.h> #include <Mmsystem.h> #pragram comment(lib, "Winmm.lib") 1、在开始录音之前,需要首先定义音频...

MFC获取文本框字符串

//方法1:使用用GetDlgItem,得到控件对像, 再GetWindowText //GetDlgItem(IDC_EDIT1)->GetWindowText() //方法2:控件与对应类关联如:Edit Control拖放到面板上, 然后在上面右击添加变量, 选择控件变量 CEdit, //以后可以使用这个CEDit的...

MFC_简易文件管理器

练习_简易文件管理器 Edit1编辑框绑定变量,初始化内容 m_EditCtrl = L"D:";   添加List控件,属性设置report,OnInitDialog()函数里添加信息 // 初始化函数 BOOL CFileManagerDlg::OnInitDialog() { CDialog::OnInitDialog(); ​ /...