现在的位置: 首页 > 综合 > 正文

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

2013年08月17日 ⁄ 综合 ⁄ 共 3491字 ⁄ 字号 评论关闭

如何在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)

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

抱歉!评论已关闭.