ActiveX控件怎样在程序中通过代码改变显示字体?解决方法

ActiveX控件怎样在程序中通过代码改变显示字体?
自己做了一个ActiveX控件,但不想通过属性页方式设置字体,控件都是动态创建的,可是调用SetFont方法不知道该传入什么参数,提示不能转换城struct   IDispatch   *,还有控件里面我加了Font库存属性,在OnDraw里面加了一句SelectStockFont   (   pdc   )   ;不知道这样够不够,希望各位大侠来帮我看看

------解决方案--------------------
MFC ActiveX 控件:使用字体

如果 ActiveX 控件显示文本,则可以允许控件用户通过更改字体属性来更改文本外观。字体属性作为字体对象实现,并且可以是两种类型之一:常用或自定义。Stock Font 属性是预实现的字体属性,可使用“添加属性向导”添加。Custom Font 属性没有预实现,其行为和用法由控件开发人员决定。

本文阐述了以下主题:

使用 Stock Font 属性
在控件中使用自定义字体属性
使用 Stock Font 属性
Stock Font 属性由 COleControl 类预实现。另外还有一个标准“字体”属性页,它使用户得以更改字体对象的各种属性,如字体对象的名称、大小和样式。

通过 COleControl 的 GetFont、SetFont 和 InternalGetFont 函数访问字体对象。控件用户通过 GetFont 和 SetFont 函数,像访问任何其他 Get/Set 属性那样访问字体对象。当需要从控件内部访问字体对象时,使用 InternalGetFont 函数。

如 MFC ActiveX 控件:属性中的讨论,使用添加属性向导添加常用属性非常容易。选择 Font 属性后,“添加属性向导”自动将常用 Font 项插入到控件的调度映射中。

使用“添加属性向导”添加常用 Font 属性

加载控件的项目。
在“类视图”中展开控件的库节点。
右击控件的接口节点(库节点的第二个节点)打开快捷菜单。
在快捷菜单中单击“添加”,然后单击“添加属性”。
此操作将打开“添加属性向导”。

在“属性名”框中,单击“Font”。
单击“完成”。
“添加属性向导”将下面一行代码添加到控件的调度映射(位于控件类的实现文件中):

DISP_STOCKPROP_FONT()
另外,“添加属性向导”将下列代码行添加到控件的 .IDL 文件:

[id(DISPID_FONT), bindable, requestedit] IFontDisp* Font;
常用 Caption 属性是可使用常用 Font 属性信息绘制的文本属性的一个示例。将常用 Caption 属性添加到控件的步骤与添加常用 Font 属性的步骤相似。

使用“添加属性向导”添加常用 Caption 属性

加载控件的项目。
在“类视图”中展开控件的库节点。
右击控件的接口节点(库节点的第二个节点)打开快捷菜单。
在快捷菜单中单击“添加”,然后单击“添加属性”。
此操作将打开“添加属性向导”。

在“属性名”框中,单击“Caption”。
单击“完成”。
“添加属性向导”将下面一行代码添加到控件的调度映射(位于控件类的实现文件中):

DISP_STOCKPROP_CAPTION()
修改 OnDraw 函数
OnDraw 的默认实现对控件中显示的所有文本使用 Windows 系统字体。这意味着必须通过将字体对象选择到设备上下文中来修改 OnDraw 代码。为此,请调用 COleControl::SelectStockFont 并传递控件的设备上下文,如下例所示:

void CSampleCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CFont* pOldFont;
TEXTMETRIC tm;
const CString& strCaption = InternalGetText();

pOldFont = SelectStockFont( pdc );
pdc-> FillRect(rcBounds, CBrush::FromHandle(
(HBRUSH )GetStockObject(WHITE_BRUSH)));
pdc-> Ellipse(rcBounds);
pdc-> GetTextMetrics(&tm);
pdc-> SetTextAlign(TA_CENTER | TA_TOP);
pdc-> ExtTextOut((rcBounds.left + rcBounds.right) / 2,
(rcBounds.top + rcBounds.bottom - tm.tmHeight) / 2,
ETO_CLIPPED, rcBounds, strCaption, strCaption.GetLength(),
NULL);

pdc-> SelectObject(pOldFont);
}
修改 OnDraw 函数以使用字体对象后,所显示的控件中的任何文本都将具有常用 Font 属性的特性。

在控件中使用自定义 Font 属性
除了常用 Font 属性外,ActiveX 控件还可以有自定义 Font 属性。若要添加自定义 Font 属性,必须:

使用“添加属性向导”实现自定义 Font 属性。
处理字体通知。
实现新的字体通知接口。
实现自定义 Font 属性
若要实现自定义 Font 属性,请使用“添加属性向导”添加该属性,然后对代码进行一些修改。下一节介绍如何将自定义 HeadingFont 属性添加到 Sample 控件。

使用“添加属性向导”添加自定义 Font 属性

加载控件的项目。
在“类视图”中展开控件的库节点。
右击控件的接口节点(库节点的第二个节点)打开快捷菜单。
在快捷菜单中单击“添加”,然后单击“添加属性”。
此操作将打开“添加属性向导”。

在“属性名”框中,键入属性名。本例中使用 HeadingFont。
对于“实现类型”,单击“Get/Set 方法”。
在“属性类型”框中,选择属性的类型 IDispatch*。
单击“完成”。
“添加属性向导”创建将 HeadingFont 自定义属性添加到 CSampleCtrl 类和 SAMPLE.IDL 文件的代码。由于 HeadingFont 是 Get/Set 属性类型,“添加属性向导”修改 CSampleCtrl 类的调度映射以包括 DISP_PROPERTY_EX 宏项:

BEGIN_DISPATCH_MAP(CSampleCtrl, COleControl)
DISP_PROPERTY_EX(CSampleCtrl, "HeadingFont ", GetHeadingFont,
SetHeadingFont, VT_DISPATCH)
END_DISPATCH_MAP()
DISP_PROPERTY_EX 宏将 HeadingFont 属性名与其相应的 CSampleCtrl 类 Get 和 Set 方法 GetHeadingFont 和 SetHeadingFont 相关联。还指定属性值的类型,此例中为 VT_FONT。

“添加属性向导”还在控件头文件 (.H) 中添加 GetHeadingFont 和 SetHeadingFont 函数的声明,并将其函数模板添加到控件的实现文件 (.CPP) 中:

LPDISPATCH CSampleCtrl::GetHeadingFont(void)