zoukankan      html  css  js  c++  java
  • 基于对话框的编程之标签页的使用

    一、效果图

    二、具体步骤

    1、新建一个MFC应用程序,命名为07 CTabCtrl,应用程序类型选择基于对话框,资源语言选择简体中文,其他默认设置

    2、在工具箱中选择标签页控件(Tab Control),拖拽至对话框中

    3、对.rc文件右键打开文件所在文件夹

    放入TabSheet.cpp文件和TabSheet.h文件

    // TabSheet.cpp : implementation file
    //
    
    #include "stdafx.h"
    //#include "Property5.h"
    #include "TabSheet.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CTabSheet
    
    CTabSheet::CTabSheet()
    {
        m_nNumOfPages = 0;
        m_nCurrentPage = 0;
    }
    
    CTabSheet::~CTabSheet()
    {
    }
    
    
    BEGIN_MESSAGE_MAP(CTabSheet, CTabCtrl)
        //{{AFX_MSG_MAP(CTabSheet)
        ON_WM_LBUTTONDOWN()
        ON_WM_HSCROLL()
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CTabSheet message handlers
    
    BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)
    {
        if( MAXPAGE == m_nNumOfPages )
            return FALSE;
    
        m_nNumOfPages++;
    
        m_pPages[m_nNumOfPages-1] = pDialog;
        m_IDD[m_nNumOfPages-1] = ID;
        m_Title[m_nNumOfPages-1] = title;
    
        return TRUE;
    }
    
    void CTabSheet::SetRect()
    {
        CRect tabRect, itemRect;
        int nX, nY, nXc, nYc;
    
        GetClientRect(&tabRect);
        GetItemRect(0, &itemRect);
    
        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);
    
    }
    
    void CTabSheet::Show()
    {
        int i = 0;
        for( i=0; i < m_nNumOfPages; i++ )
        {
            m_pPages[i]->Create( m_IDD[i], this );
            if (AfxGetMainWnd())
                InsertItem( i, m_Title[i] );
            else
                return;
        }
    
        m_pPages[0]->ShowWindow(SW_SHOW);
        for( i=1; i < m_nNumOfPages; i++)
            m_pPages[i]->ShowWindow(SW_HIDE);
    
        SetRect();
    
    }
    
    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);
    //        m_pPages[m_nCurrentPage]->SetFocus();
    
            //AfxMessageBox("选中"); wbm test
        }
        
    }
    
    int CTabSheet::SetCurSel(int nItem)
    {
        if( nItem < 0 || nItem >= m_nNumOfPages)
            return -1;
    
        int ret = m_nCurrentPage;
    
        if(m_nCurrentPage != nItem )
        {
            m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);
            m_nCurrentPage = nItem;
            m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);
    //        m_pPages[m_nCurrentPage]->SetFocus();
            CTabCtrl::SetCurSel(nItem);
        }
    
        return ret;
    }
    
    int CTabSheet::GetCurSel()
    {
        return CTabCtrl::GetCurSel();
    }
    
    void CTabSheet::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
        // TODO: Add your message handler code here and/or call default
        
        CTabCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
    }
    // TabSheet.h
    #if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)
    #define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // TabSheet.h : header file
    //
    
    /////////////////////////////////////////////////////////////////////////////
    // CTabSheet window
    #define MAXPAGE 16
    
    class CTabSheet : public CTabCtrl
    {
        // Construction
    public:
        CTabSheet();
        
        // Attributes
    public:
        
        // Operations
    public:
        
        // Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CTabSheet)
        //}}AFX_VIRTUAL
        
        // Implementation
    public:
        int GetCurSel();
        int SetCurSel(int nItem);
        void Show();
        void SetRect();
        BOOL AddPage(LPCTSTR title, CDialog *pDialog, UINT ID);
        virtual ~CTabSheet();
        
        // Generated message map functions
    protected:
        LPCTSTR m_Title[MAXPAGE];
        UINT m_IDD[MAXPAGE];
        CDialog* m_pPages[MAXPAGE];
        int m_nNumOfPages;
        int m_nCurrentPage;
        //{{AFX_MSG(CTabSheet)
        afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
        afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
        //}}AFX_MSG
        
        DECLARE_MESSAGE_MAP()
    };
    
    /////////////////////////////////////////////////////////////////////////////
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    
    #endif // !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)

    4、在solution explorer中,对项目右键添加现有项,将TabSheet.cpp和TabSheet.h加入到项目中来

    在类视图,可以看到CTabSheet,说明添加成功

    5、新建一个对话框,作为第一个标签页,右键属性,修改Border为None,style为Child

    修改前:

    修改后:

    6、为新建对话框添加类,类名为CDlg1

    7、新建第二个对话框,重复上面的操作

    8、为标签控件添加变量,修改访问权限为private,变量类型为CtabSheet,名称为m_tab

    9、在CTabCtrlDlg.h文件中引用Dlg1.h和Dlg2.h,同时在私有成员中做声明

    10、在CTabCtrlDlg.cpp中引用Dlg1.h和Dlg2.h

    11、在OnInitDialog方法中,编辑标签页的显示代码

        //标签页的使用
        //添加标签页
        m_tab.AddPage(TEXT("系统设置"), &dlg1, IDD_DIALOG1);
        m_tab.AddPage(TEXT("系统管理"), &dlg2, IDD_DIALOG2);
        //显示
        m_tab.Show();

    运行程序,就能看到效果图的显示效果

  • 相关阅读:
    C 找到该列最大的前两个数字
    C 寻找和最大的子序列
    C 找出最长的回文子串(不区分大小写)
    C 字符串数组
    C 寻找重复字符并输出他们的位置
    C 寻找0~100的守形数
    C 在外部函数中修改指针变量
    C int转为二进制 再进行与操作
    C 计算阶乘之和
    C 奇偶校验
  • 原文地址:https://www.cnblogs.com/yanchaoyi/p/12678620.html
Copyright © 2011-2022 走看看