新建MFC ActiveX控件 工程,命名为clock00,,在类视图/clock00Lib下的_Dclock00接口中添加hello()方法和backcolor、forecolor标准属性和interval自定义属性,在Cclock00Ctrl类中添加事件(事件的方法由容器实现)。
在clock00Ctrl.cpp中写添加属性页代码:PROPPAGEID(CLSID_CColorPropPage)///添加颜色属性页,可通过颜色属性页设置颜色相关属性,如backcolor、forecolor
标准属性与对应属性页的数据移动由工具完成。在与自动生成的常规属性页对应的Dialog资源IDD_PROPPAGE_CLOCK00中添加一个编辑框并添加变量minterval,在clock00PropPage.cpp中的
DoDataExchange函数中添加关联minterval到控件的interval属性的DDP_Text函数:
void Cclock00PropPage::DoDataExchange(CDataExchange* pDX)
{
DDX_Text(pDX, IDC_EDIT1, minterval); ///实现minterval与IDC_Edit1控件之间的数据交换
DDP_Text(pDX, IDC_EDIT1, minterval,_T("interval"));///绑定属性页IDC_Edit1控件成员变量minterval
///到ocx控件属性“interval”,这样就可以通过在属性页填入IDC_Edit1的值改变“interval”属性值
DDP_PostProcessing(pDX);///在DDP_Text后
}
为了保存设置的属性值,在clock00Ctrl.cpp中的void Cclock00Ctrl::DoPropExchange(CPropExchange* pPX)函数中添加:
// TODO: 为每个持久的自定义属性调用 PX_ 函数。
PX_Short(pPX,_T("interval"),m_interval,1000);
///BOOL PX_Short(CPropExchange* pPX, LPCTSTR pszPropName, short& sValue, short sDefault);
在clock00Ctrl.cpp中的OnDraw()函数中添加设置控件前景背景并显示时间的代码:
CBrush brush(TranslateColor(GetBackColor()));
pdc->FillRect(rcBounds,&brush);
pdc->SetBkMode(TRANSPARENT);
pdc->SetTextColor(TranslateColor(GetForeColor()));
CTime time = CTime::GetCurrentTime();
CString strtime = time.Format("%H:%M:%S");
pdc->TextOut(0,0,strtime);
为Cclock00Ctrl类添加WM_CREATE消息和WM_TIMER消息,在OnCreate()中添加:
SetTimer(1,m_interval,NULL);
/*也可以用全局的::SetTimer(),
UINT_PTR SetTimer
(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT nElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);*/
在OnTimer()中添加:
if(AmbientUserMode())///若控件处于设计模式AmbientUserMode()返回0值,处于运行模式返回非零值
Invalidate();///使窗口无效,触发OnDraw()重绘窗口,InvalidateContrl()也可以
在void Cclock00Ctrl::OnintervalChanged(void)中添加:
KillTimer(1);
SetTimer(1,m_interval,NULL);
BoundPropertyChanged(0x2);///通知容器,(属性面板)绑定的自定义属性值已经改变,以同步属性值