複製鏈接
請複製以下鏈接發送給好友

CConnectionPoint

鎖定
類CConnectionPoint定義了與OLE對象通信的一類特殊接口,它稱為“連接點”(Connection Point)。一般的OLE接口實現並向外提供OLE控件的功能,而連接點則實現了外向的接口,從而能初始化其它對象的動作,如激活事件並改變通知。
中文名
連接點
外文名
CConnectionPoint

CConnectionPoint部分組成

調用接口的對象,稱為源端;實現接口的對象,稱為接收端(槽)。源端提供連接點使接收端和它建立連接。通過連接點機制,源對象可以取得接收端對一些成員函數的實現的指針。例如,要激活一個由接收端實現的事件,源端可以調用接收端的相應實現。
缺省時,從類COleControl派生出的類實現了兩個連接點:一個用於事件,一個用於屬性變化通知。它們分別用於激活事件和通知接收端(如控件的包容器)屬性發生了變化。MFC也為實現更多的連接點提供了支持。在用户派生的控制類中的每個附加的連接點,都必須聲明一個“連接部分”(connection part)來實現連接點。實現附加連接點,也需要在控制類中聲明一個“連接映射”(connection map)。

CConnectionPoint舉例説明

下面的例子實現了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