工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
MFC程序员的WTL指南之属性页与向导
[文章信息]
作者:LITHE
时间:2005-03-23
出处:VCKBASE
责任编辑:方舟
[文章导读]
向导模式的属性表通常用来引导用户安装软件或完成其他复杂的工作
advertisement
专题教程宝典
【软件应用】
【办公软件】
【图形图像】
【网页制作】
【操作系统】
【网络安全】
【程序开发】
【日报周刊】
【多媒体教程】
· 天极软件应用多媒体教程
· 微软对.NET失去信心?.NET专家激起千层浪
· Outlook使用技巧大全之一
· 抢先试用卡巴斯基 KIS 2006
· 自己动手制作手机Flash主题动画
· 完美的C++:C++/CLI
· 四款网络监控软件测评
· 中搜网络猪风行天下使用感受
· 数字证书使用一点通
· 软件消费服务信息指南
[正文]

上一页  1 2 3 4 5  下一页

  创建一个属性表

  关于这些类的解释就全部讲完了,现在需要一个例子程序演示如何使用它们。本章的例子工程是一个简单的SDI程序,它在客户区显示一幅图片并使用一总颜色填充背景,使用的图片和颜色可以通过一个选项对话框(一个属性表)来设置,还有一个向导(稍后会介绍)。

  最简单的属性表

  首先用WTL的向导创建一个SDI工程,然后为关于对话框添加一个属性表。首先改变向导创建的关于对话框样式,使它用起来像个属性页。

  第一步就是去除OK按钮,因为属性表不希望属性页自己关闭。在Style Tab中,将对话框样式改为Child,Thin Border,选择Title Bar,在More Styles tab,选择Disabled。

  第二步(也是最后一步)是在OnAppAbout()的处理函数中创建一个属性表,我们使用非定制的CPropertySheet 和 CPropertyPage类:

LRESULT CMainFrame::OnAppAbout(...)
{
 CPropertySheet sheet ( _T("About PSheets") );
 CPropertyPage<IDD_ABOUTBOX> pgAbout;

 sheet.AddPage ( pgAbout );
 sheet.DoModal();
 return 0;
}

  结果看起来向下面这样:


  创建一个有用的属性页

  并不是每一个属性表中的每一个属性页都像关于对话框这么简单,大多数属性页需要使用CPropertyPageImpl的派生类,所以我们现在就看一个这样的类。我们创建了一个新的属性页用来设置客户区背景显示的图片,它是这个样子的:


  这个对话框的样式和关于页面相同,我们需要一个新类来和这个属性页协同工作,我们将其命名为CBackgroundOptsPage。这个类是从CPropertyPageImpl类派生的,它有一个CWinDataExchange来支持DDX。

class CBackgroundOptsPage :
public CPropertyPageImpl<CBackgroundOptsPage>,
public CWinDataExchange<CBackgroundOptsPage>
{
 public:
  enum { IDD = IDD_BACKGROUND_OPTS };

  // Construction
  CBackgroundOptsPage();
  ~CBackgroundOptsPage();

  // Maps
  BEGIN_MSG_MAP(CBackgroundOptsPage)
   MSG_WM_INITDIALOG(OnInitDialog)
   CHAIN_MSG_MAP(CPropertyPageImpl<CBackgroundOptsPage>)
  END_MSG_MAP()

  BEGIN_DDX_MAP(CBackgroundOptsPage)
   DDX_RADIO(IDC_BLUE, m_nColor)
   DDX_RADIO(IDC_ALYSON, m_nPicture)
   END_DDX_MAP()

  // Message handlers
  BOOL OnInitDialog ( HWND hwndFocus, LPARAM lParam );

  // Property page notification handlers
  int OnApply();

  // DDX variables
  int m_nColor, m_nPicture;
};

  关于这个类需要注意几点:

  有一个名为IDD的公有成员将对话框于资源联系起来。

  消息映射链和CDialogImpl相似。

  消息映射链将消息链入CPropertyPageImpl,从而使我们能够处理与属性表相关的通知消息。

  有一个OnApply()处理函数在单击属性表中的OK按钮时保存用户的选择。

  OnApply() 非常简单,它调用 DoDataExchange() 更新 DDX 变量,然后返回一个代码标识是否可以关闭这个属性表:

int CBackgroundOptsPage::OnApply()
{
 return DoDataExchange(true) ? PSNRET_NOERROR : PSNRET_INVALID;
}

  我们还要在主窗口添加一个Tools|Options菜单来打开属性表,这个菜单的处理函数创建一个属性表,但是添加了一个新属性页CBackgroundOptsPage。

void CMainFrame::OnOptions ( UINT uCode, int nID, HWND hwndCtrl )
{
 CPropertySheet sheet ( _T("PSheets Options"), 0 );
 CBackgroundOptsPage pgBackground;
 CPropertyPage<IDD_ABOUTBOX> pgAbout;

 pgBackground.m_nColor = m_view.m_nColor;
 pgBackground.m_nPicture = m_view.m_nPicture;

 sheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;

 sheet.AddPage ( pgBackground );
 sheet.AddPage ( pgAbout );

 if ( IDOK == sheet.DoModal() )
  m_view.SetBackgroundOptions ( pgBackground.m_nColor,pgBackground.m_nPicture );
}

  属性表的构造函数的第二个参数是0,表示将索引是0的页面初始是可见的,你可以将其设为1,使得属性表第一次显示时显示关于页面。既然是演示代码,我就偷个懒,使用一个公有变量与CBackgroundOptsPage属性页的radio button建立关联,在主窗口中直接为其赋初始值,当用户单击属性表的OK按钮时在将其读出来。

  如果用户点击OK按钮,DoModal()发挥IDOK,我们通知视图窗口使用新的图片和背景颜色。下面是几个屏幕截图显示几个不同的样式的视图:



上一页  1 2 3 4 5  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • Visual C++ 6.0制作QQ连连看外挂
  • VC实现光驱、软驱、USB的禁用和启用
  • Visual C++中的日历控件使用详解
  • Visual C++小技巧:实现透明窗体
  • VC程序中实现控件的动态生成与响应
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 【315】华硕笔记本电脑漏电 存在设计缺陷
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • Advertisement