WEB开发网
开发学院软件开发VC 如何在ActiveX控件中使用字体 阅读

如何在ActiveX控件中使用字体

 2008-02-26 20:27:03 来源:WEB开发网   
核心提示:第二部分 在控件中使用自定义的字体(Custom Font)属性除了库存字体属性Font外, ActiveX控件还允许使用自定义的字体属性,添加一个自定义字体属性,如何在ActiveX控件中使用字体(5),要完成一个自定义字体属性,你应该首先使用 ClassWizard 添加自定义字体属性,应添加标准字体属性页,允许控

第二部分 在控件中使用自定义的字体(Custom Font)属性

除了库存字体属性Font外, ActiveX控件还允许使用自定义的字体属性。添加一个自定义字体属性,要完成一个自定义字体属性,你应该首先使用 ClassWizard 添加自定义字体属性,然后对代码作一些修改。下面将描述怎样给一个控件添加自定义属性(假设控件的名字为Sample):

使用 ClassWizard 添加自定义字体属性

  1. 打开 控件工程,单击View菜单的ClassWizard打开 ClassWizard;
  2. 单击Automation标签;
  3. 单击 Add Property;
  4. 在External name框中,输入属性名(在本例中,假设输入的自定义属性名为HeadingFont);
  5. 在Implementation框中,单击Get/Set Methods;
  6. 在Return Type框中,选择LPFONTDISP作为属性类型;
  7. 单击OK;
  8. 单击OK确认你的选择并关闭ClassWizard;

ClassWizard 将产生相应的代码把自定义属性HeadingFont添加到CSampleCtrl类中和 SAMPLE.ODL文件中。既然 HeadingFont是一个 Get/Set 属性类型,ClassWizard 修改CSampleCtrl 类的dispatch 映射表来包括一个DISP_PROPERTY_EX 宏入口:

BEGIN_DISPATCH_MAP(CSampleCtrl, COleControl)
//{{AFX_DISPATCH_MAP(CSampleCtrl)
DISP_PROPERTY_EX(CSampleCtrl, "HeadingFont", GetHeadingFont,
  SetHeadingFont, VT_DISPATCH)
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()   
  DISP_PROPERTY_EX 宏把HeadingFont属性名和它的相应的CSampleCtrl类的Get / Set 方法(GetHeadingFont and SetHeadingFont)联系起来。 ClassWizard 也在控件的头文件(.H)为GetHeadingFont 和 SetHeadingFont函数添加声明 ,并在控件的执行文件(.CPP)添加模板函数: 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)
{
  COleControl::DoPropExchange(pPX);
   // [...other PX_ function calls...]
   PX_Font(pPX, _T("HeadingFont"), m_fontHeading, &_fontdescHeading);
}   
完成控件的GetHeadingFont成员函数。 LPFONTDISP CSampleCtrl::GetHeadingFont( )
{
   return m_fontHeading.GetFontDispatch( );
}   
完成控件的SetHeadingFont成员函数 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)

完成这些工作后,重新编译工程。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:如何 ActiveX 控件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接