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

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

概述:

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


第三部分 使用多种字体

  前面分别详细说明了如何在控件中使用库存属性和自定义属性。但有时我们需要在一个控件中使用多种字体,下面我们将说明如何在一个控件中实现多种字体属性。
  大多数情况下,每个字体对象都能够通过调用IFontNotification接口的成员函数(由COleControl实现)在自身更改时提供通知。如果控件使用库存Font属性,则其通知由COleControl的OnFontChanged成员函数处理。当添加自定义Font属性时,可以让它们使用同一实现。在第二部分的例程中,这一点通过在初始化m_fontCaption成员变量时传递&m_xFontNotification来实现。

例程3将演示多个字体对象使用IFontNotification的同一实现,实现在一个控件中使用多种字体。

例程3:LabelEx0.ocx

  例程1的Label控件确实增强了VC++工具箱中的Static Text控件的功能。但对于形如"m3/h","h2o"的文本内容,使用一个Label控件就有点无能为力了,下面我们将制作一个LabelEx0控件来再次扩展Label控件的功能,同时演示如何在控件中添加多种字体属性。
LabelEx0控件内部由上、中、下三个部分组成,三个部分的字体内容和字体属性可以分别设置,以方便地显示上下标部分。
  打开Visual C++ 6.0,新建LabelEx0工程,接受所有默认设置,完成LabelEx0工程创建。使用ClassWizard 给控件增加库存属性BackColor,ForeColor:

  1. 单击View菜单的ClassWizard打开 ClassWizard;
  2. 单击Automation标签;
  3. Class Name下拉列表框选择CLabelEx0Ctrl,单击 Add Property;
  4. 在External name框中,单击BackColor;
  5. 单击OK;
  6. 单击OK确认你的选择并关闭ClassWizard;

我们已经给控件增加了库存属性BackColor,该属性用以设置LabelEx0控件的背景色。按上述同样操作,添加库存属性ForeColor。
使用ClassWizard 给控件增加自定义属性CaptionUp,CaptionMiddle,CaptionDown:

  1. 单击View菜单的ClassWizard打开 ClassWizard;
  2. 单击Automation标签;
  3. Class Name下拉列表框选择CLabelEx0Ctrl,单击 Add Property;
  4. 在External name框中,输入自定义属性名CaptionUp;
  5. 在Implementation框中,单击Member variable;
  6. 在Return Type框中,选择CString作为属性类型;
  7. 单击OK;
  8. 单击OK确认你的选择并关闭ClassWizard;

  按上述同样操作,添加自定义属性CaptionMiddle,CaptionDown。CaptionUp,CaptionMiddle和CaptionDown分别用以设置LabelEx0控件上、中、下三个部分的文本内容。

使用ClassWizard 给控件增加自定义属性XUp,YUp,XMiddle, YMiddle, XDown, YDown

  1. 单击View菜单的ClassWizard打开 ClassWizard;
  2. 单击Automation标签;
  3. Class Name下拉列表框选择CLabelEx0Ctrl,单击 Add Property;
  4. 在External name框中,输入自定义属性名XUp;
  5. 在Implementation框中,单击Member variable;
  6. 在Return Type框中,选择long作为属性类型;
  7. 单击OK;
  8. 单击OK确认你的选择并关闭ClassWizard;

  按上述同样操作,添加自定义属性YUp,XMiddle, YMiddle, XDown和YDown。其中XUp 和Yup属性用来决定上标文本的位置;XMiddle和YMiddle用以设置中间文本的位置;XDown和YDown 用以设置LabelEx0控件下标文本的位置。
使用ClassWizard 给控件增加自定义属性FontUp,FontMiddle,FontDown

  1. 单击View菜单的ClassWizard打开 ClassWizard;
  2. 单击Automation标签;
  3. Class Name下拉列表框选择CLabelEx0Ctrl,单击 Add Property;
  4. 在External name框中,输入自定义属性名FontUp;
  5. 在Implementation框中,单击Get/Set methods;
  6. 在Return Type框中,选择LPFONTDISP作为属性类型;
  7. 单击OK;
  8. 单击OK确认你的选择并关闭ClassWizard;

  按上述同样操作,添加自定义属性FontMiddle,FontDown。FontUp,FontMiddle和FontDown分别用以设置LabelEx0控件上、中、下三个部分的字体属性。

添加颜色属性页和字体属性页

打开工程的LabelEx0Ctl.cpp文件,将其中的如下代码进行修改:

BEGIN_PROPPAGEIDS(CLabelEx0Ctrl, 1)
	PROPPAGEID(CLabelEx0PropPage::guid)
END_PROPPAGEIDS(CLabelEx0Ctrl)
修改后的代码:
BEGIN_PROPPAGEIDS(CLabelEx0Ctrl, 3) // 具体个数由实际情况而定
	PROPPAGEID(CLabelEx0PropPage::guid)//系统自带的属性页
	PROPPAGEID(CLSID_CColorPropPage) //加入Color属性页
	PROPPAGEID(CLSID_CFontPropPage) //加入Font属性页
END_PROPPAGEIDS(CLabelEx0Ctrl) 
修改系统自带的属性页

  打开系统自带的属性页资源IDD_PROPPAGE_LABELEx0,把属性页的尺寸由250×62调整为250×110。删除原有的静态文本框,重新添加9个静态文本框,静态文本框的内容依次为"CaptionUp:", "CaptionMiddle:","CaptionDown:","XUp:","Yup:","XMiddle:","YMiddle:","XDown:","YDown:"。添加9个对应的编辑框(Edit Box)控件,控件ID依次为IDC_CAPTIONUP,IDC_CAPTIONMIDDLE,IDC_CAPTIONDOWN,IDC_XUP,IDC_YUP,IDC_XMIDDLE,IDC_YMIDDLE,IDC_XDOWN,IDC_YDOWN。其中,IDC_CAPTIONUP,IDC_CAPTIONMIDDLE,IDC_CAPTIONDOWN分别用于输入上标,中间,下标的文本内容;IDC_XUP,IDC_YUP,IDC_XMIDDLE,IDC_YMIDDLE,IDC_XDOWN,IDC_YDOWN分别用于输入上标,中间,下标的文本的坐标位置。如图3-1。


图3-1

  按下"Ctrl+W"组合键打开ClassWizard,选中Member Variables标签,Class name:下拉列表框选择CLabelEx0PropPage,Control IDs:选中IDC_CAPTIONUP,单击Add Variable…按钮,弹出Add Member Variable对话框。
  在Add Member Variable对话框中,Member variable name:框输入m_captionUp,Category选择Value,Variable type:框选择CString,Optional property name:框选择CaptionUp,单击OK按钮。重复上述操作,为其余8个编辑控件建立添加相应的成员变量。对应关系如下表:

控件ID Member variable name Category Variable type Optional property name
IDC_CAPTIONUP

m_captionUp

Value CString CaptionUp
IDC_CAPTIONMIDDLE m_captionMiddle Value CString CaptionMiddle
IDC_CAPTIONDOWN m_captionDown Value CString CaptionDown
IDC_XUP m_xUp Value long XUp
IDC_YUP m_yUp Value long YUp
IDC_XMIDDLE m_xMiddle Value long XMiddle
IDC_YMIDDLE m_yMiddle Value long YMiddle
IDC_XDOWN m_xDown Value long XDown
IDC_YDOWN m_yDown Value long YDown

再次单击OK按钮关闭ClassWizard。 修改控件代码 在控件的头文件(LabelEx0Ctl.h),添加三个protected成员变量的声明:

protected:
CFontHolder m_fontUp;
CFontHolder m_fontMiddle;
CFontHolder m_fontDown;
在控件的执行文件(LabelEx0Ctl.CPP)中,如下操作: 在控件的构造函数中初始化 m_fontUp, m_fontMiddle, m_fontDown。
CLabelEx0Ctrl::CLabelEx0Ctrl():m_fontUp(&m_xFontNotification),
m_fontMiddle(&m_xFontNotification),m_fontDown(&m_xFontNotification)
{
	InitializeIIDs(&IID_DLabelEx0, &IID_DLabelEx0Events);
	// TODO: Initialize your control''s instance data here.
}
声明一个静态FONTDESC结构,该结构包含缺省的字体属性。
static const FONTDESC _fontdescCaption =
  { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, 
     ANSI_CHARSET, FALSE, FALSE, FALSE };
在控件的DoPropExchange 成员函数,添加PX_函数的调用。
void CLabelEx0Ctrl::DoPropExchange(CPropExchange* pPX)
{
	ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
	COleControl::DoPropExchange(pPX);
	// TODO: Call PX_ functions for each persistent custom property.
	PX_Font(pPX, _T("FontUp"), m_fontUp, &_fontdescCaption);
	PX_Font(pPX, _T("FontMiddle"), m_fontMiddle, &_fontdescCaption);
	PX_Font(pPX, _T("FontDown"), m_fontDown, &_fontdescCaption);
	PX_Long(pPX,_T("XUp"),m_xUp,0);
	PX_Long(pPX,_T("YUp"),m_yUp,0);
	PX_Long(pPX,_T("XMiddle"),m_xMiddle,0);
	PX_Long(pPX,_T("YMiddle"),m_yMiddle,20);
	PX_Long(pPX,_T("XDown"),m_xDown,0);
	PX_Long(pPX,_T("YDown"),m_yDown,30);
    PX_String(pPX, _T("CaptionUp"), m_captionUp, _T("上标")); 
    PX_String(pPX, _T("CaptionMiddle"), m_captionMiddle, _T("中间")); 
    PX_String(pPX, _T("CaptionDown"), m_captionDown, _T("下标")); 
}
完成控件的成员函数
void CLabelEx0Ctrl::OnCaptionUpChanged() 
{
    InvalidateControl();
	SetModifiedFlag();
}

void CLabelEx0Ctrl::OnCaptionMiddleChanged() 
{
    InvalidateControl();
	SetModifiedFlag();
}

void CLabelEx0Ctrl::OnCaptionDownChanged() 
{
    InvalidateControl();
	SetModifiedFlag();
}

void CLabelEx0Ctrl::OnXUpChanged() 
{
    InvalidateControl();
	SetModifiedFlag();
}

void CLabelEx0Ctrl::OnYUpChanged() 
{
    InvalidateControl();
	SetModifiedFlag();
}

void CLabelEx0Ctrl::OnXMiddleChanged() 
{
    InvalidateControl();
	SetModifiedFlag();
}

void CLabelEx0Ctrl::OnYMiddleChanged() 
{
    InvalidateControl();
	SetModifiedFlag();
}

void CLabelEx0Ctrl::OnXDownChanged() 
{
    InvalidateControl();
	SetModifiedFlag();
}

void CLabelEx0Ctrl::OnYDownChanged() 
{
    InvalidateControl();
	SetModifiedFlag();
}

LPFONTDISP CLabelEx0Ctrl::GetFontUp() 
{
	return m_fontUp.GetFontDispatch();

}

void CLabelEx0Ctrl::SetFontUp(LPFONTDISP newValue) 
{
    m_fontUp.InitializeFont(&_fontdescCaption,newValue);
	OnFontChanged();
	SetModifiedFlag();
}

LPFONTDISP CLabelEx0Ctrl::GetFontMiddle() 
{

	return m_fontMiddle.GetFontDispatch();
}

void CLabelEx0Ctrl::SetFontMiddle(LPFONTDISP newValue) 
{
    m_fontMiddle.InitializeFont(&_fontdescCaption,newValue);
	OnFontChanged();
	SetModifiedFlag();
}

LPFONTDISP CLabelEx0Ctrl::GetFontDown() 
{

	return m_fontDown.GetFontDispatch();
}

void CLabelEx0Ctrl::SetFontDown(LPFONTDISP newValue) 
{
    m_fontDown.InitializeFont(&_fontdescCaption,newValue);
	OnFontChanged();
	SetModifiedFlag();
}
修改OnDraw函数,修改后的OnDraw函数如下:
void CLabelExCtrl::OnDraw(
			CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
	// TODO: Replace the following code with your own drawing code.
	COLORREF colorBack=TranslateColor(GetBackColor());
	COLORREF colorFore=TranslateColor(GetForeColor());
	CBrush brush(colorBack);
	pdc->FillRect(rcBounds, &brush);
	pdc->SetBkMode(TRANSPARENT);
	pdc->SetTextColor(colorFore);
	CFont* pOldFont;
	RECT rect;
	::CopyRect(&rect,rcBounds);
	pOldFont = SelectFontObject(pdc, m_fontUp);
	pdc->TextOut(m_xUp,m_yUp,m_captionUp);
	SelectFontObject(pdc, m_fontMiddle);
	pdc->TextOut(m_xMiddle,m_yMiddle,m_captionMiddle);
	SelectFontObject(pdc, m_fontDown);
	pdc->TextOut(m_xDown,m_yDown,m_captionDown);
	pdc->SelectObject(pOldFont);
}
LabelEx0控件的制作已经完成了。您可以对它进行测试,并使用它制作形如"m3/h"样式的标签。
标签:

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


为你推荐

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


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP