天天看点

如何在ActiveX控件中使用字体2

如何在ActiveX控件中使用字体2

修改OnDraw函数

  修改后的OnDraw函数如下:

void CLabelCtrl::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());    // GetBackColor(),GetForeColor()分别得到背景色和前景色    // GetBackColor(),GetForeColor()返回类型为OLE_COLOR    // TranslateColor函数将OLE_COLOR类型转换为COLORREF类型   CBrush brush(colorBack);   pdc->FillRect(rcBounds, &brush);    //背景色填充整个控件   pdc->SetBkMode(TRANSPARENT);    //设置透明背景色   pdc->SetTextColor(colorFore);    //前景色设置为字体颜色   const CString& strCaption = InternalGetText();    //获得库存属性Caption的值   CFont* pOldFont;   pOldFont = SelectStockFont(pdc);    //设备上下文中选择字体对象   RECT rect;   ::CopyRect(&rect,rcBounds);   pdc->DrawText(strCaption,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);    //单行,水平居中,垂直居中显示   pdc->SelectObject(pOldFont); }

  Label控件的制作已经完成了,您可以方便地改变字体的大小、类型、颜色以及控件的背景色。当然,您还可以进一步完善该控件,更加方便您的使用。

第二部分 在控件中使用自定义的字体(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)

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

继续阅读