CPropertySheet使用示例
来源:互联网 发布:有什么听书软件 编辑:程序博客网 时间:2024/05/17 04:33
在MSDN中详细介绍了CPropertySheet、CPropertyPage的使用方法,这里概要介绍主要步骤,是为笔记。
概述
一个CPropertySheet对象会包括一个或多个CPropertyPage对象,当操作界面复杂的时候,可以按照逻辑把这些操作分解到一个或多个CPropertyPage中。
MSDN中的PropertySheets使用方法是从MSDN中摘录出来的有关详细介绍使用步骤的文档,尽管如此,内容还是有点多。作为备忘的性质,本文以一个简单的例子来进一步浓缩使用步骤。——第一次了解这一块的内容,则还是需要详细阅读MSDN的文档。
这个例子是以一个简单的加法和减法为例,效果:
在主界面上单击按钮的时候,弹出来一个property sheet,其中包括2个page,分别是加法和减法运算。“确定”之后,会把两个页面的运算内容更新到主界面的只读文本框中。
主界面这个文本框的目的仅在于说明调用者可以获取property sheet的数据。
Step 1: 创建property page对应的对话框资源
具体到本例,就是创建加法运算的对话框资源和减法运算的对话框资源。
定义如下:
IDD_ADDITION DIALOGEX 0, 0, 178, 144STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION | WS_SYSMENUCAPTION "Addition"FONT 8, "MS Shell Dlg", 400, 0, 0x1BEGIN EDITTEXT IDC_X,50,23,92,19,ES_AUTOHSCROLL LTEXT "x",IDC_STATIC,30,26,13,18 EDITTEXT IDC_Y,50,50,92,19,ES_AUTOHSCROLL LTEXT "y",IDC_STATIC,30,53,13,18 EDITTEXT IDC_RESULT,50,76,92,19,ES_AUTOHSCROLL | WS_DISABLED LTEXT "x+y",IDC_STATIC,30,79,13,18 PUSHBUTTON "Add",IDC_ADD,30,110,111,17ENDIDD_SUBTRACTION DIALOGEX 0, 0, 183, 148STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION | WS_SYSMENUCAPTION "Subtraction"FONT 8, "MS Shell Dlg", 400, 0, 0x1BEGIN EDITTEXT IDC_X,50,23,92,19,ES_AUTOHSCROLL LTEXT "x",IDC_STATIC,30,26,13,18 EDITTEXT IDC_Y,50,50,92,19,ES_AUTOHSCROLL LTEXT "y",IDC_STATIC,30,53,13,18 EDITTEXT IDC_RESULT,50,76,92,19,ES_AUTOHSCROLL | WS_DISABLED LTEXT "x+y",IDC_STATIC,30,79,13,18 PUSHBUTTON "Subtract",IDC_SUBTRACT,30,110,111,17END
要点:
- 要把VS自动添加的OK和Cancel都删除掉;——因为CPropertySheet对象DoModal()的时候会自动添加这些按钮。
- Caption:设置成page对应的tab标签要显示的文本。
- Style:选择Child
- Border:选择Thin
- Titlebar:选择True(某些版本的VS是Checkbox类型,勾选即可)
- Disabled:True
Step 2: 为property page映射成对话框类,并添加相关代码
通过ClassWizard为两个对话框资源创建对应的class,此时选择CPropertyPage作为基类。代码拷贝如下。
要点
- 选择CPropertyPage作为基类
- 重载虚函数OnOK()
CAdditionPage
头文件
#pragma once#include "resource.h"// CAddition 对话框class CAdditionPage : public CPropertyPage{ DECLARE_DYNAMIC(CAdditionPage)public: CAdditionPage(); virtual ~CAdditionPage(); int GetX() const; int GetY() const; int GetResult() const;// 对话框数据 enum { IDD = IDD_ADDITION };protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP()private: int m_x; int m_y; int m_result;public: afx_msg void OnBnClickedAdd(); virtual void OnOK();};
实现文件
#include "stdafx.h"#include "PropertySheetEx.h"#include "AdditionPage.h"#include "afxdialogex.h"// CAddition 对话框IMPLEMENT_DYNAMIC(CAdditionPage, CPropertyPage)CAdditionPage::CAdditionPage() : CPropertyPage(CAdditionPage::IDD) , m_x(0) , m_y(0) , m_result(0){}CAdditionPage::~CAdditionPage(){}void CAdditionPage::DoDataExchange(CDataExchange* pDX){ CPropertyPage::DoDataExchange(pDX); DDX_Text(pDX, IDC_X, m_x); DDX_Text(pDX, IDC_Y, m_y); DDX_Text(pDX, IDC_RESULT, m_result);}BEGIN_MESSAGE_MAP(CAdditionPage, CPropertyPage) ON_BN_CLICKED(IDC_ADD, &CAdditionPage::OnBnClickedAdd)END_MESSAGE_MAP()// CAddition 消息处理程序void CAdditionPage::OnBnClickedAdd(){ UpdateData(TRUE); m_result = m_x + m_y; UpdateData(FALSE);}int CAdditionPage::GetX() const { return m_x;}int CAdditionPage::GetY() const{ return m_y;}int CAdditionPage::GetResult() const{ return m_result;}void CAdditionPage::OnOK(){ UpdateData(TRUE); m_result = m_x + m_y; //Can be deleted. UpdateData(FALSE); CPropertyPage::OnOK();}
CSubtractionPage
头文件
#pragma once// CSubtractionPage 对话框class CSubtractionPage : public CPropertyPage{ DECLARE_DYNAMIC(CSubtractionPage)public: CSubtractionPage(); virtual ~CSubtractionPage(); int GetX() const; int GetY() const; int GetResult() const;// 对话框数据 enum { IDD = IDD_SUBTRACTION };protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP()public: afx_msg void OnBnClickedSubtract();private: int m_x; int m_y; int m_result;public: virtual void OnOK();};
实现文件
// SubtractionPage.cpp : 实现文件//#include "stdafx.h"#include "PropertySheetEx.h"#include "SubtractionPage.h"#include "afxdialogex.h"// CSubtractionPage 对话框IMPLEMENT_DYNAMIC(CSubtractionPage, CPropertyPage)CSubtractionPage::CSubtractionPage() : CPropertyPage(CSubtractionPage::IDD) , m_x(0) , m_y(0) , m_result(0){ }CSubtractionPage::~CSubtractionPage(){}void CSubtractionPage::DoDataExchange(CDataExchange* pDX){ CPropertyPage::DoDataExchange(pDX); DDX_Text(pDX, IDC_X, m_x); DDX_Text(pDX, IDC_Y, m_y); DDX_Text(pDX, IDC_RESULT, m_result);}BEGIN_MESSAGE_MAP(CSubtractionPage, CPropertyPage) ON_BN_CLICKED(IDC_SUBTRACT, &CSubtractionPage::OnBnClickedSubtract)END_MESSAGE_MAP()// CSubtractionPage 消息处理程序void CSubtractionPage::OnBnClickedSubtract(){ UpdateData(TRUE); m_result = m_x - m_y; UpdateData(FALSE);}int CSubtractionPage::GetX() const{ return m_x;}int CSubtractionPage::GetY() const{ return m_y;}int CSubtractionPage::GetResult() const{ return m_result;}void CSubtractionPage::OnOK(){ UpdateData(TRUE); m_result = m_x - m_y; // Can be deleted. UpdateData(FALSE); CPropertyPage::OnOK();}
Step 3: 创建CPropertySheet子类
实际上,并不一定要创建一个CPropertySheet子类;也可以动态创建CPropertySheet对象。这方面参考MSDN即可。
本例则创建一个CPropertySheet子类,这也是比较场景的情形。
这个类:
- 以CPropertySheet为子类
- 为每个property page对象创建一个数据成员
- 在构造函数中设置sheet和各个page的属性
- 其他的数据处理等
头文件
#pragma once#include "AdditionPage.h"#include "SubtractionPage.h"class CCalculator: public CPropertySheet{public: CCalculator(void); ~CCalculator(void); int GetAdditionX(); int GetAdditionY(); int GetAdditionResult(); int GetSubtractionX(); int GetSubtractionY(); int GetSubtractionResult();private: CAdditionPage m_additionPage; CSubtractionPage m_subtractionPage;};
注意到,这里加了一系列的getter,如前所述,只是为了演示如何从property sheet对象获取数据而已。通常,调用者还需要初始化property sheet对象,此时就可以设计一系列的setter。
实现文件
#include "StdAfx.h"#include "Calculator.h"CCalculator::CCalculator(void){ AddPage(&m_additionPage); AddPage(&m_subtractionPage); m_psh.pszCaption = _T("Calculator"); m_psh.dwFlags &= ~PSH_HASHELP; m_psh.dwFlags |= PSH_NOAPPLYNOW; m_additionPage.m_psp.dwFlags&= ~PSP_HASHELP; m_subtractionPage.m_psp.dwFlags&= ~PSP_HASHELP;}CCalculator::~CCalculator(void){}int CCalculator::GetAdditionX(){ return m_additionPage.GetX();}int CCalculator::GetAdditionY(){ return m_additionPage.GetY();}int CCalculator::GetAdditionResult(){ return m_additionPage.GetResult();}int CCalculator::GetSubtractionX(){ return m_subtractionPage.GetX();}int CCalculator::GetSubtractionY(){ return m_subtractionPage.GetY();}int CCalculator::GetSubtractionResult(){ return m_subtractionPage.GetResult();}
Step 4:开始尽情享用property sheet
一切已经就绪,现在就展示这个属性表。如前面的截图所示,在UI中单击按钮调出属性页,属性页OK之后显示运算信息到文本框中。
UI对话框资源
IDD_PROPERTYSHEETEX_DIALOG DIALOGEX 0, 0, 213, 94STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAMEEXSTYLE WS_EX_APPWINDOWCAPTION "PropertySheetEx"FONT 8, "MS Shell Dlg", 0, 0, 0x1BEGIN PUSHBUTTON "Calculator",IDC_CALCULATOR,31,14,142,22 EDITTEXT IDC_INFO,34,48,142,31,ES_MULTILINE | ES_AUTOHSCROLL | WS_DISABLEDEND
调用代码
void CPropertySheetExDlg::DoDataExchange(CDataExchange* pDX){ CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_INFO, m_info);}void CPropertySheetExDlg::OnBnClickedCalculator(){ CCalculator calculator; if (IDOK == calculator.DoModal()) { char buffer[64]; sprintf(buffer, "%d + %d = %d\r\n%d - %d = %d", calculator.GetAdditionX(), calculator.GetAdditionY(), calculator.GetAdditionResult(), calculator.GetSubtractionX(), calculator.GetSubtractionY(), calculator.GetSubtractionResult()); m_info = CString(buffer); } else { m_info = "User cancelled."; } UpdateData(FALSE);}
- CPropertySheet使用示例
- CPropertySheet控件使用举例
- CPropertySheet使用收集
- CPropertySheet 使用技巧
- CPropertySheet 使用技巧
- CPropertySheet 使用技巧
- 属性单(CPropertySheet)使用
- 属性单(CPropertySheet)使用
- 属性单(CPropertySheet)使用
- CPropertySheet
- CPropertySheet
- MFC中CPropertySheet与CTabCtrl的使用
- MFC中CPropertySheet与CTabCtrl的使用
- CPropertySheet 与CPropertyPage 的基本使用
- MFC中CPropertySheet与CTabCtrl的使用
- MFC中CPropertySheet与CTabCtrl的使用
- MFC中使用CPropertySheet实现Tab Control
- 关于属性页或向导的使用(CPropertySheet,CPropertyPage)
- dos和groovy和linq的关联
- 基类析构函数为virtual的好处
- 提高工作效率
- MySQL 数据库设计初步规范
- Mac 安装zookeeper
- CPropertySheet使用示例
- Sublime配置与各种插件
- C++ FILE
- SQL Server判断对象是否存在
- 爬取图片网站上的美女图片
- Xamarin.Forms教程下载安装Windows版的Xamarin开发工具
- 数独(回溯)
- zabbix小结(一)zabbix概述
- 【零基础入门学习Python笔记015】字符串:格式化