孙鑫VC++深入详解(7):对话框2

来源:互联网 发布:网络推广课程的广告 编辑:程序博客网 时间:2024/06/06 01:49

1、创建属性表单

    属性表单由一个或多个属性页组成,它的每一个选项卡都是一个属性页,它有效地解决了大量信息无法在一个对话框上显示的问题,并提供了对信息分类和组织管理的功能。属性表单对应的MFC类是CPropertySheet

    为了创建属性表单,首先需要创建属性页。属性页对应的MFC类是CPropertyPage,其从CDialog派生而来,即属性页其实也是对话框。创建属性页需要先创建一个属性页对话框资源。在为工程添加属性页对话框资源时,应选择Dialog类别下的以IDD_PRORPAGE_ 开头的对话框资源。

    创建好属性页对话框资源后应该生成对应的属性页对话框类右击对话框资源—选择添加类—输入类名。

    创建一个属性表单需要三步:1、首先应添加属性表单CPropertySheet类的派生类,然后定义一个该类的对象  2、在属性表单对象中(可以在该对象的头文件中)为每一个属性页定义一个对象,然后该对象构造函数中,调用AddPage()添加每一个属性页 3、最后调用属性表单对象的DoModal()函数显示一个模态属性表单,或者调用Create显示一个非模态属性表单。

   在上面的第2步中会发现添加的属性表单类中有两个构造函数,其中一个函数使用ID号,一个函数是用标题字符串来构造属性表单对象的。其中基类CPropertySheet构造函数的第三个参数用来指定属性表单初始显示时显示的属性页,其默认参数为0,即显示第一个属性页。

   如果属性页显示时汉字乱码,可以在属性页资源的“属性”中设置中文字体。

2、Combo Box“组合框”

   工具箱上的Combo Box“组合框”(下拉式列表框)根据其Type属性的不同设置,共有三种类型:1、简单式(Simple),包含一个编辑  框和一个总是显示的下拉列表框。2、下拉式(Dropdown),包含一个编辑框和一个点击下拉按钮才出现的下拉列表框。3、下拉列表式(Drop List),包含一个只读编辑框和一个点击下拉按钮才出现的下拉列表框。

3、创建向导

   创建向导类型的对话框,应该遵循创建一个属性表单的步骤来实现,但在调用DoModal()显示向导之前,应该先调用SetWizardMode()。如果要调整指定属性页上的按钮(如禁用上一步、将下一步改为完成),应该重写指定属性页对话框类的OnSetActive()虚函数,在OnSetActive()中调用属性表单对象的成员函数SetWizardButtons()进行设置。属性表单是属性页的父窗口,可以通过GetParent()获得属性表单对象的指针。例,设置属性页中只有“下一步”和“取消”按钮。

4、处理属性页中用户的选择

   处理单选按钮:

可以为单选按钮关联一个成员变量,控件类别选择Value值类型,变量类型设为int,如果在对话框类的构造函数中设置成员变量的初始值为-1,则为默认不选中任何单选按钮,初始值为0则默认选中第一个按钮。 需要注意的是应先设置第一个单选按钮的Group属性,这样随后的单选按钮就和这个按钮属于同一组,直到遇到下一个(按照Tab顺序)具有Group属性的控件为止。当用户选中第一个单选按钮后,单选按钮所关联的成员变量的值是0,当选中第二个单选按钮后其值为1,以此类推,故可以通过单选按钮关联的成员变量的值判断用户的选择。需要注意的地方是:在使用与控件相关联的成员变量前,还需先调用UpdateData()来获得对话框上控件的数据;在改变了与控件相关联的成员变量的值以后,还需再调用UpdateData(FALSE)来初始化对话框上控件的内容

   处理下一个属性页的进入:

当用户点击属性页上的“下一步”按钮后,程序会调用属性页的OnWizardNext()虚函数,如果这个函数返回0,则正常进入下一页,如果返回-1,则禁止属性页发生更改,即禁止进入下一页。故可以重写这个函数,在这个函数中通过控件所关联的变量值来判断用户是否做出了选择,通过设置其返回值来处理下一个属性页的进入。

   处理列表框:

列表框对应的类为CListBox,其成员函数AddString()用来向列表框添加一条数据。故可以在属性页的OnInitDialog()先获得这个列表框控件,再调用其AddString()向其添加数据,eg:((CListBox*)GetDlgItem(IDC_LIST))->AddString("北京");

同样可以为列表框关联一个成员变量,控件类别选择Value值类型,变量类型设为CString。可以在OnWizardNext()函数中判断这个变量是否为空,为空即为用户没有在列表框上做出选择。

  处理复选按钮:

同样为每个复选按钮关联一个Value值类别的控件变量,变量类型为BOOL:对于复选控件来说,当其被选中时,它所关联的成员变量的值为TRUE,否则为FALSE。同样的,如果在对话框类的构造函数中设置成员变量的初始值为FALSE,则默认为不选中这个复选按钮。可以在OnWizardNext()函数中判断复选按钮所关联的成员变量中有没有一个是TRUE,全为FALSE即用户没有在所有的复选框上做出选择。

 处理组合框:

组合框由一个编辑框和一个列表框组成,其对应的MFC类是CComboBox类,该类也有一个成员函数AddString()用来向其列表框添加一条数据。故可以在属性页的OnInitDialog()先获得这个组合框控件,再调用其AddString()向其添加数据,eg:((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("3000元");

需要注意的是,默认的组合框的列表框具有排序属性,如果想要以调用AddString()添加数据的顺序排列的话,应去掉其Sort属性。

如果希望组合框的编辑框初始显示时有一个默认的初始项,则可以通过组合框的成员函数SetCurSel()来实现:该函数的功能是选中组合框的列表框中的一个字符串,将其显示在改组合框的编辑框上。函数原型:

int SetCurSel(int nSelect);

参数nSelect是一个基于0的索引,指定选择项的索引位置,如果其为-1则为移除该组合框上的选择。

成员函数GetCurSel()可以获取组合框的列表框上当前选中的项的索引。

成员函数GetLBText()可以获得组合框的列表框上指定项的字符串。

  处理用户最后的操作:

对于一个属性表单来说,当在属性页上点击的是“完成”按钮时,属性表单的DoModal()函数返回值为IDOK,点击“取消”按钮则返回值为IDCANCEL。

对于一个向导来说,当在一个属性页上点击的是“完成”按钮,向导的DoModal()函数返回值为ID_WIZFINISH,点击“取消”按钮则返回值为ID_CANCEL。


0 0
原创粉丝点击