MFC——CPropertySheet(属性表单)和CPropertyPage(属性页)——实现分页显示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huanhuanxiaoxiao/article/details/84194427

今天在学习的时候,实现了一种分页显示的功能。如下图:

以下是实现步骤:

1、在资源文件中添加三个IDD_PROPPAGE_LARGE,也就是三个dialog。我给他们取名为IDD_PROP1、IDD_PROP2、IDD_PROP3,然后随便添加一些控件。

2、我们新加三个类,名字叫做CProp1、CProp2、CProp3,基类选择CPropertyPage。在vs2008里面新加一个类的步骤是:在类视图右键点击工程名->添加->类->mfc类。

3、添加一个名为CPropSheet的类,基类是CPropertySheet。在CPropSheet类中添加三个成员变量,然后在构造函数中将这三个页面插入到该表单中,CPropSheet.h如下。

#pragma once
#include "prop1.h"
#include "prop2.h"
#include "prop3.h"



// CPropSheet

class CPropSheet : public CPropertySheet
{
	DECLARE_DYNAMIC(CPropSheet)

public:
	CPropSheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
	CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
	virtual ~CPropSheet();

protected:
	DECLARE_MESSAGE_MAP()
public:
	CProp1 m_prop1;//作为成员变量
	CProp2 m_prop2;
	CProp3 m_prop3;
};


CPropSheet.cpp如下:

// PropSheet.cpp : 实现文件
//

#include "stdafx.h"
#include "Dialog.h"
#include "PropSheet.h"


// CPropSheet

IMPLEMENT_DYNAMIC(CPropSheet, CPropertySheet)

CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
	:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
	AddPage(&m_prop1);//添加一个page到该sheet
	AddPage(&m_prop2);
	AddPage(&m_prop3);
}

CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
	:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
	AddPage(&m_prop1);
	AddPage(&m_prop2);
	AddPage(&m_prop3);
}

CPropSheet::~CPropSheet()
{
}


BEGIN_MESSAGE_MAP(CPropSheet, CPropertySheet)
END_MESSAGE_MAP()


// CPropSheet 消息处理程序

4、添加一个消息响应函数来显示该表单。为了让表单显示为向导模式,我们需要在DoModal()或者Create()之前调用SetWizardMode()。

void CDialogView::OnPropertysheet()
{
	CPropSheet propSheet(_T("维新属性表单程序"));
	propSheet.SetWizardMode();//设置为向导模式
	propSheet.DoModal();
}

5、最后一步就是,我们需要设置第一页的上一步是enable,最后一页的下一步是enable的。当该页是活动页时,我们需要设置

当前表单的按钮状态。

BOOL CProp1::OnSetActive()//重写
{
	CPropertySheet* pSheet = (CPropertySheet*)GetParent();//拿到表单的指针
	pSheet->SetWizardButtons(PSWIZB_NEXT);//设置下一步是激活的

	return CPropertyPage::OnSetActive();
}

// CProp2 消息处理程序

BOOL CProp2::OnSetActive()
{
	CPropertySheet* pSheet = (CPropertySheet*)GetParent();
	pSheet->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT);//设置上一步和下一步是激活的

	return CPropertyPage::OnSetActive();
}

// CProp3 消息处理程序

BOOL CProp3::OnSetActive()
{
	CPropertySheet* pSheet = (CPropertySheet*)GetParent();
	pSheet->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);//设置上一步和完成是激活的

	return CPropertyPage::OnSetActive();
}

经过这几个步骤就可以显示出来了。

猜你喜欢

转载自blog.csdn.net/huanhuanxiaoxiao/article/details/84194427