打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MFC属性页对话框
分类: VC++ 2014-08-05 09:03 426人阅读 评论(0) 收藏 举报

属性页对话框

 分类

  标签式和向导式

  相关类

 CPropertyPage-父类是CDialog类,称为属性页或页面对话框。

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

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

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

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

  2 右击工程,选择添加新的类,父类是CPropertySheet类。

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

     CPropertySheet::AddPage

  4 创建和显示属性页

     CPropertySheet::DoModal()

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

     CPropertyPage::SetModified(TRUE);

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

     CPropertyPage::OnApply

     CPropertyPage::OnOK

     CPropertyPage::OnCancel

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

 

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

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

  1. int         m_nWitdh;// 线宽  
  2.   
  3. COLORERF  m_color;  //  颜色  

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

  1. m_nWidth = 1;  
  2.   
  3. m_color = RGB (0, 0, 0);  

视图的OnDraw添加绘图代码如下:

  1. void CMFCLabelView::OnDraw(CDC* pDC)  
  2. {  
  3.     CMFCLabelDoc* pDoc = GetDocument();  
  4.     ASSERT_VALID(pDoc);  
  5.     // TODO: add draw code for native data here  
  6.   
  7.     CPen pen;  
  8.     pen.CreatePen (PS_SOLID, m_nWidth, m_color);  
  9.     CPen *pOldPen = pDC->SelectObject (&pen);  
  10.     pDC->Ellipse (100, 100, 400, 400);  
  11.     pDC->SelectObject (pOldPen);  
  12.     pen.DeleteObject ();  
  13. }  

添加菜单项

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

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

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

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

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

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

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

这里分别命名为:CPage1和CPage2

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

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

  1. CPage1 m_page1;  
  2.   
  3. CPage2 m_page2;   

然后在ClabelSheet的两个构造函数中都添加属性页(这样无论调用哪个都可以正确添加):

  1. AddPage (&m_page1);  
  2.   
  3. AddPage (&m_page2);  

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

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

注意包含:LabelSheet.h头文件

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

消息响应函数如下:

  1. void CPage1::OnChangeEditLinewidth()   
  2. {  
  3.     // 设置应用按钮为可用状态  
  4.     SetModified (TRUE);  
  5. }  

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

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

并添加如下代码来影响视图窗口图形的绘制:

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

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

首先在Page1中包含MFCLabelView.h

然后在MFCLabelView中包含MFCLabelDoc.h

再编译就Ok了,设置线宽后点应用按钮在视图窗口中可以看到效果。

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

  1. #include "MFCLabelView.h"  
  2. void CPage2::OnBtnSetcolor()   
  3. {  
  4.     // TODO: Add your control notification handler code here  
  5.     CColorDialog dlg;  
  6.     if (IDCANCEL == dlg.DoModal ())  
  7.         return;  
  8.     CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());  
  9.     pView->m_color = dlg.GetColor ();  
  10.     pView->Invalidate ();  
  11. }  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)
VS2008?MFC如何做属性页
【新手教程】如何将属性表嵌入对话框中显示
MFC属性页使用说明
Visual C .NET编程讲座之五
在vs2008 vc++ 中添加mfc中消息处理函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服