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

来源:互联网 发布:老域名交易 编辑:程序博客网 时间:2024/05/18 12:03

一、基础知识

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"// CPropSheetclass 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"// CPropSheetIMPLEMENT_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 dialogclass CProp1 : public CPropertyPage{DECLARE_DYNAMIC(CProp1)public:CProp1();virtual ~CProp1();// Dialog Dataenum { IDD = IDD_Prop1 };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV supportDECLARE_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 dialogIMPLEMENT_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 handlersBOOL 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 hereCPropSheet 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


 

原创粉丝点击