怎样使用CPropertyPage类和CPropertySheet类创建属性表

CPropertyPage类是属性页类,相当于每一个类就是一个对话框.它继承自CDialog类.

CPropertySheet类是属性表类,它有多个属性页.它继承自CWnd类

创建属性表步骤如下:

这里简单的以只有两个属性页的属性表为例子.

1.创建一个主对话框.

如图:

2.在资源中创建一个菜单

如图:

3.给菜单添加事件处理程序

如图:

4.在主对话框属性中添加菜单

如图:

5.添加两个对话框作为属性页

如图:

需要注意的是,对话框外框最好设置为thin(MSDN说的),不过我测试的时候感觉看不出什么问题…

还有对话框标题就是属性页的标题,下面会有截图,继续往下看就行.

6.分别给两个对话框(属性页)添加类

需要特别注意! 基类的选择必须是CPropertyPage.

如图:

7.添加一个自己的属性表类

特别注意的是,这个类要继承自CPropertySheet

这里添加的类不是简单的C++类,而是MFC类!

如图:

8.在CMyPropertySheet头文件中添加两个属性页变量

如图:

9.在CMyPropertySheet两个构造函数中向属性表中添加两个属性页

如图:

10.到了这一步,属性表已经创建出来了,让我们去打开看看效果如何.

我们是通过菜单方式打开一个属性表.所以要在菜单事件处理那里填写代码.

代码如下:

void CMFCCPropertySheetDlg::OnProperty()
{

    //第一个参数是属性表的标题
    CMyPropertySheet mypsheet(TEXT("属性表"));
    //打开模态对话框,就是属性表
    mypsheet.DoModal();
}

效果如图:

上面的”确定” “取消” “应用” “帮助”按钮都是自动生成的,基类都已经实现好了它们的代码.但是”应用”按钮需要自己编写相应的事件处理,下面会有讲到方法.

11.接下就是在各自的属性页中实现控件的功能.

点击属性页1按钮就弹出一个消息框.

如图:

12.使应用按钮有效.

可以在改变了属性页里面的内容的时候使其有效.

方法如下:

添加单选按钮事件处理

代码如下:

void CPage1::OnBnClickedRadio1()
{
    SetModified(TRUE);
    //其它代码
    //......
}

为了方便,多个按钮响应同一个消息

ON_BN_CLICKED(IDC_RADIO1, &CPage1::OnBnClickedRadio1)
    ON_BN_CLICKED(IDC_RADIO2, &CPage1::OnBnClickedRadio1)
    ON_BN_CLICKED(IDC_RADIO3, &CPage1::OnBnClickedRadio1)

13.响应应用按钮消息

CPropertyPage类中有一个OnApply函数.它的ID是ID_APPLY_NOW,消息映射的时候,这个ID不能变,函数名可以自己再起一个.

首先先进行消息映射

ON_BN_CLICKED(ID_APPLY_NOW, CMyPropertySheet::OnApply)

然后在头文件中声明

afx_msg void OnApply();

最后写函数体实现

void CMyPropertySheet::OnApply()
{
    AfxMessageBox(TEXT("点击了应用按钮"));
    m_Page1.SetModified(FALSE); //使应用按钮无效
    m_Page2.SetModified(FALSE);
    //按下应用的时候更新页面的数据
    GetActivePage()->UpdateData(TRUE);
    //接下来可以SendMessage给其它函数来执行更新后的操作
}
时间: 2024-10-17 16:13:02

怎样使用CPropertyPage类和CPropertySheet类创建属性表的相关文章

MFC属性表单的创建

一个属性表单由一个或多个属性页组成.它有效地解决了大量信息无法在一个对话框上显示这一问题. 1.创建属性页 为了创建属性表单,首先需要创建属性页,后者对应的MFC类是CPropertyPage,该类生成的对象代表了属性表单中一个单独的属性页. 在资源编译器下添加3个属性页资源,并修改这三个属性页资源的ID及标题(Caption属性),属性页的标题就是最终在属性页上显示的选项卡的名称.有三种类型的属性页,如图: 说明:如果知道了属性页资源与对话框资源之间的属性区别,也可以在程序中先增加一个普通对话

JAVA 创建类,使用类

一.创建类: Test.java //定义类 public class Test{ //属性 String name; String gender; int age; //方法,无参无返回 public void eat(){ System.out.println("我在吃饭."); } } 二.使用类: 如果类与使用类的文件在同一目录,则不需要引入文件 Test1.java //使用类 public class Test1{ public static void main(Strin

yii框架之gii创建数据表对应的model类

一.首先是在数据库中建立工程需要的表: 二.然后,配置对应文件: 在工程目录下yiiProject\protected\config\main.php.在50行定义了db应用组件,下面后一段注释掉了的mysql的链接配置项,我们将未注释的db注释掉,然后打开mysql链接代码并填写相关信息即可完成mysql链接配置项. 即,把下面代码         'db'=>array(             'connectionString' => 'sqlite:'.dirname(__FILE_

深入理解final 类String 对象的创建以及内部方法

学习过程中的笔记 : int indexOf(int ch) :获取字符在字符串中第一次出现的位置,如果不存在,则返回-1 int indexOf(int ch,int fromIndex): 从fromIndex位置开始查找,查找ch第一次出现的位置 获取位置 int indexOf(int ch) :获取字符在字符串中第一次出现的位置,如果不存在,则返回-1 int indexOf(int ch,int fromIndex): 从fromIndex位置开始查找,查找ch第一次出现的位置 in

C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表

C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表 2011-12-13 09:00:40| 分类: C# |举报|字号 订阅 OpenFileDialog openFileDialog1 = new OpenFileDialog(); if(openFileDialog1.ShowDialog() == DialogResult.OK) { openFileDialog1.FileName; System.IO.FileInfo file = new System.IO.Fil

Win32API全局窗口类的注册与创建

  Win32API全局窗口类的注册 应用程序全局窗口类的注册 typedef struct tagWNDCLASSEX { UINT      cbSize; //结构体的大小,用sizeof得出 UINT      style; //窗口类的风格,默认设置左右画出 WNDPROC   lpfnWndProc; //回调函数,窗口处理函数,干活的人 int       cbClsExtra; //窗口类的附加数据Buff的大小 int       cbWndExtra; //窗口的附加数据Bu

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

C/C++ (函数、变量和类)动态库的创建、导出和使用(图文+示例代码)

 一 Windows库 1引入库的原因: a.项目的复杂程度大 b.提高代码的利益利用率 2库的分类 2.1静态库: *.lib,不能被加载的程序,可以理解为目标程序的归档. 2.2动态库:*.dll,可以被应用程序加载的程序. 二 动态库 1动态库优点 1.1可以提供模块化的方式,方便协调开发(对于大项目,每个人写的东西编译为动态库,直接链接即可) 1.2对源代码保护 1.3减小可执行文件大小 1.4提高代码重用率 2动态库的基本使用方法 2.1动态库的创建 2.2加载动态库 2.3获取并

黑马基础阶段测试题:创建Phone(手机)类,Phone类中包含以下内容:

package com.swift; public class Phone { private String pinpai; private int dianliang; public String getPinpai() { return pinpai; } public void setPinpai(String pinpai) { this.pinpai = pinpai; } public int getDianliang() { return dianliang; } public v