时钟控件-鼠标事件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
时钟控件-鼠标事件
例2 利用MFC创建一个ActiveX控件Clock,该控件用数字时钟显示当前时间。并且,当用鼠标单击控件时,数字时钟就变成了表盘查模拟钟。
[编程说明与实现]
(1)执行File|New命令,选择Project页,选择MFC ActiveX ControlWizard项目,类型,项目名称为Clock,单击OK按钮。在向导Step of 2设置控件的数目,并选择是否需要口令、注释和帮助文件,本例选择默认值。在向导Step 2 of 2确定控件的类名Clock和文件名,选择控件属性、控件的基类,确定ActiveX高级特性。
(2)控件类CClockCtrl的OnDraw()函数用于绘制控件,但调用OnDraw()函数只能显示一次当前时间。要想使时钟走动起来,需要处理WM_TIMER 消息。利用ClassWizard为类CClockCtrl添加WM_TIMER的消息处理函数OnTimer(),在函数中通过不断调用重画控件函数,从而自动调用OnDraw()函数动态显示当前时间。
Cpp代码
1.void CClockCtrl::OnTimer(UINT nIDEvent)
2.{
3.// TODO: Add your message handler code here an
d/or call default
4.InvalidateControl(); //重画控件
5.COleControl::OnTimer(nIDEvent);
6.}
(3)在控件窗口创建时建立定时器,利用ClassWizard为类CClockCtrl 添加消息WM_CREATE的处理函数CClockCtrl::OnCreate();在控件窗口销毁时删除所建立的定时器,利用ClassWizard为类CClockCtrl添加消息DestroyWindow的处理函数。为类CClockCtrl添加属性为protected、类型为UINT的成员变量m_timer。
Cpp代码
1.int CClockCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
2.{
3.if (COleControl::OnCreate(lpCreateStruct) == -1)
4.return -1;
5.
6.// TODO: Add your specialized creation code her
e
7.//建立定时器,时间间隔为m_updateInterval(在第5步添加该
成员变量)
8.m_timer=SetTimer(1,(UINT)m_updateInterval,NULL);
9.return 0;
10.}
Cpp代码
1.BOOL CClockCtrl::DestroyWindow()
2.{
3.// TODO: Add your specialized code here and/or call
the base class
4.KillTimer(m_timer); //销毁时钟
5.return COleControl::DestroyWindow();
6.}
(4)为了在控件窗口响应单击事件,必须添加该控件事件,该事件是ActiveX控件的库存(stock)事件。启动ClassWizard,选择ActiveEvents页面,单击Add Event按钮,在打开对话框Add Event的External name下列框中选择click。库存事件不需要添加代码,ClassWizard自动在ClockCtl.cpp 文件中合适位置加入以下事件映射。
Cpp代码
1.EVENT_STOCK_CLICK()
再利用ClassWizard为类CClockCtrl添加单击消息OnClick的处理函数
Cpp代码
1.void CClockCtrl::OnClick(USHORT iButton)
2.{
3.// TODO: Add your specialized code here and/or
call the base class
4.//单击控件时,切换钟表的显示方式
5.m_ifDigitShape=!m_ifDigitShape; //m_ifDigitSh
ape是控件的自定义属性成员变量
6.InvalidateControl();
7.COleControl::OnClick(iButton);
8.}
(5)显示时钟需要获取控件的背景颜色,因此为控件添加库存属性BackColor。启动ClassWizard类向导,选择Automation页面,单击Add Property 按钮,在打开对话框Add Property的External name下拉框中选择BackColor,单击OK按钮。
Clock控件还需要表示显示间隔和显示方式的两个自定义属性,启动ClassWizard选择Automation页面,单击Add Property按钮,在打开对话框Add Property的External name下拉框中输入UpdateInterval(显示间隔),Type选择Long,Implementation选择Member Variable。向导将自动加入属性变量m_updateInterval和处理属性的成员函数。用同样方法加入自定义属性IfDigitShape(显示方式),其类型为BOOL。
(6)程序员编程使用ActiveX控件时,与标准控件一样,可打开控件属性对话框设置ActiveX控件的属性。ActiveX控件属性对话框包含多个属性页(property page)。利用MFC ActiveX Control Wizard创建ActiveX控件时,已经提供了默认的属性页。在创建的Clock控件中,除子默认的General属性页,还要加入Color属性页。在ClockCtl.cpp中找到说明Property Pages的宏,进行如下修改:
Cpp代码
1.BEGIN_PROPPAGEIDS(CClockCtrl, 2) //2表示共两个
属性页
2.PROPPAGEID(CClockPropPage::guid)
3.PROPPAGEID(CLSID_CColorPropPage) //颜色属性页
码
4.END_PROPPAGEIDS(CClockCtrl)
(7)为了使控件能够保存设置的属性,需向DoProExchange()函数添加如下代码。
Cpp代码
1.void CClockCtrl::DoPropExchange(CPropExchange* pPX)
2.{
3.ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor
));
4.COleControl::DoPropExchange(pPX);
5.PX_Bool(pPX,"IfDigitShape",m_ifDigitShape,TRUE);
6.PX_Long(pPX,"UpdateInterval",m_updateInterval,1000);
7.
8.// TODO: Call PX_ functions for each persistent
custom property.
9.}