如何在 ActiveX 控件中使用字体(三)

翻译|其它|编辑:郝浩|2006-03-22 10:57:00.000|阅读 1658 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


 

第四部分 优化代码,合理地使用多种字体

  上例中三个字体对象使用同一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)。 对项目执行完这些更改后,重新生成项目,并使用测试容器测试接口。

例程4:LabelEx.ocx

例程4的控件名称为LabelEx.ocx,它是例程3代码的优化,实现与例程3完全相同的功能。打开Visual C++ 6.0,新建LabelEx工程,接受所有默认设置,完成LabelEx工程创建。完成所有与例程3完全相同的操作,完成后再作如下改动和补充:

向控件头文件(CLabelExCtrl.H)中添加下列代码
DECLARE_INTERFACE_MAP() //声明接口映射
BEGIN_INTERFACE_PART(FontUpNotify,IPropertyNotifySink)
INIT_INTERFACE_PART(CLabelExCtrl,FontUpNotify)
	STDMETHOD(OnRequestEdit)(DISPID);
	STDMETHOD(OnChanged)(DISPID);
END_INTERFACE_PART(FontUpNotify)
    BEGIN_INTERFACE_PART(FontMiddleNotify,IPropertyNotifySink)
	INIT_INTERFACE_PART(CLabelExCtrl,FontMiddleNotify)
	STDMETHOD(OnRequestEdit)(DISPID);
	STDMETHOD(OnChanged)(DISPID);
	END_INTERFACE_PART(FontMiddleNotify)

    BEGIN_INTERFACE_PART(FontDownNotify,IPropertyNotifySink)
	INIT_INTERFACE_PART(CLabelExCtrl,FontDownNotify)
	STDMETHOD(OnRequestEdit)(DISPID);
	STDMETHOD(OnChanged)(DISPID);
	END_INTERFACE_PART(FontDownNotify)
在CLabelExCtrl的实现文件中加入该嵌套类的实现
BEGIN_INTERFACE_MAP(CLabelExCtrl,COleControl)
INTERFACE_PART(CLabelExCtrl,IID_IPropertyNotifySink,FontUpNotify)
INTERFACE_PART(CLabelExCtrl,IID_IPropertyNotifySink,FontMiddleNotify)
INTERFACE_PART(CLabelExCtrl,IID_IPropertyNotifySink,FontDownNotify)
END_INTERFACE_MAP()

STDMETHODIMP_(ULONG) CLabelExCtrl::XFontUpNotify::AddRef()
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontUpNotify)
		return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CLabelExCtrl::XFontUpNotify::Release()
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontUpNotify)
		return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP CLabelExCtrl::XFontUpNotify::QueryInterface(REFIID iid,LPVOID FAR* ppvObj)
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontUpNotify)
		return (HRESULT)pThis->ExternalQueryInterface(&iid,ppvObj);
}
STDMETHODIMP CLabelExCtrl::XFontUpNotify::OnChanged(DISPID)
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontUpNotify)
		pThis->InvalidateControl();
	return NOERROR;
}
STDMETHODIMP CLabelExCtrl::XFontUpNotify::OnRequestEdit(DISPID)
{
	return NOERROR;
}
STDMETHODIMP_(ULONG) CLabelExCtrl::XFontMiddleNotify::AddRef()
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontMiddleNotify)
		return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CLabelExCtrl::XFontMiddleNotify::Release()
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontMiddleNotify)
		return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP CLabelExCtrl::XFontMiddleNotify::QueryInterface(REFIID iid,LPVOID FAR* ppvObj)
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontMiddleNotify)
		return (HRESULT)pThis->ExternalQueryInterface(&iid,ppvObj);
}
STDMETHODIMP CLabelExCtrl::XFontMiddleNotify::OnChanged(DISPID)
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontMiddleNotify)
		pThis->InvalidateControl();
	return NOERROR;
}
STDMETHODIMP CLabelExCtrl::XFontMiddleNotify::OnRequestEdit(DISPID)
{
	return NOERROR;
}
STDMETHODIMP_(ULONG) CLabelExCtrl::XFontDownNotify::AddRef()
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontDownNotify)
		return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CLabelExCtrl::XFontDownNotify::Release()
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontDownNotify)
		return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP CLabelExCtrl::XFontDownNotify::QueryInterface(REFIID iid,LPVOID FAR* ppvObj)
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontDownNotify)
		return (HRESULT)pThis->ExternalQueryInterface(&iid,ppvObj);
}
STDMETHODIMP CLabelExCtrl::XFontDownNotify::OnChanged(DISPID)
{
	METHOD_PROLOGUE_EX(CLabelExCtrl,FontDownNotify)
		pThis->InvalidateControl();
	return NOERROR;
}
STDMETHODIMP CLabelExCtrl::XFontDownNotify::OnRequestEdit(DISPID)
{
	return NOERROR;
}
CLabelExCtrl类的构造函数的代码作如下改动
CLabelExCtrl::CLabelExCtrl():m_fontUp(&m_xFontUpNotify),
m_fontMiddle(&m_xFontMiddleNotify),m_fontDown(&m_xFontDownNotify)
{
	InitializeIIDs(&IID_DLabelEx, &IID_DLabelExEvents);
	// TODO: Initialize your control''s instance data here.
}
   对项目执行完这些更改后,重新生成项目,并使用测试容器测试接口。 本人初学VC++,所学粗浅,发表此文,以求共勉,还望方家指教。

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP