tab封装MFC

#pragma once
#include <vector>
using  std::vector;

// CMyTabCtrl

class CMyTabCtrl : public CTabCtrl
{
    DECLARE_DYNAMIC(CMyTabCtrl)

public:
    CMyTabCtrl();
    virtual ~CMyTabCtrl();
    //     m_ctrlTab.InsertDlg(5,
    //         L"呵呵1", ID_DLGA, &DlgA,
    //         L"呵呵2", ID_DLGB, &DlgB,
    //         L"呵呵3", ID_DLGC, &DlgC,
    //         L"呵呵4", ID_DLGD, &DlgD,
    //         L"呵呵5", ID_DLGE, &DlgE, );

    void  InsertDlg(DWORD  dwCount, ...)
    {
        va_list  vl;
        va_start(vl, dwCount);
        TCHAR* szName = NULL;
        DWORD dwId = 0;
        CDialogEx* pDlg = NULL;
        CRect  rt = {};
        GetClientRect(rt);
        rt.DeflateRect(1, 23, 1, 1);
        for (DWORD i = 0; i < dwCount;i++)
        {
            // 获取选项的名字
            szName = va_arg(vl, TCHAR*);
            //获取对话框的ID
            dwId = va_arg(vl, DWORD);
            //获取子对话框的对象指针
            pDlg = va_arg(vl, CDialogEx*);
            //添加一项
            InsertItem(i, szName);
            //创建子窗口
            pDlg->Create(dwId, this);
            pDlg->MoveWindow(rt, TRUE);
            m_vecDlg.push_back(pDlg);
        }
        m_vecDlg[0]->ShowWindow(SW_SHOW);
        va_end(vl);
    }



    vector<CDialogEx*> m_vecDlg;

protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);
};
// MyTabCtrl.cpp : 实现文件
//

#include "stdafx.h"
#include "01 Tab控件的封装.h"
#include "MyTabCtrl.h"


// CMyTabCtrl

IMPLEMENT_DYNAMIC(CMyTabCtrl, CTabCtrl)

CMyTabCtrl::CMyTabCtrl()
{

}

CMyTabCtrl::~CMyTabCtrl()
{
}


BEGIN_MESSAGE_MAP(CMyTabCtrl, CTabCtrl)
    ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CMyTabCtrl::OnTcnSelchange)
END_MESSAGE_MAP()



// CMyTabCtrl 消息处理程序



//注意:反射消息,用以处理当选项改变时,窗口的显式隐藏问题
void CMyTabCtrl::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO:  在此添加控件通知处理程序代码
    int nSel = GetCurSel();
    for (int i = 0; i < m_vecDlg.size();i++)
    {
        //找到被选择的项,将其显示出来
        if (i == nSel)
        {
            m_vecDlg[i]->ShowWindow(SW_SHOW);
        }
        //非选择项,将其隐藏
        else
        m_vecDlg[i]->ShowWindow(SW_HIDE);
    }
    *pResult = 0;
}
    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO:  在此添加额外的初始化代码
         m_ctrlTab.InsertDlg(4,
             L"呵呵1", IDD_DLGA, new CDlgA,
            L"呵呵2", IDD_DLGB, new CDlgB,
            L"呵呵3", IDD_DLGC, new CDlgC,
            L"呵呵4", IDD_DLGD,new CDlgD);

 

posted @ 2016-03-16 16:16  天还是那么蓝  阅读(289)  评论(0编辑  收藏  举报