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,一经查实,立即删除!

相关文章

vector cbegin_vector :: cbegin()函数以及C ++ STL中的示例

vector cbeginC vector :: cbegin()函数 (C vector::cbegin() function) vector::cbegin() is a library function of "vector" header, it is used to get the const iterator pointing to the first element of the vector. vector :: cbegin()是“ vector”头文件…

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

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

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

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

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

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

多线程循环输出abcc++_C ++循环| 查找输出程序| 套装2

多线程循环输出abccProgram 1: 程序1&#xff1a; #include<iostream>using namespace std;int main(){ for(;;){cout<<"Hello ";}return 0;}Output: 输出&#xff1a; Hello Hello .... Infinite loopExplanation: 说明&#xff1a; In the above co…

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

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

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

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

人工智能ai 学习_学习代理| 人工智能

人工智能ai 学习Learning is an important part of human behavior. It is the first step in the development phase of any human. When the concept of Artificial Intelligence was proposed, the main approach of the developers was to build a system which could reac…

sql server中同时执行select和update语句死锁问题

原始出处 http://oecpby.blog.51cto.com/2203338/457054 最近在项目中使用SqlServer的时候发现在高并发情况下&#xff0c;频繁更新和频繁查询引发死锁。通常我们知道如果两个事务同时对一个表进行插入或修改数据&#xff0c;会发生在请求对表的X锁时&#xff0c;已经被对方持有…

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

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

C语言实现动画控制

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

mcq 队列_MCQ | 8086微处理器中的寻址模式

mcq 队列Question 1: 问题1&#xff1a; You are given the following instruction: ADD AX , [1024] You are provided the following data: DS 3423H ; SS 1234H ; CS 4567H Find the effective address location for the given instruction. 您得到以下指示&#xff1a;…

聊聊redis分布式锁的8大坑

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

python 唯一元素_检查所有元素在Python中是否唯一

python 唯一元素Here, we are implementing a python program to check whether all elements of a list are unique or not? 在这里&#xff0c;我们正在实现一个python程序来检查列表的所有元素是否唯一&#xff1f; Its very simple to check, by following two steps 按…

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

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

MongoDB: The Definitive Guide

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

Python联网下载文件

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

java 生产者消费者代码_Java生产者和消费者代码

java 生产者消费者代码This also helps us to understand the concept of synchronised multi-threading in java, the basic work of our code is that the producer will produce a thread and load it into the memory and after producing the producer thread we would be…

如何给SpringBoot配置轻松加密?

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

secureFX上传文件的时候报错,secureFX崩溃

SecureFX experienced a fatal error and must close.A crash dump file has been......打开注册表&#xff0c;HKEY_CURRENT_MACHINE->SOFTWARE->Vandyke中的secureCRT和secureFX中的license是secureCRT、secureFX的注册信息&#xff0c;不能删除&#xff0c;删除后需要…