时钟控件鼠标事件Word文档下载推荐.docx
- 文档编号:6886467
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:18
- 大小:61.67KB
时钟控件鼠标事件Word文档下载推荐.docx
《时钟控件鼠标事件Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《时钟控件鼠标事件Word文档下载推荐.docx(18页珍藏版)》请在冰点文库上搜索。
voidCClockCtrl:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
InvalidateControl();
//重画控件
COleControl:
}
(3)在控件窗口创建时建立定时器,利用ClassWizard为类CClockCtrl添加消息WM_CREATE的处理函数CClockCtrl:
OnCreate();
在控件窗口销毁时删除所建立的定时器,利用ClassWizard为类CClockCtrl添加消息DestroyWindow的处理函数。
为类CClockCtrl添加属性为protected、类型为UINT的成员变量m_timer。
1.int
OnCreate(LPCREATESTRUCT
lpCreateStruct)
if
(COleControl:
OnCreate(lpCreateStruct)
==
-1)
return
-1;
6.
specialized
creation
here
7.
//建立定时器,时间间隔为m_updateInterval(在第5步添加该成员变量)
8.
m_timer=SetTimer(1,(UINT)m_updateInterval,NULL);
9.
0;
10.}
intCClockCtrl:
OnCreate(LPCREATESTRUCTlpCreateStruct)
if(COleControl:
OnCreate(lpCreateStruct)==-1)
return-1;
Addyourspecializedcreationcodehere
//建立定时器,时间间隔为m_updateInterval(在第5步添加该成员变量)
m_timer=SetTimer(1,(UINT)m_updateInterval,NULL);
return0;
1.BOOL
DestroyWindow()
the
base
class
KillTimer(m_timer);
//销毁时钟
DestroyWindow();
BOOLCClockCtrl:
DestroyWindow()
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
//销毁时钟
returnCOleControl:
(4)为了在控件窗口响应单击事件,必须添加该控件事件,该事件是ActiveX控件的库存(stock)事件。
启动ClassWizard,选择ActiveEvents页面,单击AddEvent按钮,在打开对话框AddEvent的Externalname下列框中选择click。
库存事件不需要添加代码,ClassWizard自动在ClockCtl.cpp文件中合适位置加入以下事件映射。
1.EVENT_STOCK_CLICK()
EVENT_STOCK_CLICK()
再利用ClassWizard为类CClockCtrl添加单击消息OnClick的处理函数
OnClick(USHORT
iButton)
//单击控件时,切换钟表的显示方式
m_ifDigitShape=!
m_ifDigitShape;
//m_ifDigitShape是控件的自定义属性成员变量
OnClick(iButton);
8.}
OnClick(USHORTiButton)
//单击控件时,切换钟表的显示方式
m_ifDigitShape=!
//m_ifDigitShape是控件的自定义属性成员变量
(5)显示时钟需要获取控件的背景颜色,因此为控件添加库存属性BackColor。
启动ClassWizard类向导,选择Automation页面,单击AddProperty按钮,在打开对话框AddProperty的Externalname下拉框中选择BackColor,单击OK按钮。
Clock控件还需要表示显示间隔和显示方式的两个自定义属性,启动ClassWizard选择Automation页面,单击AddProperty按钮,在打开对话框AddProperty的Externalname下拉框中输入UpdateInterval(显示间隔),Type选择Long,Implementation选择MemberVariable。
向导将自动加入属性变量m_updateInterval和处理属性的成员函数。
用同样方法加入自定义属性IfDigitShape(显示方式),其类型为BOOL。
(6)程序员编程使用ActiveX控件时,与标准控件一样,可打开控件属性对话框设置ActiveX控件的属性。
ActiveX控件属性对话框包含多个属性页(propertypage)。
利用MFCActiveXControlWizard创建ActiveX控件时,已经提供了默认的属性页。
在创建的Clock控件中,除子默认的General属性页,还要加入Color属性页。
在ClockCtl.cpp中找到说明PropertyPages的宏,进行如下修改:
1.BEGIN_PROPPAGEIDS(CClockCtrl,
2)
//2表示共两个属性页
2.
PROPPAGEID(CClockPropPage:
guid)
PROPPAGEID(CLSID_CColorPropPage)
//颜色属性页码
4.END_PROPPAGEIDS(CClockCtrl)
BEGIN_PROPPAGEIDS(CClockCtrl,2)//2表示共两个属性页
PROPPAGEID(CClockPropPage:
guid)
PROPPAGEID(CLSID_CColorPropPage)//颜色属性页码
END_PROPPAGEIDS(CClockCtrl)
(7)为了使控件能够保存设置的属性,需向DoProExchange()函数添加如下代码。
DoPropExchange(CPropExchange*
pPX)
ExchangeVersion(pPX,
MAKELONG(_wVerMinor,
_wVerMajor));
DoPropExchange(pPX);
PX_Bool(pPX,"
IfDigitShape"
m_ifDigitShape,TRUE);
PX_Long(pPX,"
UpdateInterval"
m_updateInterval,1000);
Call
PX_
functions
for
each
persistent
custom
property.
9.}
DoPropExchange(CPropExchange*pPX)
ExchangeVersion(pPX,MAKELONG(_wVerMinor,_wVerMajor));
PX_Bool(pPX,"
PX_Long(pPX,"
CallPX_functionsforeachpersistentcustomproperty.
(8)在ClockCtl类的构造函数中添加代码,初始化控件大小。
1.CClockCtrl:
CClockCtrl()
InitializeIIDs(&
IID_DClock,
&
IID_DClockEvents);
//通知控件要用的IIDS的基类
SetInitialSize(150,120);
//设置控件在容器中第一次显示时的大小150*120
Initialize
control'
s
instance
data
here.
CClockCtrl()
InitializeIIDs(&
IID_DClock,&
//通知控件要用的IIDS的基类
SetInitialSize(150,120);
//设置控件在容器中第一次显示时的大小150*120
Initializeyourcontrol'
sinstancedatahere.
(9)OnDraw()函数用于绘制控件,即显示时间。
在OnDraw()函数中调用了一些数学函数,因此需在ClockCtl.cpp文件开始位置添加包含文件语句:
#include"
math.h"
。
以下是OnDraw()函数的完整代码。
OnDraw(CDC*
pdc,
const
CRect&
rcBounds,
rcInvalid)
Replace
following
with
own
drawing
code.
//pdc->
FillRect(rcBounds,
CBrush:
FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
Ellipse(rcBounds);
CRect
Rect;
GetClientRect(this->
m_hWnd,&
Rect);
int
nCenterX=Rect.right/2;
nCenterY=Rect.bottom/2;
10.
pdc->
SetTextColor(TranslateColor(GetForeColor()));
11.
SetBkMode(TRANSPARENT);
//将控件背景颜色设置为透明方式
12.
//建立一具刷子,该画刷的颜色为背景所设置的颜色
13.
CBrush*
pBrush=new
CBrush(TranslateColor(GetBackColor()));
14.
FillRect(&
Rect,pBrush);
15.
delete
pBrush;
16.
CFont*
pOldFont;
17.
pOldFont=SelectStockFont(pdc);
//选择库存字体
18.
CTime
Time=CTime:
GetCurrentTime();
//获取当前时间
19.
if(m_ifDigitShape)
//如果是数字时钟,在表盘中以电子表的方式显示当前时间
20.
{
21.
CString
CurrentTime=Time.Format("
%B:
%d:
%Y
%H:
%M:
%S"
);
22.
ExtTextOut(rcBounds.left,rcBounds.top,ETO_CLIPPED,rcBounds,CurrentTime,strlen(CurrentTime),NULL);
23.
}
24.
else
//模拟时钟的方式显示当前时间
25.
26.
strDigits;
27.
i,x,y;
28.
CSize
size;
29.
CPen
pen(PS_SOLID,5,RGB(0,0,255));
//创建一支蓝笔来绘制椭圆
30.
CPen*
pOldPen=pdc->
SelectObject(&
pen);
//将新笔选入设备描述表
31.
Ellipse(5,5,Rect.right-5,Rect.bottom-5);
//绘制时钟边界
32.
double
Radians;
33.
SetTextColor(RGB(255,0,0));
//时钟上的文字选择红色
34.
for(i=1;
i<
=12;
i++)
35.
36.
strDigits.Format("
%d"
i);
//对输出的时钟数字进行格式化
37.
//获得时钟数值的范围,以便计算中心
38.
size=pdc->
GetTextExtent(strDigits,strDigits.GetLength());
39.
Radians=(double)i*6.28/12.0;
//计算文本输出的位置
40.
x=nCenterX-(size.cx/2)+(int)((double)(nCenterX-20)*sin(Radians));
41.
y=nCenterY-(size.cy/2)+(int)((double)(nCenterY-20)*cos(Radians));
42.
TextOut(x,y,strDigits);
//显示钟表盘上的数字
43.
44.
Radians=(double)Time.GetHour()+(double)Time.GetMinute()/60.0
45.
+(double)Time.GetSecond()/3600.0;
//计算时针半径
46.
Radians*=6.28/12.0;
47.
HourPen(PS_SOLID,5,RGB(0,255,0));
//创建绘制时针的画笔
48.
HourPen);
//将该笔选入设备描述表
49.
MoveTo(nCenterX,nCenterY);
//绘制时针
50.
LineTo(nCenterX+(int)((double)(nCenterX/3)*sin(Radians)),
51.
nCenterY-(int)((double)(nCenterY/3)*cos(Radians)));
52.
53.
Radians=(double)Time.GetMinute()+(double)Time.GetSecond()/60.0;
//计算分针半径
54.
Radians*=6.28/60.0;
55.
MinutePen(PS_SOLID,3,RGB(255,255,0));
//创建绘制分针的画笔
56.
MinutePen);
//将该笔选设备描术述表
57.
//绘制分针
58.
LineTo(nCenterX+(int)((double)((nCenterX*2)/3)*sin(Radians)),
59.
nCenterY-(int)((double)((nCenterY*2)/3)*cos(Radians)));
60.
61.
Radians=(double)Time.GetSecond();
//计算秒针半径
62.
63.
SecondPen(PS_SOLID,1,RGB(0,255,255));
//创建绘制秒针的画笔
64.
SecondPen);
65.
//绘制秒针
66.
LineTo(nCenterX+(int)((double)((nCenterX*4)/5)*sin(Radians)),
67.
nCenterY-(int)((double)((nCenterY*4)/5)*cos(Radians)));
68.
SelectObject(pOldPen);
//恢复设备描述表中的旧笔
69.
70.}
OnDraw(CDC*pdc,constCRect&
rcBounds,constCRect&
rcInvalid)
Replacethefollowingcodewithyourowndrawingcode.
//pdc->
FillRect(rcBounds,CBrush:
CRectRect;
:
intnCenterX=Rect.right/2;
intnCenterY=Rect.bottom/2;
pdc->
//将控件背景颜色设置为透明方式
//建立一具刷子,该画刷的颜色为背景所设置的颜色
CBrush*pBrush=newCBrush(TranslateColor(GetBackColor()));
deletepBrush;
CFont*pOldFont;
pOl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 时钟 控件 鼠标 事件