Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1332874
  • 博文数量: 945
  • 博客积分: 52360
  • 博客等级: 大将
  • 技术积分: 13070
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-08 11:12
文章分类

全部博文(945)

文章存档

2011年(1)

2008年(944)

我的朋友

分类: C/C++

2008-08-08 11:29:02

下载本文示例代码
下载本文源代码

向导是一种用来简化用户操作的程序。在Microsoft 的所有产品中都存在向导,如Office2000 中的Web 页向导就是一个十分典型的向 导(如下图所示),还有常用的VC 向导。
一个基本的向导程序应该包含以下几个基本按钮: 取消、上一步、下一步、完成、帮助。


一、标准向导程序

在 VC 中,可以使用类CPropertySheet和类CPropertyPage方便地编写一个向导程序。
首先我们来介绍一下类CPropertySheet 和类CPropertyPage。

1. 类CPropertyPage 是从CDiaglog中派生出来的,具有Diaglog的基本性质,需要注意的是它的样式必须是Child。
2. 类CPropertySheet 是一个属性表,也是一个窗体,相当一个容器,用来存放所有的CpropertyPage。它不是 从CDialog 派生出来的,但是它可以象普通对话框类似的操作, 如DoModal(),当用 DoModal()显示 后,它就包含了“取消”、“上一步”、“下一步” 等基本按钮。
下面给出一个实例
① 新建一个 VC MFC AppWizard 工程,命名为TraditionalWizard,并选择Dialog Based 样式。
② 在自动生成 的Dialog 资源中加入一个按钮IDC_BENGINWIZ 用来启动向导。
③ 创建 CPropertyPage。新建Dialog 资源,命名为IDD_STEP1,注意一定要将新建对话框的Style属性设置成Child 和边界属性设置为Thin,并且不要生成一个新类。
用ClassWizard 生成一个新类,命名为CStep1,基类为CPropertyPage,且将Dialog ID 设置为刚生成的资源IDD_STEP1。这样就生成了一个新属性页Step1。如此操作就可以 同样生成Step2、Step3 属性页。为了方便显示,在每个对话框都放置了一个控件,用来表示当前是哪一步。
④ 创建 CPropertySheet。新建一个类,命名为CWizard,基类为CPropertySheet。并将属性页和属性表关联起来。代码为

//将代码放在按钮IDC_BEGINWIZ的Click事件中

CWizard MyWizard(_T("我的向导 "),this,1); //生成一个属性表

CStep1 MyStep1;  //属性页1 

CStep2 MyStep2; //属性页2 

CStep3 MyStep3; //属性页3 

MyWizard.AddPage(&MyStep1); //添加属性页1 

MyWizard.AddPage(&MyStep2); //添加属性页2 

MyWizard.AddPage(&MyStep3); //添加属性页3

MyWizard.SetWizardMode();   //将属性表设置成向导样式

MyWizard.SetActivePage(&MyStep1); //设置第一页为第一步

MyWizard.DoModal(); //显示属性表

⑤协调显示。在每一页为当前页时,都会触发OnSetActive事件,故对每一个属性页都要重载该函数,在CStep1类上选择Add Virtual Function ...。因为显示第一页时,不存在“上一步”,故在CStep1的 OnSetActive函数中需要添加如下代码:
//代码放在OnSetActive函数中

CPropertySheet* pParent=(CPropertySheet*)GetParent(); // 获得属性表的指针

pParent->SetWizardButtons(PSWIZB_NEXT); // 设置属性表的显示按钮只为下一步

SetDlgItemText(IDC_TEXT1,"这是向导的第一步"); 

同样在显示中间页时应该设置成即有“上一步”,也有“下一步”,代码为:

CPropertySheet* pParent=(CPropertySheet*)GetParent(); 

pParent->SetWizardButtons(PSWIZB_NEXT|PSWIZB_BACK);  

SetDlgItemText(IDC_TEXT2,"这是向导的第二步"); 

最后在显示最后一页时只显示“完成”和“上一步”,代码为:

CPropertySheet* pParent=(CPropertySheet*)GetParent(); 

pParent->SetWizardButtons(PSWIZB_FINISH|PSWIZB_BACK); 

SetDlgItemText(IDC_TEXT3,"这是向导的第三步"); 

这样一个基本的向导程序就完成了,其效果如图所示


二、自定义向导程序

通过上面的例子,我们不难发现标准的向导基本能满足要求,但仍然存在一些缺陷:
1.不能改变向导按钮的样式,如想在“上一步”、“下一步就”按钮上添加图标
2.不能象上面的Web向导一样有个“完成”按钮进行默认设置
3.不能修改向导按钮的位置
上述缺陷是因为我们采用了CPropertySheet类,而CPropertySheet类不是一个可修改的资源。
为了达到个性化向导的目的,我们可以不使用CPropertySheet类和CPropertyPage类。
设计的基本思路:
1. 采用标准的向导的工作方式。每一步就是一个对话框,向导本身也是一个对话框,用来容纳每步对话框.
2. 每步的对话框应 该没有Title、没有边界、样式为Child,当点击“下一步”或“上一步”时,将这个 对话框定位到要显示的位置。
3. 因为向导一般都包含很多步,为了管理这些页,我们可以创建一个链表来管理每一步的对话框。
4. 为了方便对话框定位,可以事先定义好位置。

三、自定义向导的实现

1. 工程的建立与基本界面的生成
生成一个MFC APPWIZARD 新工程,命名为CustomWizard,在Step1 中选择基于Dialog Based样式。
在自动生成的Dialog 资源中加入一个按钮IDC_BENGINWIZ 用来启动向导。
新建一个对话框 资源,命名为IDC_WIZARD,用来显示自定义向导界面,如图

依次创建向导的每页 的对话框资源,命名为IDD_STEP1,IDD_STEP2,IDD_STEP3,

(图4)
2. 生成所需要的类
为了方便叙述,表1将所用的类进行了归纳
(表1)

下载本文示例代码
类名 基类 说明
CWizard CDialog 向导的框架
CStep1 CDialog 向导的第一步
CStep2 CDialog 向导的第二步
CStep3 CDialog 向导的第三步
CCustomWizardDlg CDialog 启动向导
阅读(147) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~