第十课:对话框之属性单 一、属性单 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 )

评论