属性对话框

CPropertySheet 的对象表示属性表,它通常由一个或更多CPropertyPage 对象所组成

属性表的创建需用两步构造法:首先调用构造函数,接着调用DoModal创建模态属性表,或者调用Create 创建非模态属性表。

CPropertySheet 构造CPropertySheet 对象
Construct 构造CPropertySheet 对象
GetActiveIndex 获取属性表当前活动页的索引
GetPageIndex 获取属性表指定页的索引
GetPageCount 获取属性表总的页数
GetPage 获取指定页的指针
GetActivePage 返回当前活动页对象
SetActivePage 用于设置活动页对象
SetTitle 设置属性表标题
GetTabControl 获取标签控件指针
SetFinishText 设置“完成”按钮的文本
SetWizardButtons 启用向导按钮
SetWizardMode 启用向导模式
EnableStackedTabs 指定属性表使用堆叠标签还是滚动标签
DoModal 创建模态属性表
Create 创建非模态属性表
AddPage 向属性表添加属性页
RemovePage 从属性表移除属性页
PressButton 模仿属性表指定按钮的选择
EndDialog 结束模态属性表

重要成员函数介绍:
CPropertyPage::OnApply
此函数为属性页的虚函数,当单击“应用”按钮时,由框架负责调用此函数,它的定义
如下:
BOOL CPropertyPage::OnApply()
{
ASSERT_VALID(this);
OnOK();
return TRUE;
}

从其实现过程看,它首先调用CPropertyPage::OnOK,然后返回TRUE,这一点非常重要,
因为CPropertyPage::OnApply 的返回值决定了用户对数据所做的更改是否被接受。从下文
CPropertyPage::OnOK 的默认实现中可以看到,此函数除了返回TRUE 外,并没有做任何有
意义的工作。因此,在属性表编程中,常常需要重载此函数,以完成需要的任务。

CPropertyPage::OnOK
void CPropertyPage::OnOK()
{
ASSERT_VALID(this);
}
从其实现过程看,此函数并没有做任何有意义的工作,只是简单将页标识为干净页,以反映数据在OnKillActive 中得到更新。当用户关闭属性表时,如果想对当前活动页执行指定的行为,则可以重载此函数。

CPropertyPage::OnSetActive
此函数为属性页的虚函数,当用户激活某页时,由框架负责调用。其实现如下:
BOOL CPropertyPage::OnSetActive()
{
ASSERT_VALID(this);
if (m_bFirstSetActive)
m_bFirstSetActive = FALSE;
else
UpdateData(FALSE);
return TRUE;
}

其中,m_bFirstSetActive 为属性页类的内部成员变量,它在构造属性页过程中获得TRUE值。OnSetActive 通过m_bFirstSetActive 判断是否为首次激活该页,如果不是,它将调用UpdateData 更新页的显示状态。
此函数的缺省实现是:如果在此之前,还没有创建该页的窗口,那么,它将为该页创建窗口,并使它成为活动页。当然,可以重载此函数,以便当激活某页时,完成初始化该页的任务。不过需要注意的是,重载该函数以后,在做任何处理之前,必须保证对缺省版本的调用。

CPropertyPage::OnKillActive
此函数为属性页的虚函数,当某页不再是活动页时,由框架负责调用。其实现如下:
BOOL CPropertyPage::OnKillActive()
{
ASSERT_VALID(this);
if (!UpdateData())
{
TRACE0(“UpdateData failed during page deactivation\n”);
return FALSE;
}
return TRUE;
}
从该函数的实现过程来看,它主要完成的任务是,将属性页中控件所做的设置拷贝到属性页中控件所对应的成员变量中。如果数据没有被成功地更新,则将产生一个对话框数据验证(DDV)错误,但属性页仍应保持焦点。在此成员函数成功返回之后,框架将调用该页的OnOK 成员函数。

CPropertyPage::OnNotify
实际上,框架调用OnApply、OnOK、OnSetActive 以及OnKillActive 等成员函数时,都是通过对属性页通知消息的响应,它们对应的通知消息分别为PSN_APPLY(用户按下“应用”、“确定”等时发送的均是此消息)、PSN_SETACTIVE 以及PSN_KILLACTIVE 等。这些消息以WM_NOTIFY 的形式发送,然后,由CPropertyPage::OnNotify 进行判断,以作出合适的处理。该函数的实现如下.

属性表的创建:
创建模态:
创建模态属性表和创建模态对话框一样简单,通常按照如下步骤进行即可:
(1)对于每一个属性页,使用资源编辑器创建包含页内容和特征的对话框模板,将其标
题设为用户期望显示在属性表页顶部标签上的字符串;
(2)对于每一个属性页,使用类向导从CPropertyPage 派生属性页类用于封装属性页,
在属性页模板上添加需要的控件,并且添加相应的数据成员;
(3)使用类向导从CPropertySheet 派生属性表类,然后,在属性表类中添加属性页类内
嵌成员,并在属性表类构造函数中调用CPropertySheet::AddPage,这将各属性表页按照既定
的顺序添加到属性表中,接着,在想要的类中添加属性表类内嵌成员;
(4)最后调用属性表的DoModal 成员函数创建属性表,并显示出来。
当然,属性表创建之后,还有另外的一些工作需要完成,如对“应用”按钮的处理等。

非模态:
创建非模态属性表所使用的创建函数不是DoModal,而是CPropertySheet::Create,而且创建过程也不像创建模态属性表那样简单,还需要做一些额外的工作,其中最重要的一项工作就是当属性表处于打开状态时,必须完成属性表和它正在修改的外部对象之间的数据交换。至于何时将非模态属性表的设置应用到外部对象中,这里给出两种简单的方法。

属性表和属性页窗口之间的空间关系是独立的,只是在传统的属性表制作中,两者窗
口的背景色都使用默认的灰色,因此很难发现二者在空间的差异,不过可以通过重载函数
CPropertyPage::OnSetActive 在对属性页初始化时使二者的空间位置一致。一个简单的实现
如下:
BOOL CPageX::OnSetActive()
{
CRect rc,p;
this->GetClientRect(&rc);
this->GetParent()->GetClientRect(&p);
//求出对话框与属性页窗口的位置差
int diff=p.bottom-rc.bottom;
//将页面向左上方靠,与父窗口的位置一样
rc.SetRect(0,0,p.Width(),p.Height()-diff);
//-diff 让属性页的按钮有空间显示
MoveWindow(&rc);
return CPropertyPage::OnSetActive();
}

枚举

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

myx1027

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值