【MFC】CTabSheet类之再改造

CTabSheet是从CTabCtrl继承来的,用于Tab Control的控件类。对于已有的功能和特点,我这里就不加赘述,以下主要阐述新的功能。

AddPage()函数增加了一个参数bEnable,用于控制页面是否显示。

增加了SetPage()函数。

.h文件

#pragma once

#define MAXPAGE 16

typedef struct TAB_SHEET_PAGE
{
	LPCTSTR				Title;
	UINT				nIDD;
	CDialog				*p;				
	bool				bEnable;
} TABSHEETPAGE;

class CTabSheet : public CTabCtrl
{
public:
	CTabSheet();
	virtual ~CTabSheet();

	DECLARE_MESSAGE_MAP()

protected:
	afx_msg void		OnLButtonDown(UINT nFlags, CPoint point);

public:
	int					SetCurSel(int nItem);
	BOOL				Show(int nItem);
	void				SetRect();
	void				Lock();
	void				UnLock();
	BOOL				AddPage(LPCTSTR title, CDialog *pDialog, UINT ID, bool bEnable);
	void				CreatePage();

	void				Hide();
	BOOL				SetPage(LPCTSTR title, bool bEnable);
	BOOL				SetPage(int nItem, bool bEnable);

protected:
	BOOL				m_bLock;

	TAB_SHEET_PAGE		m_tsPage[MAXPAGE];
	
	int					m_nPageNum;
	int					m_nCurrentPage;
};

.cpp文件

//#include "..\stdafx.h"
#include "stdafx.h"
#include "TabSheet.h"

CTabSheet::CTabSheet()
{
	m_nPageNum = 0;
	m_nCurrentPage = 0;
	m_bLock = false;
}

CTabSheet::~CTabSheet()
{
}


BEGIN_MESSAGE_MAP(CTabSheet, CTabCtrl)
	ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:增加页面
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog, UINT ID, bool bEnable)
{
	if (MAXPAGE == m_nPageNum)
		return FALSE;

	m_nPageNum ++;

	m_tsPage[m_nPageNum-1].p = pDialog;
	m_tsPage[m_nPageNum-1].nIDD = ID;
	m_tsPage[m_nPageNum-1].Title = title;
	m_tsPage[m_nPageNum-1].bEnable = bEnable;

	return TRUE;
}

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:设置页面
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CTabSheet::SetRect()
{
	CRect				tabRect, itemRect;
	int					nX, nY, nXc, nYc;
	int					i;

	GetClientRect(&tabRect);
	GetItemRect(0, &itemRect);

	nX = itemRect.left;
	nY = itemRect.bottom + 1;
	nXc = tabRect.right - itemRect.left - 3;
	nYc = tabRect.bottom - nY - 2;

	for (i = 0; i < m_nPageNum; i ++)
	{	
		if (i == m_nCurrentPage)
		{
			m_tsPage[i].p->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);
		}
		else
		{
			m_tsPage[i].p->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);
		}
	}
}

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:创建分页对话框
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CTabSheet::CreatePage()
{
	int					i;

	for (i = 0; i < m_nPageNum; i ++)
	{
		m_tsPage[i].p->Create(m_tsPage[i].nIDD, this);
		//InsertItem(i, m_tsPage[i].Title);
		//CTabCtrl::InsertItem(TCIF_TEXT, i, m_Title[i], 0, 0);
	}
}
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:显示
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
BOOL CTabSheet::Show(int nItem)
{
	int					i;

	if (nItem < 0 || nItem >= m_nPageNum)
		return FALSE;

	if (!m_tsPage[nItem].bEnable)
		return FALSE;

	for (i = 0; i < m_nPageNum; i ++)
	{
		//m_tsPage[i].p->Create(m_tsPage[i].nIDD, this);
		InsertItem(i, m_tsPage[i].Title);
		//CTabCtrl::InsertItem(TCIF_TEXT, i, m_Title[i], 0, 0);
	}

	for (i = 0; i < m_nPageNum; i ++)
	{	
		if (i == m_nCurrentPage)
		{
			m_tsPage[i].p->ShowWindow(SW_SHOW);
		}
		else
		{
			m_tsPage[i].p->ShowWindow(SW_HIDE);
		}
	}

	SetRect();
	SetCurSel(nItem);

	return TRUE;
}

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:隐藏
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CTabSheet::Hide()
{
	int					i;
	
	for (i = 0; i < m_nPageNum; i ++)
	{
		m_tsPage[i].p->ShowWindow(SW_HIDE);
	}
	
	DeleteAllItems();
}

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:点击鼠标左键
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point) 
{
	int					nItem;
	int					i;
	CRect				rc;

	if (m_bLock)
		return;

	for (i = 0; i < GetItemCount(); i++)
	{
		GetItemRect(i, rc);
		if (rc.PtInRect(point))
		{
			nItem = i;
		}
	}

	if (!m_tsPage[nItem].bEnable)
	{
		return;
	}
	
	CTabCtrl::OnLButtonDown(nFlags, point);

	
	if (m_nCurrentPage != nItem)
	{
		m_tsPage[m_nCurrentPage].p->ShowWindow(SW_HIDE);
		m_nCurrentPage = nItem;		
		m_tsPage[m_nCurrentPage].p->ShowWindow(SW_SHOW);
		//m_pPages[m_nCurrentPage]->SetFocus();
	}
}

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:设置当前页面选择
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
int CTabSheet::SetCurSel(int nItem)
{
	if (nItem < 0 || nItem >= m_nPageNum)
		return -1;

	if (!m_tsPage[nItem].bEnable)
	{
		return -1;
	}

	CTabCtrl::SetCurSel(nItem);

	if (!m_bLock)
	{
		if (m_nCurrentPage != nItem )
		{
			m_tsPage[m_nCurrentPage].p->ShowWindow(SW_HIDE);
			m_nCurrentPage = nItem;
			m_tsPage[m_nCurrentPage].p->ShowWindow(SW_SHOW);
			
			//m_pPages[m_nCurrentPage]->SetFocus();
		}
	}

	return nItem;
}

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:锁定
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CTabSheet::Lock()
{
	m_bLock = true;
}

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:解锁
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CTabSheet::UnLock()
{
	m_bLock = false;
}

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:设置页面属性
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
BOOL CTabSheet::SetPage(LPCTSTR title, bool bEnable)
{
	BOOL				bRet;
	int					i;

	bRet = FALSE;

	for (i = 0; i < m_nPageNum; i ++)
	{
		if (m_tsPage[i].Title == title)
		{
			m_tsPage[i].bEnable = bEnable;
			bRet = TRUE;
		}
	}
	
	return bRet;
}

BOOL CTabSheet::SetPage(int nItem, bool bEnable)
{
	if (nItem < 0 || nItem >= m_nPageNum)
		return FALSE;
	
	m_tsPage[nItem].bEnable = bEnable;

	return TRUE;
}

调用方法:

m_tbShow.AddPage(_T(" 日志 "), &m_ShowLog, IDD_SHOW_LOG, true);
m_tbShow.CreatePage();
m_tbShow.Show(0); 

下载地址:https://download.csdn.net/download/sunriver2000/10320443

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CScrollWnd 这是一个从MFC的源码中扒出来的一个滚动窗口,功能基本似于CScrollView, 但是它的基是CWnd,这样为一些不需要使用Document View结构但又想使用滚动窗口的小程序提供了比较方便的方法,他的接口除了两个坐标转换函数以外与CScrollView基本相同,同时在画的地方采用了内存DC缓冲,避免了闪烁,这下你可以随意的刷新了(当然刷新太多了对效率还是有一些影响的) 因为是工作需要,所以设计了这个,目前只测试了基本的功能,映射模式为MM_TEXT在屏幕上显示正常,至于打印的支持还没有做。 因为跟CScrollView功能基本相同,所以没有写什么注释,大家可以查MSDN中CScrollView的帮助,如果发现跟CScrollView不一致的地方给我mail吧。 使用方法,跟CScrollView一样,在你的中继承,实现OnInitialUpdate和OnDraw就成了。 CTabSheet 一个TabCtrl,可以方便的把各种窗口加入到其中,做成属性的形式,功能很简单,但是很 实用。 CStaticSplitter 静态切分窗口,这个是从WTL的SplitterWnd里面扒出来的,因为MF C的SplitterWnd实在是太太太难用了,而且很难看,看到WTL里面的这个不错,想拿来用,不过如果是MFC程序的话再加上WTL的风格有些不协调,就干脆把它的形式改成MFC的风格了,函数看着挺多,不过常用并不多,至于注释嘛,我只是在经常用的函数声明上大概写了几句,相知道具体实现,那就去看代码吧:)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值