类CConnectionPoint定义了与OLE对象
通信的一类特殊
接口,它称为“连接点”(Connection Point)。一般的OLE接口实现并向外提供OLE控件的功能,而连接点则
实现了外向的接口,从而能初始化其它对象的动作,如激活事件并改变通知。
部分组成
调用接口的对象,称为源端;实现接口的对象,称为接收端(槽)。源端提供连接点使接收端和它建立连接。通过连接点机制,源对象可以取得接收端对一些成员函数的实现的
指针。例如,要激活一个由接收端实现的事件,源端可以调用接收端的相应实现。
缺省时,从类
COleControl派生出的类实现了两个连接点:一个用于事件,一个用于属性变化通知。它们分别用于激活事件和通知接收端(如控件的包容器)属性发生了变化。MFC也为实现更多的连接点提供了支持。在用户派生的
控制类中的每个附加的连接点,都必须声明一个“连接部分”(connection part)来实现连接点。实现附加连接点,也需要在
控制类中声明一个“连接映射”(connection map)。
举例说明
下面的例子实现了Sample OLE控件上一个简单的连接映射和连接点,它包括两部分代码:第一部分声明了连接映射和连接点;第二部分实现了该映射和连接点。第一部分要插入到控件类protected部分下的声明中:
// Connection point for ISample interface
BEGIN_CONNECTION_PART( CSampleCtrl, SampleConnPt )
CONNECTION_IID( IID_ISampleSink )
END_CONNECTION_PART( SampleConnPt )
DECLARE_CONNECTION_MAP( )
宏BEGIN_CONNECTION_PART和END_CONNECTION_PART声明了一个嵌入类XSampleConnPt(从CConnectionPoint继承来),该类实现了这个连接点。如果想覆盖CConnectionPoint的成员函数或者增加新的成员函数,要在这两个宏之间声明。例如,上例中的宏CONNECTION_IID覆盖了CConnectionPoint::GetIID。
代码的第二部分要插入到
控制类的实现文件(.CPP)中。它实现了连接映射,包括附加的连接点SampleConnPt:
BEGIN_CONNECTION_MAP( CSampleCtrl,
COleControl )
CONNECTION_PART( CSampleCtrl, IID_SampleSink, SampleConnPt )
END_CONNECTION_MAP( )
插入这些代码之后,Sample OLE控件就为接口ISampleSink提供了一个连接点。
典型地,连接点支持
多播,即向连接到同一个接口的多个接收端广播。下面的例子通过向每个接收端发送实现多播。
void CSampleCrtl::CallSinkFunc( )
{
const
CPtrArray* pConnections = m_xSampleConnPt.GetConnections( );
ASSERT( pConnections !=NULL );
int cConnections = pConnections->GetSize( );
ISampleSink* pSampleSink;
for( int i=0 ; i
{
pSampleSink = (ISampleSink*)(pConnections->GetAt(i));
ASSERT(pSamplesink != NULL);
pSampleSink->SinkFunc( );
}
}
在本例中使用CConnectionPoint::GetConnections检索SampleConnPt连接点上的所有连接。然后对每个活动的连接调用ISampleSink::SinkFunc。
#include