部分組成,舉例說明,
部分組成
調用接口的對象,稱為源端;實現接口的對象,稱為接收端(槽)。源端提供連線點使接收端和它建立連線。通過連線點機制,源對象可以取得接收端對一些成員函式的實現的指針。例如,要激活一個由接收端實現的事件,源端可以調用接收端的相應實現。
預設時,從類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<cConnections; i++)
{
pSampleSink = (ISampleSink*)(pConnections->GetAt(i));
ASSERT(pSamplesink != NULL);
pSampleSink->SinkFunc( );
}
}
在本例中使用CConnectionPoint::GetConnections檢索SampleConnPt連線點上的所有連線。然後對每個活動的連線調用ISampleSink::SinkFunc。
#include <afxctl.h>