如何在ActiveX控件中使用字体
2008-02-26 20:27:03 来源:WEB开发网第二部分 在控件中使用自定义的字体(Custom Font)属性
除了库存字体属性Font外, ActiveX控件还允许使用自定义的字体属性。添加一个自定义字体属性,要完成一个自定义字体属性,你应该首先使用 ClassWizard 添加自定义字体属性,然后对代码作一些修改。下面将描述怎样给一个控件添加自定义属性(假设控件的名字为Sample):
使用 ClassWizard 添加自定义字体属性
- 打开 控件工程,单击View菜单的ClassWizard打开 ClassWizard;
- 单击Automation标签;
- 单击 Add Property;
- 在External name框中,输入属性名(在本例中,假设输入的自定义属性名为HeadingFont);
- 在Implementation框中,单击Get/Set Methods;
- 在Return Type框中,选择LPFONTDISP作为属性类型;
- 单击OK;
- 单击OK确认你的选择并关闭ClassWizard;
ClassWizard 将产生相应的代码把自定义属性HeadingFont添加到CSampleCtrl类中和 SAMPLE.ODL文件中。既然 HeadingFont是一个 Get/Set 属性类型,ClassWizard 修改CSampleCtrl 类的dispatch 映射表来包括一个DISP_PROPERTY_EX 宏入口:
BEGIN_DISPATCH_MAP(CSampleCtrl, COleControl)
DISP_PROPERTY_EX 宏把HeadingFont属性名和它的相应的CSampleCtrl类的Get / Set 方法(GetHeadingFont and SetHeadingFont)联系起来。 ClassWizard 也在控件的头文件(.H)为GetHeadingFont 和 SetHeadingFont函数添加声明 ,并在控件的执行文件(.CPP)添加模板函数:
//{{AFX_DISPATCH_MAP(CSampleCtrl)
DISP_PROPERTY_EX(CSampleCtrl, "HeadingFont", GetHeadingFont,
SetHeadingFont, VT_DISPATCH)
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP() LPFONTDISP CSampleCtrl::GetHeadingFont()
{
// TODO: Add your property handler here
return NULL;
}
void CSampleCtrl::SetHeadingFont(LPFONTDISP newValue)
{
// TODO: Add your property handler here
SetModifiedFlag();
}
最后, ClassWizard修改控件的 .ODL 文件,为HeadingFont 属性添加一个入口:[id(1)] IFontDisp* HeadingFont;
修改控件代码
现在你已经为控件添加了HeadingFont属性,你必须对控件的头文件和执行文件进行修改以完全支持新的属性。在控件的头文件(.H),添加一个protected成员变量的声明:
protected:
CFontHolder m_fontHeading;
在控件的执行文件(.CPP)中,如下操作:在控件的构造函数中初始化
m_fontHeading。
CSampleCtrl::CSampleCtrl( ) : m_fontHeading( &m_xFontNotification )
{
// [...body of constructor...]
}
声明一个静态FONTDESC结构,该结构包含缺省的字体属性。
static const FONTDESC _fontdescHeading =
{ sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD,
ANSI_CHARSET, FALSE, FALSE, FALSE };
在控件的DoPropExchange 成员函数,添加一个PX_Font函数的调用,提供自定义字体属性的初始化和持久化。
void CSampleCtrl::DoPropExchange(CPropExchange* pPX)
完成控件的GetHeadingFont成员函数。
{
COleControl::DoPropExchange(pPX);
// [...other PX_ function calls...]
PX_Font(pPX, _T("HeadingFont"), m_fontHeading, &_fontdescHeading);
} LPFONTDISP CSampleCtrl::GetHeadingFont( )
完成控件的SetHeadingFont成员函数
{
return m_fontHeading.GetFontDispatch( );
} void CSampleControl::SetHeadingFont( LPFONTDISP newValue )
{
m_fontHeading.InitializeFont( &_fontdescHeading, newValue);
OnFontChanged(); //notify any changes
SetModifiedFlag( );
}
修改控件的OnDraw成员函数,定义一个变量控制以前选择的字体。
CFont* pOldHeadingFont;
修改控件的OnDraw成员函数,添加下列代码,在设备上下文中选择自定义的字体。
pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
修改控件的OnDraw成员函数,字体使用完后恢复原字体到设备上下文。
pdc->SelectObject(pOldHeadingFont);
添加标准字体属性页自定义字体属性设置完成后,应添加标准字体属性页,允许控件使用者更改控件当前的字体。为标准字体属性页增加属性页的ID号, 在BEGIN_PROPPAGEIDS宏后添加如下行:
PROPPAGEID(CLSID_CFontPropPage)
完成这些工作后,重新编译工程。
赞助商链接