时钟控件-鼠标事件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.}

相关文档
最新文档