我们一般用到settimer函数的时候,第三个参数一般都设置为NULL,这意味着调用缺省的回调函数,叫OnTimer,如果你有几个定时器的话,那么也可以在OnTimer函数里边判断后做出不同的反应。
但今天我们自己编写回调函数来响应定时器的函数!
1.首先我们需要编写两个静态的回调函数,放在主对话框类中,声明如下:
public: static void CALLBACK timeup1(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime); static void CALLBACK timeup2(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime);
2.这是一个静态函数,所以在这个函数里边不能出现Dlg对象,只能出现指针,所以我们只能在这个函数中,声明一个对话框指针,然后通过AfxGetMainWnd()获取到对话框的指针,这样才能在这个函数中运用到相关的功能及其变量!
void CMyDlg::timeup1(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) { pWnd = (CMyDlg*) AfxGetMainWnd(); m_npicNum1++; CClientDC dc(pWnd); if ( m_npicNum1 == 4) { //pWnd->KillTimer(nIDEvent); //return ; m_npicNum1 = -1; } pWnd->mdc->SelectObject(pWnd->bitmap[m_npicNum1]); dc.BitBlt(0,0,rect1.right,rect1.bottom,pWnd->mdc,0,0,SRCCOPY); } void CMyDlg::timeup2(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) { pWnd = (CMyDlg*) AfxGetMainWnd(); m_npicNum2++; CClientDC dc(pWnd); if ( m_npicNum2 == 4) { m_npicNum2 = -1; } pWnd->mdc->SelectObject(pWnd->bitmap[m_npicNum2]); dc.BitBlt(0,300,rect1.right,rect1.bottom,pWnd->mdc,0,0,SRCCOPY); }
注意该函数里边出现的m_npicNum1,m_npicNum2,rect1都是全局变量!
3.在OnInitialDlg中我们添加如下代码:
char ch[7]; for (int i=1;i<=4;i++) { sprintf(ch,"%d.bmp",i);//取得图文件的文件字符串 bitmap[i-1] = new CBitmap; //建立每个CBitmap对象 bitmap[i-1]->m_hObject = (HBITMAP)::LoadImage(NULL,ch,IMAGE_BITMAP,594,177,LR_LOADFROMFILE);//加载图文件 if ( bitmap[i-1]->m_hObject == NULL) { AfxMessageBox("error"); } } GetClientRect(&rect1); CClientDC dc(this); mdc->CreateCompatibleDC(&dc); SetTimer(1,1000,timeup1);//建立定时器 SetTimer(2,2000,timeup2);
4.为了保持屏幕上始终有图像显示。我们在OnPaint函数中也重绘一下(不是必要的!但是里边的CClinent dc(this)这句很关键,如果删除将看不到效果!)
void CMyDlg::OnPaint() { CPaintDC dc(this); // device context for painting if( m_npicNum1 != -1 && m_npicNum1 < 4) mdc->SelectObject(bitmap[m_npicNum1]); dc.BitBlt(0,0,rect1.right,rect1.bottom,mdc,0,0,SRCCOPY); if( m_npicNum2 != -1 && m_npicNum2 < 4) mdc->SelectObject(bitmap[m_npicNum2]); dc.BitBlt(0,300,rect1.right,rect1.bottom,mdc,0,0,SRCCOPY); }
效果图:
圆圈不断循环运动!
发表评论
-
截图代码
2015-02-11 19:47 0#include "utility.h" ... -
vc---工程打不开问题解决(转载)
2012-07-07 15:03 2173在vc编程中,经常遇到dsw工程文件无法打开,或者打 ... -
图像编程----如何实现一个透空图片
2011-09-22 16:45 811在mfc中,我们经常碰到的一个情况是,想在界面上添加一个 ... -
MFC类中常用到的一些动态数组
2011-08-12 22:29 0在MFC中,我们经常会碰到保存元素之类的问题,一般用固定的 ... -
堆排序算法实现
2011-08-11 16:57 9241.堆排序. 平均复杂度,最坏复杂度都是nlogn #inc ... -
网络基础
2011-08-11 16:57 0本帖子将介绍如何使用vc6.0进行网络套接字的编程,包括 ... -
句柄,指针,窗口ID之间的互相转换
2011-08-09 10:54 0VC中窗口ID,句柄,指针三者相互转换函数 ID--H ... -
动态链接库
2011-08-08 22:32 0动态链接库,简称DLL,它不是独立运行的程序,只能由其他程 ... -
多线程编程
2011-08-08 19:59 0多线程相关的编程,有很多说法,有人说应该去除,因为他带了 ... -
在用VC6.0写程序调试时,初学者总是会遇到一些错误,针对如下错误主要是因为MFC类库没有引用所出现的问题。
2011-08-08 16:42 1648在用VC6.0写程序调试时,初学者总是会遇到一些错误,针对如下 ... -
多线程编程
2011-08-08 19:59 827多线程相关的编程,有很多说法,有人说应该去除,因为他带 ... -
图标编程(待续)
2011-08-08 15:00 01.动态更改图标ICON 其实很简单 (1)首先我们加载一 ... -
光标编程
2011-08-08 14:47 01.设置光标 我们一般 ... -
键盘实例
2011-08-08 11:03 01.如何防止对话框按下Enter键自动退出 (1)截取消息B ... -
图像编程
2011-08-06 12:20 0涉及图像编程其实很简单,就是要注意双缓冲问题,双缓冲的问题 ... -
图像编程
2011-08-06 12:09 0涉及图像编程其实很简单,就是要注意双缓冲问题,双缓冲的问题 ... -
图形编程
2011-08-06 10:20 0以前一直有个误会,觉得画图形和画图像是一样的,需要双缓冲, ... -
文件相关的编程
2011-08-04 17:04 0从今天开始,我们来开始涉及一些文件方面的编程,也是对它做一个 ... -
控件的扩展使用方法
2011-08-04 13:28 01.动态创建控件 (1) ... -
控件编程
2011-08-04 10:46 01.具有随机图片背景的Ed ...
相关推荐
怎么往SetTimer的回调函数传递参数
定时器事件的响应函数,即 VOID CALLBACK TimerProc() 不是由用户程序自己调用的,而是根据时钟事件借由操作系统内核调用的;那么,如何利用这些形式参数,传递程序逻辑处理所需要的参数呢?本文给出一个解决方案,...
SetTimer函数的用法,很实用看看就知道了。
线程内使用SetTimer实现定时器 代码中MyThreadTimer时线程定时器的实现
C# SetTimer() KillTimer() 演示 调用系统user32进行计时并输出,时长为1秒。10秒钟后自动停止。
VC++定时器,比SetTimer更精确
下面的代码实现每1/10秒在屏幕上输出字符'a',在vc6与vs2008下调试通过。在vc6下直接可以运行,05或08下按照注释的地方改下就可以了
MFC中的OnTimer()函数用于实现定时控制功能,定时控制功能主要由下面三个函数共同实现: SetTimer, KillTimer()和OnTimer(). 简单的说,Settimer是设置一个计时器,当Settimer设置的时间到了,就会自动执行Ontimer中...
vc++2005定时器settimer()的使用 查了一些资料,写了个简单的程序
在MFC中 使用settimer函数实现定时功能 本程序运用对话框间消息传递机制和回调函数两种方法实现
MFC 使用定时器的示例. 1,选择Dialog视图,右击选择“事件”. 2,选择“新建Windows消息/事件(N)”列表,添加WM_TIMER到右侧列表内。 3,cpp会自动生成 ...4,使用SetTimer启动定时器. 5,使用KillTimer取消定时器.
WIN32控制台应用程序中使用定时器API函数:SetTimer、KillTimer。 附:有涉及回调函数、消息泵相关代码。
WIN32控制台应用程序中使用定时器API函数:SetTimer、KillTimer。 附:有涉及回调函数、消息泵相关代码。
C# SetTimer() KillTimer() 演示 调用系统user32进行计时并输出,时长为1秒。10秒钟后自动停止。 PS:网上没一个能用的源码,结果研究了半天才搞明白。 看到好多人说不能用,应该不会吧,我亲自写出来试过的。我的...
VC制作的定时器,计数器示例。 VC中没有现成的定时器控件,但是可以使用回调函数OnTimer()响应SetTimer()函数来完成定时、计数功能。
linux下多线程udp网络编程实现消息驱动多状态机流转,在之前“linux下多线程udp网络编程实现消息驱动多状态机流转3”的基础上增加了对状态机流转过程中,消息接受的定时控制,settimer。
这一份代码是实现MFC的窗口创建完成需要立刻对某些控件进行响应,以及如何使用SetTimer和KillTimer的例子。 因为在MFC的初始化函数中,窗口创建还没有完成不能对窗口上的控件进行初始化操作,这是需要调用OnCreate...
制作opengl动画的vc源码,程序结构也很清晰,是学习opengl难得的源码
学习计算机图形学的各位大侠们,如果你们还在为为找图形函数而烦恼,就请光顾这里吧
在MFC的API函数中使用SetTimer()函数设置定时器,设置系统间隔时间,在OnTimer()函数中实现响应定时器的程序。 2.2 透明贴图实现技术 绘制透明位图的关键就是创建一个“掩码”位图(mask bitmap),这个“掩码”位图...