属性页之间交换数据

本文详细介绍了在Property Sheet的Property Page之间利用PSM_QUERYSIBLINGS交换数据的方法。包括CPropertyPage::QuerySiblings函数的实现,各Property Page需建立消息映射和处理函数,还说明了父窗口处理消息的方式,以及修改消息参数并发送的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在前面的文章属性页中的ON_UPDATE_COMMAND_UI 中提到了利用PSM_QUERYSIBLINGS来实现属性页之间数据的交换。在这里我把有关的问题再具体的说明一下,regular_smile.gif

如果想知道怎样在Property Sheet的Property Page之间用PSM_QUERYSIBLINGS来交换数据,首先要看看函数CPropertyPage::QuerySiblings,实现如下:

LRESULT CPropertyPage::QuerySiblings(WPARAM wParam, LPARAM lParam)
{
//先判断父窗口是否创建
ASSERT(::IsWindow(m_hWnd));
ASSERT(GetParent() != NULL);
//向父窗口发送PSM_QUERYSIBLINGS消息
return GetParent()->SendMessage(PSM_QUERYSIBLINGS, wParam, lParam);
}
我们发现,CPropertyPage::QuerySiblings函数的功能就是向父窗口发送PSM_QUERYSIBLINGS消息,而Property Sheet对PSM_QUERYSIBLINGS消息的默认处理就是发送PSM_QUERYSIBLINGS到每个Propperty Page,所以在每个Property Page里,我们都需要建立一个消息映射来捕捉PSM_QUERYSIBLINGS消息,同时添加消息处理函数。

在CPropertyPage的派生类的.h文件里添加:
//{{AFX_MSG(...)
.....
//}}AFX_MSG
afx_msg LRESULT OnQuerySiblings(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()

在CPropertyPage的派生类的.cpp文件里添加:
BEGIN_MESSAGE_MAP(CMyPropertyPage, CPropertyPage)
ON_MESSAGE(PSM_QUERYSIBLINGS, OnQuerySiblings)
END_MESSAGE_MAP()

最后添加消息函数的实现:
LRESULT CMyPropertyPage::OnQuerySiblings(WPARAM wParam, LPARAM lParam)
{
// 在这里添加自己需要的额外处理
return 0; // 函数返回任何值,返回0时就表示这个消息不再传递给其他的Property Page
}

如果想在父窗口Property Sheet中处理这个消息,同样在CMyPropertySheet类里添加对PSM_QUERYSIBLINGS消息的处理。但是在最后函数返回的时候一定要是函数Default(),否则就不能调用默认的处理行为。
LRESULT CMyPropertySheet::OnQuerySiblings(WPARAM wParam, LPARAM lParam)
{
// 在这里添加自己需要的额外处理
return Default();
}
如果需要修改PSM_QUERYSIBLINGS消息的参数wParam和lParam的值, 同时发送改变的值到Property Page, 那么就必须要自己写代码发送PSM_QUERYSIBLINGS消息到每个Property Page.

LRESULT CMyPropertySheet::OnQuerySiblings(WPARAM wParam, LPARAM lParam)
{
// 改变wParam/lParam的值
int nPages = GetPageCount(); //得到PropertyPage的个数
LRESULT result = 0;
//循环发送PSM_QUERYSIBLINGS消息到每个Property Page
for (int page = 0; page < nPages && result == 0; ++page)
result = GetPage(page)->SendMessage(PSM_QUERYSIBLINGS, wParam, lParam);
return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值