第十课:对话框之属性单
一、属性单
1. 属性单就是在属性对话框中常见的标签对话框,包括一个CpropertySheet和几个CpropertyPage。ClassWizard就是一个属性单,其中ClassWizard是一个CpropertySheet,而“Message Maps”,“Member Variables”,“ Automation”,“ ActiveX Event”和“Class Info”每一项是一个CpropertyPage。
2. 生成属性单:
a. 在资源面板里新建三个对话框,Caption属性改为容易区分的名字。每一个对话框对应于属性单中的一个CpropertyPage,对于CpropertyPage来说,它的样式有特殊的要求:Style是Child, Boder是Thin,确保TilteBar,Disable被选择。这些要求可以在MSDN中查“CPropertyPage, styles”得到。
b. 为每个对话框新建一个类Cpage1,Cpage2,Cpage3,基类选择CpropertyPage。
c. 将新建类的头文件加到 CxxxView的cpp中
#include "Page1.h"
#include "Page2.h"
#include "Page3.h"
d. 在资源面板里新建一个菜单,在CxxxView中添加它的处理函数,加入代码:
CPropertySheet ps;
Cpage1 pg1;
Cpage2 pg2;
Cpage3 pg3;
ps.AddPage(&pg1);
ps.AddPage(&pg2);
ps.AddPage(&pg3);
ps.SetWizardMode();
ps.DoModal();
3. 数据交换:
pg1.m_nList1=m_nList1;
if(IDOK== ps.DoModal())
{
m_nList1=pg1.m_nList1;
}
说明:以上代码是对话框和调用对话框的窗口交换数据的固定步骤。其中m_nList1是在对话框中定义的一个成员变量,想把它里面的数据保存出来,应该在调用对话框的类中也定义一个成员变量(最好名字相同,以便于记忆),在用户按OK键退出时,进行赋值。而在显示对话框之前,用保存的数据对对话框中的成员变量初始化。
4. 其它:
i. 单选按钮:
a. 单选按钮(Radio Button)复选按钮(Check Box)都是按钮,可以响应鼠标单击和双击的消息。
b. 对于单选按钮应设置组(Group),第一个单选按钮的Group设为有效,直到下一个设置Group的控件之前的单选按钮为一组,同一时间只能选一个。其中“下一个”是指Table Order的顺序,而不是物理位置上的顺序。
c. 一组单选按钮只能捆绑一个int,表示该组中选中的单选按钮的序号。
ii.列表框:
a. 在列表框的属性页中不能添加数据,要想向列表框中添加数据,应该用CListBox的成员函数AddString或InsertString。
b. 在OnInitDialog()中为列表框添加数据“北京”,
((CListBox *)GetDlgItem(IDC_LIST1))->AddString("北京");
c. 为列表框捆绑一个变量
Cstring m_strList;
在属性单显示之前用保存的数据对m_nList1赋值,
pg1.m_nList1=m_nList1;// m_nList1的值为“北京”
此时“北京”应该被选中但没有选中,因为是CPropertyPage::OnInitDialog()调用的UpdateData(false), 而那时列表框中还没有“北京”这个数据,需要手工调用UpdateData(false)。
iii.组合框:
a. 组合框由一个文本框和一个列表框组成。当前选定的项将显示在组合框的文本框中。
b. 在组合框的属性页中有Data选项,可以直接加入数据。
c. 组合有三种样式,
DropDown:用户可在文本框中输入数据,点击下拉箭头时列表框部分才被显示。只能捆绑Cstring类型的变量。
DropList: 用户不能在文本框中输入数据,点击下拉箭头时列表框部分才被显示。相当于一个列表框,只能捆绑int 类型的变量。
Simple: 用户可在文本框中输入数据,列表框部分直接显示。只能捆绑Cstring类型的变量。
二、向导页
1. 在属性单DoModal()之前,
ps.SetWizardMode();
属性单即变为向导页。
2. 在显示每一个属性页时,向导页应该显示不同的按钮,如第一页应只有“下一步”,没有“上一步”。最后一页应该没有“下一步”,而有“完成”。可在属性页类中添加虚函数OnSetActive(),添加相应代码:
((CPropertySheet *)GetParent())->SetWizardButtons(PSWIZB_NEXT);
3. 在最后一页中设置“完成”按钮后,点击它时,它的处理函数并没有调用 UpdateData(),可加入虚函数OnWizardFinish(),在其中调用。
4. 在最后一页中设置“完成”按钮后,它的ID是ID_WIZFINISH(可在MSDN中查SetWizardMode()得到“上一步”,“下一步”,“完成”对应的ID),不能再用
if(ps.DoModal()==ID_OK )来判断,应改为:
if(ps.DoModal()==ID_WIZFINISH )
评论