如何在ActiveX控件中使用字体
2008-02-26 20:27:03 来源:WEB开发网第四部分 优化代码,合理地使用多种字体
上例中三个字体对象使用同一IFontNotification实现,不能具体区分控件字体对象的通知。如果想区分哪个字体已更改,可以使用以下方法:
为控件的每个字体对象各创建一个单独的IFontNotification接口实现。此技术使您只需更新使用最近修改的字体的一个或多个字符串,从而优化了绘制代码。以下将以修改例程3 LabelEx0的字体属性FontUp为例来说明如何为第二个字体属性实现单独的通知接口所必需的步骤。
实现新的字体通知接口
若要区分两个或多个字体的通知,必须为控件中使用的每个字体各实现一个新的通知接口。以下各节介绍如何通过修改控件头文件和实现文件来实现新的字体通知接口。
向头文件中添加的内容
在控件头文件(CLabelEx0Ctrl.H)中,添加下列代码:
DECLARE_INTERFACE_MAP() //声明接口映射
BEGIN_INTERFACE_PART(FontUpNotify,IPropertyNotifySink)//声明实现接口IPropertyNotifySink的嵌套类
INIT_INTERFACE_PART(CLabelEx0Ctrl,FontUpNotify)
STDMETHOD(OnRequestEdit)(DISPID);
STDMETHOD(OnChanged)(DISPID);
END_INTERFACE_PART(FontUpNotify)
这样,CLabelEx0Ctrl中多了一个嵌套类XFontUpNotify,以及它的一个变量m_xFontUpNotify。在CLabelEx0Ctrl的实现文件中加入该嵌套类的实现:
//映射接口IPropertyNotifySink到相应的嵌套类
BEGIN_INTERFACE_MAP(CLabelEx0Ctrl,COleControl)
INTERFACE_PART(CLabelEx0Ctrl,IID_IPropertyNotifySink,FontUpNotify)
END_INTERFACE_MAP()
STDMETHODIMP_(ULONG) CLabelEx0Ctrl::XFontUpNotify::AddRef()
{
METHOD_PROLOGUE_EX(CLabelEx0Ctrl,FontUpNotify)
return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CLabelEx0Ctrl::XFontUpNotify::Release()
{
METHOD_PROLOGUE_EX(CLabelEx0Ctrl,FontUpNotify)
return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP CLabelEx0Ctrl::XFontUpNotify::QueryInterface(REFIID iid,LPVOID FAR* ppvObj)
{
METHOD_PROLOGUE_EX(CLabelEx0Ctrl,FontUpNotify)
return (HRESULT)pThis->ExternalQueryInterface(&iid,ppvObj);
}
STDMETHODIMP CLabelEx0Ctrl::XFontUpNotify::OnChanged(DISPID)
{
METHOD_PROLOGUE_EX(CLabelEx0Ctrl,FontUpNotify)
pThis->InvalidateControl();
return NOERROR;
}
STDMETHODIMP CLabelEx0Ctrl::XFontUpNotify::OnRequestEdit(DISPID)
{
return NOERROR;
}
在CLabelEx0Ctrl类的构造函数代码中,将m_fontUp(&m_xFontNotification)更改为m_fontUp(&m_xFontUpNotify)。对项目执行完这些更改后,重新生成项目,并使用测试容器测试接口。
更多精彩
赞助商链接