向CCmdTarget的派生类添加一个接口的实现
向一个类中添加某个接口的实现,这是很常见的需求,特别是用在事件通知、连接点中更是多见。MFC类库内的很多类也都有这样的需求,比如类COleControl就实现了很多的接口。MFC自己实现的方法都用的是嵌套类,并且定义了几个宏来简化该过程。用同样的方法,我们也可以很方便的在自己的类中添加一个接口的实现。CCmdTarget中实现了接口IDispatch,以及IUnknown 的三个函数的缺省实现。一般的MFC类都会从CCmdTarget继承,所以这里讲的是典型的向CCmdTarget的派生类添加接口的方法。
比如,有一个类CSampleView从CView中继承。现在要给它添加一个新的接口IMyTest,该接口只有一个空的方法Test()。添加过程如下:
(1)CSampleView类定义中加入以下代码:
DECLARE_INTERFACE_MAP() //声明接口映射
BEGIN_INTERFACE_PART(TestInterface, IMyTest) //声明实现接口IMyTest的嵌套类
STDMETHOD(Test)();
END_INTERFACE_PART(FontNotify2)
(2)CSampleView类实现中加入以下代码:
BEGIN_INTERFACE_MAP(CSampleView, CCmdTarget)
INTERFACE_PART(CSampleView, IID_IMyTest, TestInterface)
END_INTERFACE_MAP()
STDMETHODIMP_(ULONG) CSampleView::XTestInterface::AddRef( )
{
METHOD_PROLOGUE_EX(CSampleView, TestInterface)
return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CSampleView::XTestInterface::Release( )
{
METHOD_PROLOGUE_EX(CSampleView, TestInterface)
return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP CSampleView::XTestInterface::QueryInterface( REFIID iid, LPVOID FAR* ppvObj )
{
METHOD_PROLOGUE_EX(CSampleView, TestInterface)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj) ;
}
STDMETHODIMP CSampleView::XTestInterface::Test()
{
METHOD_PROLOGUE_EX(CSampleView, TestInterface)
// do something you like
return S_OK ;
}
揭开宏的神秘面纱,看看它到底是什么东西。以下都是简化的版本。
(1)DECLARE_INTERFACE_MAP
struct AFX_INTERFACEMAP_ENTRY
{
const void* piid;
// the interface id (IID) (NULL for aggregate)
size_t nOffset;
// offset of the interface vtable from m_unknown
};
- 上一篇:用VC编写具有动态换肤功能的应用程序
- 下一篇:为对话框程序添加工具条和状态栏

