属性页对话框

分类

分页和引导

CPropertyPage-父亲CDialog类别,所谓的属性页或网页对话框。

CPropertySheet-父类是CWnd,称为属性表单。

一个完整的属性页对话框由一个属性表单+多个属性页组成。属性页嵌套在属性表单内。

标签式属性页的创建步骤:

1 插入属性页对话框资源。选中对话框资源ID改动语言为Chinese(P.R.C), 选中资源视图的右边的对话框右键选择属性设置为宋体,9号字体。双击资源,生成对应的类,注意父类选择CPropertyPage类。

2 右击project。选择加入新的类,父类是CPropertySheet类。

3 在表单类中加入属性页对象。在构造函数中。

CPropertySheet::AddPage

4 创建和显示属性页

CPropertySheet::DoModal()

5 当控件的值发生改变时,将应用button设置为可用

CPropertyPage::SetModified(TRUE);

6 消息处理(通过在页面类中加入虚函数的方式实现)

CPropertyPage::OnApply

CPropertyPage::OnOK

CPropertyPage::OnCancel

新建一个MFC当文档应用程序,为菜单加入一个菜单项,在该菜单项的点击处理函数中弹出我们的属性页对话框。

为了演示效果,在视图类的OnDraw函数中创建画笔。然后绘制一个图形。画笔的线宽和颜色由其成员变量m_nWidth和m_color决定,这里正是在属性页对话框中设置线宽和颜色然后作用到上面绘制的图形上。

为视图类加入两个成员变量:

int         m_nWitdh;// 线宽

COLORERF  m_color;  //  颜色

并在视图类的构造函数中初始化

m_nWidth = 1;

m_color = RGB (0, 0, 0);

视图的OnDraw加入画图代码例如以下:

void CMFCLabelView::OnDraw(CDC* pDC)
{
CMFCLabelDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here CPen pen;
pen.CreatePen (PS_SOLID, m_nWidth, m_color);
CPen *pOldPen = pDC->SelectObject (&pen);
pDC->Ellipse (100, 100, 400, 400);
pDC->SelectObject (pOldPen);
pen.DeleteObject ();
}

加入菜单项

插入对话框资源,注意选择PROPPAGE类型的对话框资源

选中对话框资源。右键更改语言为P.R.C

然后在资源视图右边窗体选中对话框资源右键属性改动字体为宋体9号:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZWxkbl9f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

复制一个刚才我们新建的而且调整好语言和字体的对话框

注意:当中一个为线宽设置对话框,给它加入一个编辑框控件用以输入数值

另外一个为颜色设置对话框,给它加入一个button,点击button弹出颜色对话框

双击他们通过类向导生成对应的类,注意选择父类为CpropertyPage

这里分别命名为:CPage1和CPage2

Ctrl+W为线宽设置对话框的编辑框控件绑定一个int类型的值变量:m_nLineWidth并设置其范围为: 1 –20,并在其构造函数中初始化为1。

在project上右键选择New Class 注意选择父类为CpropertySheet, 这里类名我设置为:ClabelSheet,然后为该类加入两个成员变量:

CPage1 m_page1;

CPage2 m_page2; 

然后在ClabelSheet的两个构造函数中都加入属性页(这样不管调用哪个都能够正确加入):

AddPage (&m_page1);

AddPage (&m_page2);

注意包括:Page1.h 和Page2.h头文件

Ctrl+W为视图类加入菜单的命令消息响应函数,加入例如以下创建标签式属性页的代码:

注意包括:LabelSheet.h头文件

为了使当用户输入数据时让属性页对话框上的应用button变为可用状态,为线宽设置对话库类CPage1的编辑框控件加入EN_CHANGE消息响应函数,当编辑框内容一旦改变将触发该消息。

消息响应函数例如以下:

void CPage1::OnChangeEditLinewidth()
{
// 设置应用button为可用状态
SetModified (TRUE);
}

为了在用户点击应用button时把用户的设置反应在视图类的窗体画图上。我们须要响应应用button的消息。然而我们无法直接通过双击应用button位它加入消息,正确的做法是通过加入虚函数的方式,此外还有确定, 下一步,等一切属性页对话框上的button事件都是虚函数。

那么这里我给CPage1加入一个虚函数OnApply来响应”应用”button事件

并加入例如以下代码来影响视图窗体图形的绘制:

BOOL CPage1::OnApply()
{
// TODO: Add your specialized code here and/or call the base class
// 从控件接收数据到变量
UpdateData (TRUE);
// 获取视图类对象指针
CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());
// 改变视图类的线宽
pView->m_nWidth = m_nLineWidth;
// 使视图窗体重绘
pView->Invalidate ();
return CPropertyPage::OnApply();
}

这个时候编译会包一些错误发现是一些头文件包括问题

首先在Page1中包括MFCLabelView.h

然后在MFCLabelView中包括MFCLabelDoc.h

再编译就Ok了,设置线宽后点应用button在视图窗体中能够看到效果。

回到CPage2类的对话框资源对话框,双击“设置颜色”button加入响应事件,编写例如以下代码:

#include "MFCLabelView.h"
void CPage2::OnBtnSetcolor()
{
// TODO: Add your control notification handler code here
CColorDialog dlg;
if (IDCANCEL == dlg.DoModal ())
return;
CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());
pView->m_color = dlg.GetColor ();
pView->Invalidate ();
}

向导式属性页的创建步骤:

    1 插入属性页对话框资源,选中对话框资源ID改动语言为Chinese(P.R.C), 选中资源视图的右边的对话框右键选择属性设置为宋体,9号字体。双击资源,生成对应的类,注意父类选择CPropertyPage类。

    2 右击project,选择加入新的类。父类是CPropertySheet类。

    3 在表单类中加入属性页对象。

在构造函数中,

        CPropertySheet::AddPage

    4 创建和显示前,设置为向导模式

      CPropertySheet::SetWizardMode

    5 创建和显示

      CPropertySheet::DoModal()

    6 设置每一个页面的向导button,在属性页对话框相应的类中加入以下的函数

      6.1 在CPropertyPage::OnSetActive()函数中设置

      6.2 在页面中得到表单对象

            GetParent()

      6.3 设置向导button

            CPropertySheet::SetWizardButtons()

    7 消息处理函数。在属性页对话框相应的类中加入以下的虚函数函数

        CPropertyPage::OnSetActive()

        CPropertyPage::OnCancel()

        CPropertyPage::OnWizardNext()

        CPropertyPage::OnWizardBack()

        CPropertyPage::OnWizardFinish()

这里简单起见直接改动本project为向导模式:来到标签式属性对话框创建的地方。改动代码:

void CMFCLabelView::OnLabel()
{
// TODO: Add your command handler code here
/*
// 构造标签式(默认)属性页
CLabelSheet sheet ("标签式属性页");
// 显示
sheet.DoModal ();
*/ // 构造向导式属性页
CLabelSheet sheet ("向导式属性页");
// 设置为向导模式
sheet.SetWizardMode ();
// 显示
sheet.DoModal ();
}

第一个属性页对话框不应出现先一步button,来到CPage1类。加入OnSetAvtive()函数处理:

#include "LabelSheet.h"
BOOL CPage1::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
// 获取父窗体指针(sheet)
CLabelSheet* pSheet = (CLabelSheet*)GetParent ();
// 设置仅仅有"下一步"button可用
pSheet->SetWizardButtons (PSWIZB_NEXT); return CPropertyPage::OnSetActive();
}

同理颜色设置对话框仅仅能有 上一步  和 完毕button

#include "LabelSheet.h"
BOOL CPage2::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
// 获取父窗体指针(sheet)
CLabelSheet* pSheet = (CLabelSheet*)GetParent ();
// 设置:"上一步"和“完毕”button为可用状态
pSheet->SetWizardButtons (PSWIZB_BACK | PSWIZB_FINISH ); return CPropertyPage::OnSetActive();
}

那么我们想在线宽设置对话框设点击“下一步”button时把用户的输入设置到视图的显示。中,须要重写虚函数CPropertyPage::OnWizardNext()

LRESULT CPage1::OnWizardNext()
{
// TODO: Add your specialized code here and/or call the base class
// 从控件接收数据到变量
UpdateData (TRUE);
// 获取视图类对象指针
CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());
// 改变视图类的线宽
pView->m_nWidth = m_nLineWidth;
// 使视图窗体重绘
pView->Invalidate (); return CPropertyPage::OnWizardNext();
}

效果例如以下:

版权声明:本文博客原创文章,博客,未经同意,不得转载。

MFC属性页对话框的更多相关文章

  1. MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)

    前面讲了模态对话框和非模态对话框,本节来将一种特殊的对话框--属性页对话框. 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面 ...

  2. VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)

    前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话框--属性页对话框.另外,本套教程所讲大部分对VC++各个版本均可适用或者稍作修改即可,但考虑到终究还是基于VS2010版本的,所以将& ...

  3. MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)

    属性页对话框包括向导对话框和一般属性页对话框两类,上一节讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的.将上 ...

  4. VS2010/MFC对话框:一般属性页对话框的创建及显示

    一般属性页对话框的创建及显示 本节将介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的.鸡啄米将上一节中的向导对话框进行少量修改,使其成为一般属性页对话 ...

  5. VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)

    属性页对话框包括向导对话框和一般属性页对话框两类,上一节鸡啄米讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的 ...

  6. VS2010-MFC(对话框:属性页对话框及相关类的介绍)

    转自:http://www.jizhuomi.com/software/164.html 一 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过 ...

  7. VS2010-MFC(对话框:一般属性页对话框的创建及显示)

    转自:http://www.jizhuomi.com/software/169.html 属性页对话框包括向导对话框和一般属性页对话框两类,上一节演示了如何创建并显示向导对话框,本节将继续介绍一般属性 ...

  8. VC++在对话框中加入属性页

    当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置.本文针对这种方法来讨论几种可能实现的方案. 方案一本方案的例子请见源代码打包文件中的Property1部分 在对话 ...

  9. MFC多标签页对话框

    原文链接(有修改):http://blog.sina.com.cn/s/blog_6a1cdb3f0101llcw.html 1.新建一个MFC工程 取名PageSheet,选择Dialog base ...

随机推荐

  1. Androidclient和server第一种方法端数据交换

    网上有一个非常不同的情况来证明Android客户端和server如何结束的数据,但这些实施例大多相互作用更复杂,对于那些谁刚开始学习它是有害的,现在介绍一些简单的代码.逻辑清晰的互动样本,首先介绍本博 ...

  2. xp硬盘安装Fedora14 过程记录及心得体会(fedora14 live版本680M 和fedora14 DVD版本3.2G的选择)

    这次电脑奔溃了,奇怪的是直接ghost覆盖c盘竟然不中.之前电脑上硬盘安装的fedora14操作系统,也是双系统.不知道是不是这个问题,记得同学说过,在硬盘装fedora之后,要手动修改c盘隐藏的那个 ...

  3. [ACM] POJ 3254 Corn Fields(状态压缩)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8062   Accepted: 4295 Descr ...

  4. bzoj 1874 取石子游戏 题解 & SG函数初探

    [原题] 1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 334  Solved ...

  5. 写一个程序,乞讨1+2*2+3*3+n*n值 Java

    public static void main(String[] args) {         // 1*1+2*2+3*3+n*n         int n = 40;         // 1 ...

  6. Xamarin.Android 入门实例(1)之获取与解析JSON

    1.Main.axml 视图界面 2.视图代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  7. JAVA Socket超时浅析(转)

    套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”.针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”.JAVA有两个基于数据流 ...

  8. [WPF]静态资源(StaticResource)和动态资源(DynamicResource)

    一.文章概述 本演示介绍WPF基本采用静态和动态的资源.而且两者都做一个简单的比较. 静态资源(StaticResource)指的是在程序加载内存时对资源的一次性使用,之后就不再訪问这个资源了:动态资 ...

  9. RH033读书笔记(10)-Lab 11 Process Control

    Lab 11 Process Control Sequence 1: Job Control 1. [student@stationX ~]$ su - 2. Begin some jobs in t ...

  10. 构造函数为什么不能为虚函数 &amp; 基类的析构函数为什么要为虚函数

    一.构造函数为什么不能为虚函数 1. 从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的.问题出来了,假设构造函数 ...