怎么使用CTabCtrl控件创建一个简单的属性应用程序

程序运行效果图:

 

 首先把CMyTabCtrl.cpp 和 CMyTabCtrl.h这两个文件添加你的工程.

然后使用VC开发工具为你的对话框添加一个CTabCtrl控件,并为该控件关联一个成员变量,注意:变量类型为CMyTabCtrl,而不是普通的CTabCtrl,其实CMyTabCtrl是从CTabCtrl派生而来的,所以它同样拥有CTabCtrl类的所有特性.

你可以不使用VC向导工具,而是简单的增加成员变量,并且手动编辑它,把类型设成CMyTabCtrl.

现在为你的每个页设置相应的对话框,这里特别注意:这里的对话框类型需要设置成子窗口,并且没有边框,否则这些对话框将不会成了标签控件的一部分,即会脱离主窗口.

接下来为刚新建的每个对话框创建一个类,在我们的实例中为:CPageOne,CPageTwo,CPageThree.

在CMyTabCtrl.cpp中大家会看见如下代码:设置一个指向CDialog*类型的成员变量数组.  m_tabPages[3],用于存入前面创建的对话框的指针,

m_nNumberOfPages保存在属性标签上被点击的页索引号,如果每一个被点击,那么其值将被设为0,同样在初始化函数中,指定所有的标签对话框,除了第一个标签对话框外的所有标签对话框都隐藏.

 

在这个例子中OnLButtonDown()这个消息响应函数用来显示或者隐藏不同的标签对话框,当然所被选中的标签的序号将保存在m_tabCurrent

 这个变量中,即就可以通过该变量的值来判断哪些对话框需要显示,那些对话框需要隐藏.SetRectangle()调整标签对话框的大小,使其和主对话框尺寸相匹配.

接下在主对话框的OnInitDialog消息响应函数中为所创建的标签控件增加所需的标签选项,在这个例子中为PageOne,PageTwo,PageThree.

 添加代码如下:

 

BOOL CMyTabExampleDlg::OnInitDialog()
{
	//comitted for brevity
	
	m_tabMyTabCtrl.InsertItem(0, _T("Tab One"));
	m_tabMyTabCtrl.InsertItem(1, _T("Tab Two"));
	m_tabMyTabCtrl.InsertItem(2, _T("Tab Three"));

	m_tabMyTabCtrl.Init();
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

 MyTabCtrl.h代码如下:

 

#if !defined(AFX_MYTABCTRL_H__F3E8650F_019C_479F_9E0F_60FE1181F49F__INCLUDED_)
#define AFX_MYTABCTRL_H__F3E8650F_019C_479F_9E0F_60FE1181F49F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyTabCtrl.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CMyTabCtrl window

class CMyTabCtrl : public CTabCtrl
{
// Construction
public:
	CMyTabCtrl();
	CDialog *m_tabPages[3];
	int m_tabCurrent;
	int m_nNumberOfPages;

// Attributes
public:

// Operations
public:
	void Init();
	void SetRectangle();

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMyTabCtrl)
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CMyTabCtrl();

	// Generated message map functions
protected:
	//{{AFX_MSG(CMyTabCtrl)
	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_MYTABCTRL_H__F3E8650F_019C_479F_9E0F_60FE1181F49F__INCLUDED_)

MyTabCtrl.cpp代码如下:

 

// MyTabCtrl.cpp : implementation file
//
/////////////////////////////////////////////////////
// This class is provided as is and Ben Hill takes no
// responsibility for any loss of any kind in connection
// to this code.
/////////////////////////////////////////////////////
// Is is meant purely as a educational tool and may
// contain bugs.
/////////////////////////////////////////////////////
// ben@shido.fsnet.co.uk
// http://www.shido.fsnet.co.uk
/////////////////////////////////////////////////////
// Thanks to a mystery poster in the C++ forum on 
// www.codeguru.com I can't find your name to say thanks
// for your Control drawing code. If you are that person 
// thank you very much. I have been able to use some of 
// you ideas to produce this sample application.
/////////////////////////////////////////////////////

#include "stdafx.h"
#include "MyTabExample.h"
#include "MyTabCtrl.h"

#include "TabOne.h"
#include "TabTwo.h"
#include "TabThree.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyTabCtrl

CMyTabCtrl::CMyTabCtrl()
{
	m_tabPages[0]=new CTabOne;
	m_tabPages[1]=new CTabTwo;
	m_tabPages[2]=new CTabThree;

	m_nNumberOfPages=3;
}

CMyTabCtrl::~CMyTabCtrl()
{
	for(int nCount=0; nCount < m_nNumberOfPages; nCount++){
		delete m_tabPages[nCount];
	}
}

void CMyTabCtrl::Init()
{
	m_tabCurrent=0;

	m_tabPages[0]->Create(IDD_TAB_ONE, this);
	m_tabPages[1]->Create(IDD_TAB_TWO, this);
	m_tabPages[2]->Create(IDD_TAB_THREE, this);

	m_tabPages[0]->ShowWindow(SW_SHOW);
	m_tabPages[1]->ShowWindow(SW_HIDE);
	m_tabPages[2]->ShowWindow(SW_HIDE);

	SetRectangle();
}

void CMyTabCtrl::SetRectangle()
{
	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-1;
	nYc=tabRect.bottom-nY-1;

	m_tabPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);
	for(int nCount=1; nCount < m_nNumberOfPages; nCount++){
		m_tabPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);
	}
}

BEGIN_MESSAGE_MAP(CMyTabCtrl, CTabCtrl)
	//{{AFX_MSG_MAP(CMyTabCtrl)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyTabCtrl message handlers

void CMyTabCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CTabCtrl::OnLButtonDown(nFlags, point);

	if(m_tabCurrent != GetCurFocus()){
		m_tabPages[m_tabCurrent]->ShowWindow(SW_HIDE);
		m_tabCurrent=GetCurFocus();
		m_tabPages[m_tabCurrent]->ShowWindow(SW_SHOW);
		m_tabPages[m_tabCurrent]->SetFocus();
	}
}

Downloads

代码下载

如有什么不清楚的地方,可以给我留言:

机器人 2007-6-15 于北京

此条目发表在 c/c++ 分类目录,贴了 , , 标签。将固定链接加入收藏夹。

怎么使用CTabCtrl控件创建一个简单的属性应用程序》有 4 条评论

  1. vcer 说:

    你好,能把MyTabCtrl例子的详细操作步骤发到我邮箱吗?谢谢。

  2. 机器人 说:

    上面的步骤应该算比较详细了,程序代码你可以到我上面的下载地址去下载。谢谢你的关注。。

  3. Good Credit 说:

    Hey there! I have poor credit. I would like to find a credit card however that could help me rebuild my score but at the same time will allow me to transfer balance from other cards to get rid of them. Is there a website that can help me do this? Is

    <a href= http://cardas-instaint.cn/tranfers-balance-chase-cards.html >free balance tranfers on chase cards</a>
    <a href= http://cardd-instantapprover.cn/discover-interest-transfer-balance.html >discover card 0% interest balance transfer</a>

    BG687sn65s

  4. Althars 说:

    不错,学习了

Good Credit进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>