MFC属性页对话框

属性页对话框

 分类

  分页和引导

  类

 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 hereCPen 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号:

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

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

     另外一个为颜色设置对话框,给它加入一个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 hereCColorDialog 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();
}

效果例如以下:





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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试官:ConcurrentHashMap为什么放弃了分段锁?

今天我们来讨论一下一个比较经典的面试题就是 ConcurrentHashMap 为什么放弃使用了分段锁,这个面试题阿粉相信很多人肯定觉得有点头疼,因为很少有人在开发中去研究这块的内容,今天阿粉就来给大家讲一下这个 ConcurrentHashMap 为什么在 JDK8 …

C语言函数指针的应用——自制谐波分析软件

文章目录函数指针简介格式介绍颜色头文件计算机仿真使用说明完整代码部分效果图函数指针简介 如果在一个大型C语言程序中要反复调用函数,而调用的函数又不明确时,函数指针就是一个非常有用的东西。如果你的函数体内可以传递不同的函数,那就非…

PHP5.5四种序列化性能对比

2019独角兽企业重金招聘Python工程师标准>>> 结论: 1、小数组用msgpack,无论空间和性能都最好 2、大数组,考虑空间用igbinary,考虑性能用msgpack json_encode,serialize,igbinary,msgpack四种序列化方式&am…

MyBatis Plus 批量数据插入功能,yyds!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入&a…

C语言打印彩色字符——以(枚举法+字符串查找)为例展示

文章目录C语言颜色头文件——自制非常简单的调用函数实战演练——一个基础的枚举变量小程序牛刀小试——查找字符小程序C语言颜色头文件——自制非常简单的调用函数 显然,C语言是不会提供打印彩色字符的标准函数,而我们有时候为了强调C语言打印的部分字…

再见 Spring Task,这个定时任务框架真香!

最近有朋友问到定时任务相关的问题。于是,我简单写了一篇文章总结一下定时任务的一些概念以及一些常见的定时任务技术选型。希望能对小伙伴们有帮助!个人能力有限。如果文章有任何需要补充/完善/修改的地方,欢迎在评论区指出,共同…

C语言实现动画控制

文章目录原材料说明一场革命原材料 下载原材料网址: https://www.easyx.cn/downloads/ 下载easyx2014冬至版,将lib文件放在编译器默认的lib文件夹,h头文件放在编译器默认的include文件夹即可 说明 C语言可以用系统内部的定时函数sleep和usleep定时(需…

聊聊redis分布式锁的8大坑

前言在分布式系统中,由于redis分布式锁相对于更简单和高效,成为了分布式锁的首先,被我们用到了很多实际业务场景当中。但不是说用了redis分布式锁,就可以高枕无忧了,如果没有用好或者用对,也会引来一些意想…

MyBatis 批量插入数据的 3 种方法!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于《MyBatis Plus 批量数据插入功能,yy…

MongoDB: The Definitive Guide

第一章 简介 MongoDB是面向文档的数据库,不是关系型数据库。内置对MapReduce的支持,以及对地理空间索引的支持。 丰富的数据模型容易扩展,它所采用的面向文档的数据模型可以使其在多台服务器之间分割数据丰富的功能,索引、存储Jav…

Python联网下载文件

声明 Python版本2.7.3所需Py文件——urllib22.7.3版本的Python Shell即可直接执行,但需要联网若程序执行成功,则会下载以下网址的txt文本并打印在shell中 http://helloworldbook2.com/data/message.txt 本代码来源于《父与子的编程之旅——与小卡特一起…

如何给SpringBoot配置轻松加密?

在实践中,项目的某些配置信息是需要进行加密处理的,以减少敏感信息泄露的风险。比如,在使用Druid时,就可以基于它提供的公私钥加密方式对数据库的密码进行加密。但更多时候,比如Redis密码、MQ密码等敏感信息&#xff0…

C语言将循环小数/有限小数转换为分数

文章目录数学基础编程思路代码数学基础 早在小学的时候我就对循环小数非常感兴趣,加上初中和高中对循环小数可以说有一定基础研究,因此想到写一个将循环下小数转换为分数的程序,非常有意思,并且对初学者来说,它的输入…

升级了 Windows 11 正式版,有坑吗?

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)今天磊哥去公司上班,惊喜的发现 Windows 提示更新了,并且是 Windows 11 正式版,这太让人…

C语言结构体的应用——万年历

文章目录万年历简述代码万年历简述 万年历——就是输入一个日期可以查询是星期几,这个功能看起来很普通,但是如果用程序时间的话,还是药费一番周折: 我们需要保存一个固定的日期,存放它是星期几,输入一个自定义的日期…

@Value竟然能玩出这么多花样

前言对于从事java开发工作的小伙伴来说,spring框架肯定再熟悉不过了。spring给开发者提供了非常丰富的api,满足我们日常的工作需求。如果想要创建bean实例,可以使用Controller、Service、Repository、Component等注解。如果想要依赖注入某个对…

C语言实现线性动态(单向)链表【详细步骤】

文章目录什么是链表为什么不用结构体数组链表的操作创建表删除元素插入元素代码及运行结果什么是链表 链表是数据结构里面的一种,线性链表是链表的一种,线性链表的延伸有双向链表和环形链表。在编程语言中优化数据结构可以在处理大数据时大大降低程序的…

移动前端经验小结

1. 移动端头部标签 head meta <!DOCTYPE html> <!-- 使用 HTML5 doctype&#xff0c;不区分大小写 --> <html lang"zh-cmn-Hans"> <!-- 更加标准的 lang 属性写法 http://zhi.hu/XyIa --> <head><!-- 声明文档使用的字符编码 -->…

再见收费的Navicat!操作所有数据库靠它就够了!

为了快速管理数据库&#xff0c;我们一般都会选择一款顺手的数据库管理工具。Navicat、DataGrip虽然很好用&#xff0c;但都是收费的。今天给大家推荐一款免费、功能强大的数据库管理工具DBeaver&#xff0c;希望对大家有所帮助&#xff01;DBeaver简介 DBeaver是一款开源的数据…

查找两个字符串中相同字符串_使两个字符串相同的最低成本

查找两个字符串中相同字符串Problem statement: 问题陈述&#xff1a; Given two strings string1 and string2 find the minimum cost required to make the given two strings identical. We can delete characters from both the strings. The cost of deleting a characte…