基本概念:
可以把ActiveX控件看做是一个极小的服务器应用程序,它不能独立运行,必须嵌入到容器程序中,与容器一起运行。容器应用程序是可以嵌入或链接对象的 应用程序;服务器应用程序是创建对象并且当对象被双击时,可以被启动的应用程序。如Word中嵌入Excel,则Word就是一个容器应用程序,而 Excel就是服务器应用程序。
ActiveX控件的后缀名可以是[.ocx][.dll]等。作为一个典型的ActiveX控件,它具有方法,属性,事件这三种特性。ActiveX底层是通过COM技术实现的。
BEGIN_DISPATCH_MAP,调度/派遣映射是MFC提供的一种映射机制,主要是为了让外部应用可以方便的访问控件的属性和方法,而事件映射也是MFC提供,让控件可以向包含它的容器发送事件通知的映射机制。
接口是控件与外部程序进行通信的协议,可以把接口看作是函数的集合,外部程序通过这个接口暴露出来的方法和属性与之通信。实际上,就是抽象基类,在此接口中定义的所有函数都是纯虚函数,实现在派生类完成。ActiveX控件在使用前要先注册。
程序细节:
void CClockTestCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
if (!pdc)
return;
// TODO: 用您自己的绘图代码替换下面的代码。
//pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
//pdc->Ellipse(rcBounds);
CBrush brush(TranslateColor(GetBackColor()));
pdc->FillRect(rcBounds, &brush);
pdc->SetTextColor(TranslateColor(GetForeColor()));
CTime time = CTime::GetCurrentTime();
CString str = time.Format("%H:%M:%S");
pdc->TextOut(0, 0, str);
}
两个函数来使控件窗口重绘:
Invalidate
InvalidateControl
添加属性页:PROPPAGEID(CLSID_CColorPropPage)
BoundPropertyChanged
Call this function to signal that the bound property value has changed
可以在此函数中为每一个具有持久性的自定义属性调用以"PX_"开头的函数,MFC为一些基本类型都提供了PX_开头的函数,如PX_Short,PX_Long。
AmbientUserMode,Call this function to determine if the container is in design mode or user mode.
[default, source] dispinterface _DClockTestEvents; 源接口表示控件将使用这个接口来发送通知事件,这个接口不是控件本身实现的接口。
对属性和方法都是通过相应的函数实现。