孙鑫vc++ 8 对话框(2) 属性表单和向导的创建

本文介绍如何使用CPropertySheet和CPropertyPage类创建属性表和标签页,并通过实例演示了如何实现属性表的初始化、标签页的添加及数据交互等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基础知识

1.实现属性表和标签页的类

(1)CPropertySheet类(表示属性表)和CPropertyPage类(表示某一标签页)

2.实现的步骤

(1)实现一个从CPropertySheet类派生出来的类

(2)实现几个从CPropertyPage类派生出来的类,和对应的PROPAGE资源相关联

(3)在CPropertySheet类中添加CPropertyPage类的对象

(4)在CPropertySheet类的构造函数中调用AddPage()方法来添加标签页的对象

(5)实现一个CPropertySheet类对象,和标准对话框的使用方式相同(构造函数的参数需要注意)

(6)使用DoModal方法,即可弹出CPropertySheet类的对话框

二、代码分析

1.继承自CPropertySheet的类

#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;
};


// PropSheet.cpp : implementation file
//

#include "stdafx.h"
#include "Prop.h"
#include "PropSheet.h"


// CPropSheet

IMPLEMENT_DYNAMIC(CPropSheet, CPropertySheet)

CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
	:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{

}

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 message handlers

2.继承自CProptyPage的类

#pragma once


// CProp1 dialog

class CProp1 : public CPropertyPage
{
	DECLARE_DYNAMIC(CProp1)

public:
	CProp1();
	virtual ~CProp1();

// Dialog Data
	enum { IDD = IDD_Prop1 };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

	DECLARE_MESSAGE_MAP()
public:
	virtual BOOL OnSetActive();
	int m_Occupation;
	virtual LRESULT OnWizardNext();
	virtual BOOL OnInitDialog();
	CString m_strWorkAddr;
};
// Prop1.cpp : implementation file
//

#include "stdafx.h"
#include "Prop.h"
#include "Prop1.h"
#include "PropSheet.h"


// CProp1 dialog

IMPLEMENT_DYNAMIC(CProp1, CPropertyPage)

CProp1::CProp1()
 : CPropertyPage(CProp1::IDD)
 , m_Occupation(-1)
 , m_strWorkAddr(_T(""))
{
}

CProp1::~CProp1()
{
}

void CProp1::DoDataExchange(CDataExchange* pDX)
{
 CPropertyPage::DoDataExchange(pDX);
 DDX_Radio(pDX, IDC_RADIO1, m_Occupation);
 DDX_LBString(pDX, IDC_Lst_WkAddr, m_strWorkAddr);
}


BEGIN_MESSAGE_MAP(CProp1, CPropertyPage)
END_MESSAGE_MAP()


// CProp1 message handlers

BOOL CProp1::OnSetActive()
{
 // TODO: Add your specialized code here and/or call the base class
 ((CPropSheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
 return CPropertyPage::OnSetActive();
}

LRESULT CProp1::OnWizardNext()
{
 // TODO: Add your specialized code here and/or call the base class
 UpdateData();

 if (-1 == m_Occupation)
 {
  MessageBox(_T("请选择职业"),_T("提示"),MB_OK);
  return -1;
 }
 if (_T("") == m_strWorkAddr)
 {
  MessageBox(_T("请选择工作地点"),_T("提示"),MB_OK);
  return -1;
 }
 return CPropertyPage::OnWizardNext();
}

BOOL CProp1::OnInitDialog()
{
 CPropertyPage::OnInitDialog();

 // TODO:  Add extra initialization here
 ((CListBox*)GetDlgItem(IDC_Lst_WkAddr))->AddString(_T("北京"));
 ((CListBox*)GetDlgItem(IDC_Lst_WkAddr))->AddString(_T("上海"));
 ((CListBox*)GetDlgItem(IDC_Lst_WkAddr))->AddString(_T("深圳"));
 return TRUE;  // return TRUE unless you set the focus to a control
 // EXCEPTION: OCX Property Pages should return FALSE
}

 

3.属性表和标签页的使用

void CPropView::OnPropsheet()
{
	// TODO: Add your command handler code here
	CPropSheet dlgSheet(_T("属性表单"));
	dlgSheet.SetWizardMode();
	if (ID_WIZFINISH == dlgSheet.DoModal())
	{
		m_nOccupation = dlgSheet.m_Prop1.m_Occupation;
		m_strWorkAddr = dlgSheet.m_Prop1.m_strWorkAddr;
		bLike[0] = dlgSheet.m_Prop2.m_bFootball;
		bLike[1] = dlgSheet.m_Prop2.m_bBasketball;
		bLike[2] = dlgSheet.m_Prop2.m_bVollyball;
		bLike[3] = dlgSheet.m_Prop2.m_bSwim;
		m_strSalary = dlgSheet.m_Prop3.m_strSalary;

		Invalidate();
	}
}
void CPropView::OnDraw(CDC* pDC)
{
	CPropDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CFont font;
	font.CreatePointFont(300,_T("华文行楷"));

	CFont* pOldFont;
	pOldFont = pDC->SelectObject(&font);

	CString strTemp;
	strTemp = _T("你的职业是:");

	switch(m_nOccupation)
	{
	case 0:
		strTemp += _T("程序员");
		break;
	case 1:
		strTemp += _T("架构师");
		break;
	case 2:
		strTemp += _T("项目经理");
		break;
	default:
		break;
	}

	pDC->TextOut(0,0,strTemp);

	strTemp = _T("你的工作地点是:");
	strTemp += m_strWorkAddr;

	TEXTMETRIC tm;
	pDC->GetTextMetrics(&tm);

	pDC->TextOut(0,tm.tmHeight,strTemp);

	strTemp = _T("你的兴趣爱好是:");
	if (bLike[0])
	{
		strTemp += _T("足球 ");
	}
	if (bLike[1])
	{
		strTemp += _T("篮球 ");
	}
	if (bLike[2])
	{
		strTemp += _T("排球 ");
	}
	if (bLike[0])
	{
		strTemp += _T("游泳 ");
	}

	pDC->TextOut(0,tm.tmHeight*2,strTemp);

	strTemp = _T("你的薪资是:");

	strTemp += m_strSalary;

	pDC->TextOut(0,tm.tmHeight*3,strTemp);

	pDC->SelectObject(pOldFont);
}

三、需要掌握的函数

(1)CPropSheet的构造函数

(2)AddPage

(3)OnSetActive

(4)OnWizardNext

(5)SetWizardMode

(6)CreatePointFont

(7)SelectObject

(8)TextOut

(9)TEXTMETRIC结构体

(10)GetTextMetrics


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值