MFC tabcontrol切换界面

1.添加控件tabcontrol。

2.切换到资源界面->Dialog->插入Dialog,创建两个Dialog界面。

3.为新建的两个Dialog添加类,在新建的Dialog界面右键类向导添加对应的类。

4.添加TabSheet.cpp 和TabSheet.h 这两个文件从网上下载即可,具体源码如下:

TabSheet.cpp:

// TabSheet.cpp : implementation file  
#include "stdafx.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()  
	//}}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()  
{  
	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( int 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();  
	}  
}  
 
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();  
} 
 
//释放page资源
void CTabSheet::Free()
{
 
	CTabCtrl::DeleteAllItems();
	for( int i=0; i < m_nNumOfPages; i++ )  
	{  
		m_pPages[i]->DestroyWindow();
		m_IDD[i] = NULL;
		m_Title[i] = NULL;
	}  
	m_nCurrentPage = 0;
	m_nNumOfPages = 0;
	//CTabCtrl::DestroyWindow();  //注意不要将this指针释放了
}

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 Free();
 
	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  
 
	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_)  

5.将TabSheet.cpp和TabSheet.h添加到工程中。

6.为tabcontrol添加变量,这里一定要以CTabSheet类型,不是选择类型,是直接写CTabSheet。

7.使用m_tab变量来关联Dialog1和Dialog2,关联之前需要在主文件对应的头文件中(我用FBG来创建的项目,这里就是FBGDlog.h)引入Dialog1和Dialog2头文件,然后用CDialog1和CDialog2类来定义变量。

8.在主文件中(我用FBG来创建的项目,这里就是FBGDlog.C)添加初始化代码如下:

AddPage函数就是用来添加页的,对一个的三个参数:第一个是标题,第二个是选择的Dialog,第三个是Dialog的ID。Show函数当然是用来显示的。

9.好了,编译运行看一下哈……….这么奇怪,是可以切换,但是怎么直接弹出来了,而且不在框内。

10.修改Dialog1和Dialog2的外观属性,Border改为 Node 无边框,Style改为 Child 这样就不会跑不到外面了。

11.运行一下,哈哈,真听话。

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页