冲击钻打桩机用电功率:COM开发中用到的宏说明集合
来源:百度文库 编辑:偶看新闻 时间:2024/04/24 04:41:22
class CMyClass : public CCmdTarget{ ... protected:// Connection point for ISample interface 使用连接宏定义内嵌的连接点对象,以下实现了连接点对象类XSampleConnPt的声明 BEGIN_CONNECTION_PART(CMyClass, SampleConnPt) CONNECTION_IID(IID_ISampleSink) END_CONNECTION_PART(SampleConnPt) DECLARE_CONNECTION_MAP()};#define BEGIN_CONNECTION_PART(theClass, localClass) \ //theClass用于计算偏移量 class X##localClass : public CConnectionPoint { public: X##localClass() { m_nOffset = offsetof(theClass, m_x##localClass); }#define CONNECTION_IID(iid) REFIID GetIID() { return iid; }#define END_CONNECTION_PART(localClass) } m_x##localClass; friend class X##localClass;
#define DECLARE_CONNECTION_MAP() \ //如果你的控制支持附加的连接点,就在你的类声明的末尾使用DECLARE_CONNECTION_MAP()宏private: static const AFX_CONNECTIONMAP_ENTRY _connectionEntries[]; protected: static const AFX_CONNECTIONMAP connectionMap; static const AFX_CONNECTIONMAP* PASCAL GetThisConnectionMap(); virtual const AFX_CONNECTIONMAP* GetConnectionMap() const; \BEGIN_CONNECTION_PART 和 END_CONNECTION_PART 宏声明嵌入类 XSampleConnPt(从 CConnectionPoint 派生),该类实现此特定的连接点。如果您想重写任何CConnectionPoint 成员函数或添加您自己的成员函数,请在这两个宏之间声明它们。例如,将 CConnectionPoint::GetIID 成员函数放在这两个宏之间时,CONNECTION_IID 宏重写该成员函数。
在第二个示例中,代码插入到控件的实现文件(.cpp 文件)中。该代码实现连接映射,该连接映射包括连接点 SampleConnPt:
以下为实现连接映射表
BEGIN_CONNECTION_MAP(CMyClass, CMyBaseClass)//CMyBaseClass为基类:常为CCmdTarget CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)END_CONNECTION_MAP()
#define BEGIN_CONNECTION_MAP(theClass, theBase) const AFX_CONNECTIONMAP* PASCAL theClass::GetThisConnectionMap() { return &theClass::connectionMap; } const AFX_CONNECTIONMAP* theClass::GetConnectionMap() const { return &theClass::connectionMap; } AFX_COMDAT const AFX_CONNECTIONMAP theClass::connectionMap = { &theBase::GetThisConnectionMap, &theClass::_connectionEntries[0], }; AFX_COMDAT const AFX_CONNECTIONMAP_ENTRY theClass::_connectionEntries[] = { \#define CONNECTION_PART(theClass, iid, localClass) { &iid, offsetof(theClass, m_x##localClass) }, #define END_CONNECTION_MAP() { NULL, (size_t)-1 } }; \
如果类有一个以上的连接点,请在 BEGIN_CONNECTION_MAP 和 END_CONNECTION_MAP 宏之间插入附加的 CONNECTION_PART 宏。
最后,在类的构造函数中添加对 EnableConnections 的调用。例如:
CMyClass::CMyClass(){EnableConnections();...}
插入了此代码后,CCmdTarget 派生的类公开 ISampleSink 接口的一个连接点。下图阐释了该示例。
由 MFC 实现的一个连接点
连接点通常支持“多路广播”- 向连接到同一接口的多个接收器广播的能力。下面的示例段落说明如何循环访问连接点上的每一个接收器来多路广播:
void CMyClass::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)); if(pSampleSink != NULL) pSampleSink->SinkFunc(); }}
该示例通过调用 CConnectionPoint::GetConnections 检索 SampleConnPt 连接点上的当前连接集。然后它循环访问这些连接并在每一个活动连接上调用 ISampleSink::SinkFunc。
请参见
MFC COM
#define DECLARE_CONNECTION_MAP() \ //如果你的控制支持附加的连接点,就在你的类声明的末尾使用DECLARE_CONNECTION_MAP()宏private: static const AFX_CONNECTIONMAP_ENTRY _connectionEntries[]; protected: static const AFX_CONNECTIONMAP connectionMap; static const AFX_CONNECTIONMAP* PASCAL GetThisConnectionMap(); virtual const AFX_CONNECTIONMAP* GetConnectionMap() const; \BEGIN_CONNECTION_PART 和 END_CONNECTION_PART 宏声明嵌入类 XSampleConnPt(从 CConnectionPoint 派生),该类实现此特定的连接点。如果您想重写任何CConnectionPoint 成员函数或添加您自己的成员函数,请在这两个宏之间声明它们。例如,将 CConnectionPoint::GetIID 成员函数放在这两个宏之间时,CONNECTION_IID 宏重写该成员函数。
在第二个示例中,代码插入到控件的实现文件(.cpp 文件)中。该代码实现连接映射,该连接映射包括连接点 SampleConnPt:
以下为实现连接映射表
BEGIN_CONNECTION_MAP(CMyClass, CMyBaseClass)//CMyBaseClass为基类:常为CCmdTarget CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)END_CONNECTION_MAP()
#define BEGIN_CONNECTION_MAP(theClass, theBase) const AFX_CONNECTIONMAP* PASCAL theClass::GetThisConnectionMap() { return &theClass::connectionMap; } const AFX_CONNECTIONMAP* theClass::GetConnectionMap() const { return &theClass::connectionMap; } AFX_COMDAT const AFX_CONNECTIONMAP theClass::connectionMap = { &theBase::GetThisConnectionMap, &theClass::_connectionEntries[0], }; AFX_COMDAT const AFX_CONNECTIONMAP_ENTRY theClass::_connectionEntries[] = { \#define CONNECTION_PART(theClass, iid, localClass) { &iid, offsetof(theClass, m_x##localClass) }, #define END_CONNECTION_MAP() { NULL, (size_t)-1 } }; \
如果类有一个以上的连接点,请在 BEGIN_CONNECTION_MAP 和 END_CONNECTION_MAP 宏之间插入附加的 CONNECTION_PART 宏。
最后,在类的构造函数中添加对 EnableConnections 的调用。例如:
CMyClass::CMyClass(){EnableConnections();...}
插入了此代码后,CCmdTarget 派生的类公开 ISampleSink 接口的一个连接点。下图阐释了该示例。
由 MFC 实现的一个连接点
连接点通常支持“多路广播”- 向连接到同一接口的多个接收器广播的能力。下面的示例段落说明如何循环访问连接点上的每一个接收器来多路广播:
void CMyClass::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)); if(pSampleSink != NULL) pSampleSink->SinkFunc(); }}
该示例通过调用 CConnectionPoint::GetConnections 检索 SampleConnPt 连接点上的当前连接集。然后它循环访问这些连接并在每一个活动连接上调用 ISampleSink::SinkFunc。
请参见
MFC COM
哪里有COM开发的全面资料?
谁知道NBA 2006中用键盘操作的详细说明?
相关宏的集合称为( )。
《黑色毛衣》中用到的乐器
mp3解码中用到的比例因子?
生活中用到逻辑的事???
电脑中用到的CPU是什么意思
日常生活中用到的命令有哪些??
初三化学酸碱盐一章中用到的方程式
曹冲称象中用到的物理知识
古文教学中用到的术语
焰色反应中用到的酸?
电影中用到的玻璃是什么材料?
从集合{a}到集合{b,c}的不同映射有_个
下列对应能构成集合A到集合B的函数是
谁能谈谈企业中用eclipse开发J2ME的具体流程呢?
JAVA中用SWING开发的BUTTON,如何实现3D效果?
需要把几个word格式的说明书集合在一起,制作成一个exe的说明文档
拳皇模拟器。97到2002集合的
一些国家的语言中用“契丹”的音译称中国,这说明了什么?
局域网中用\\qhdvtc-**** 的用法。详细说明下 谢谢
设集合A=R集合B= { x∣x>0 }则集合A到B 的映射f
手机中用到的mmcard插在电脑的什么地方
银行业务中用到的密押器是干什么用的啊?