事件定时触发器 MFC(OnTimer,SetTimer,KillTimer)

本文介绍了在MFC中如何使用OnTimer、SetTimer和KillTimer来实现事件定时触发器。首先在头文件中声明OnTimer函数,然后在源文件中添加ON_WM_TIMER宏进行响应机制。通过SetTimer设置定时器,例如每分钟执行一次OnTimer函数。当条件满足时执行特定代码。最后,可以通过KillTimer关闭定时器,并控制相关按钮状态。

#include "afxcmn.h"

#include "afxwin.h"//有关于这些文件可以从网上下载

 

1.在头文件中  加  afx_msg void OnTimer(UINT_PTR  nIDEvent);nIDEvent:是触发器的名字,由SetTimer设置

2.源文件中 加 ON_WM_TIMER(&ReduceDB::OnTimer)//添加相应机制;ReduceDB是类名

3.先设置定时器 :在某个按钮下,写入这么一行 SetTimer(2,1000*60,NULL);//2:代表触发器ID为2,前面可能由0,,1等触发器

//1000*60:每隔一分钟系统执行一次跳转OnTimer函数响应消息(2.中的相应机制)

4.void  ReduceDB::OnTimer(UINT_PTR nIDEvent)//这个函数就会被每分钟执行一次

{

        if(nIDEvent==2)//如果是ID为2的触发器发来的信息

         {

                if( 条件成立!)

                     {。。。。。。。。代码}

        }

}

 

5.void  ReduceDB::OnBnClicker。。()

{

       KillTimer(2);//结束触发器2的生命

       ReduceTimer.EnableWindow(TRUE);//CButton     ReduceTimer(是按钮控制变量),将它设置可用

       ChoiceTimer.EnableWindow(FALSE);

}

 

 

首先,在 MFC 对话框项目中添加一个控件(如按钮)作为触发器,然后在类视图中右键单击对话框类,选择“添加类”,并创建一个自定义类,假设命名为 CAnimationDlg。 接下来,在 CAnimationDlg 类中添加以下代码: ```cpp #include <mmsystem.h> #pragma comment(lib, "winmm.lib") // 加载 winmm.lib 库 class CAnimationDlg : public CDialogEx { // ... private: CStatic m_AnimationCtrl; // 动画控件 CRect m_AnimationRect; // 动画控件所在矩形 UINT m_TimerID; // 定时器 ID int m_FrameIndex; // 当前帧索引 // 播放动画 void PlayAnimation() { // 加载动画 CAnimateCtrl animateCtrl; animateCtrl.Create(WS_CHILD | WS_VISIBLE | ACS_CENTER | ACS_TRANSPARENT, m_AnimationRect, this, 0); animateCtrl.Open(IDR_ANIMATION); // IDR_ANIMATION 为资源文件 ID // 播放动画 m_FrameIndex = 0; m_TimerID = SetTimer(1, 50, NULL); } // 停止动画 void StopAnimation() { KillTimer(m_TimerID); m_AnimationCtrl.ShowWindow(SW_HIDE); } protected: afx_msg void OnBnClickedButtonStart(); // 触发器按钮的点击事件 afx_msg void OnTimer(UINT_PTR nIDEvent); // 定时器事件 DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CAnimationDlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON_START, &CAnimationDlg::OnBnClickedButtonStart) ON_WM_TIMER() END_MESSAGE_MAP() void CAnimationDlg::OnBnClickedButtonStart() { m_AnimationCtrl.GetWindowRect(m_AnimationRect); ScreenToClient(m_AnimationRect); PlayAnimation(); } void CAnimationDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == m_TimerID) { // 显示下一帧 CAnimateCtrl animateCtrl; animateCtrl.Attach(m_AnimationCtrl.m_hWnd); animateCtrl.Draw(m_FrameIndex++); animateCtrl.Detach(); // 判断是否播放完毕 if (m_FrameIndex >= animateCtrl.GetFrameCount()) { StopAnimation(); } } CDialogEx::OnTimer(nIDEvent); } ``` 最后,在对话框的 OnInitDialog() 方法中添加以下代码: ```cpp BOOL CAnimationDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化动画控件 m_AnimationCtrl.SubclassDlgItem(IDC_STATIC_ANIMATION, this); m_AnimationCtrl.ModifyStyle(0, SS_CENTERIMAGE); m_AnimationCtrl.ShowWindow(SW_HIDE); return TRUE; } ``` 这样就可以在对话框中添加动画特效了。触发器按钮点击时,会播放动画;动画播放完成或手动停止时,动画控件会隐藏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值