我们一般用到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 2225在vc编程中,经常遇到dsw工程文件无法打开,或者打 ... -
图像编程----如何实现一个透空图片
2011-09-22 16:45 872在mfc中,我们经常碰到的一个情况是,想在界面上添加一个 ... -
MFC类中常用到的一些动态数组
2011-08-12 22:29 0在MFC中,我们经常会碰到保存元素之类的问题,一般用固定的 ... -
堆排序算法实现
2011-08-11 16:57 9771.堆排序. 平均复杂度,最坏复杂度都是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 1708在用VC6.0写程序调试时,初学者总是会遇到一些错误,针对如下 ... -
多线程编程
2011-08-08 19:59 856多线程相关的编程,有很多说法,有人说应该去除,因为他带 ... -
图标编程(待续)
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 ...
相关推荐
在Windows编程中,可以通过SetTimer函数设置定时器,每隔一定时间触发一个事件,然后在响应这个事件的回调函数中更新风车的状态并重绘窗口。 在VC++环境中,项目通常会包含多个源文件(.cpp)和头文件(.h)。...
在VC++中,我们可以使用CWinApp::SetTimer()函数来设置定时器,然后在定时器回调函数中更新按钮的状态并调用Invalidate()强制重绘。例如,我们可以设计一个简单的颜色过渡动画,随着时间的推移逐渐改变按钮背景色。 ...
在VC++ 2005中实现图像的渐现渐隐效果是一项常见的视觉效果处理,主要涉及图形用户界面(GUI)编程和动画技术。这个设计适用于各种应用,如媒体播放器、图片查看器或者任何需要动态展示图像变化的场景。在本文中,...
VC++的`SetTimer`函数可以设置定时器,当定时器触发时,调用相应的回调函数,更新下一帧图像。 4. **消息循环**:VC++程序中的消息循环是处理用户输入和系统事件的关键。在帧动画中,消息循环会不断检查并处理新...
- **更新显示**: 在定时器回调函数中,根据帧计数器选择不同的DIB并绘制到按钮上。 4. 绘制DIB到按钮 - **位图选入设备上下文**: 使用SelectObject函数将DIB的HBITMAP选入窗口的设备上下文(DC)。 - **绘制**: ...
在定时器的回调函数中,我们可以更新当前显示的图片编号,并确保在播放完最后一张图片后能重新回到第一张,从而实现循环播放。 为了优化性能,避免不必要的内存消耗,我们可以使用图像数组来存储图片资源,根据当前...
在C++中,可以使用`SetTimer`函数创建一个定时器,然后在响应定时器消息的回调函数中更新动画状态。 5. **矩阵和向量运算**:在计算机图形学中,矩阵和向量是描述图形变换和位置的关键工具。通过矩阵可以实现平移、...
你可以设置一个定时器,然后在定时器回调函数中更新控件: ```cpp SetTimer(IDC_TIMER, 100, NULL); // IDC_TIMER 是定时器ID,100是间隔毫秒数 ``` 然后在`OnTimer`函数中处理动画更新: ```cpp void CMyDlg::...
此外,可能使用`SetTimer`函数来设置定时器,周期性地更新状态栏的内容或外观,从而实现动画效果。 2. **GDI(Graphics Device Interface)**:在Windows API中,GDI是用于图形绘制的基础,包括线条、矩形、文本等...
计时器的事件处理通常涉及设置定时器的间隔时间,以及编写处理定时器事件的回调函数。在.NET框架中,我们可以使用System.Windows.Forms.Timer类,而在Win32 API中,则有SetTimer函数来创建和管理计时器。 综合以上...
在定时器回调函数中,我们可以调整阿尔法值并调用`InvalidateRect`来标记窗体需要重绘。 在代码实现上,可能需要创建一个新的C++类,继承自MFC的CWnd或CDialog,这样可以方便地重写OnPaint函数以处理自定义的绘画...
要创建一个定时器,我们通常会使用CWinApp::SetTimer函数,设置定时器ID、间隔时间和回调函数。 接着,我们来讨论双缓冲技术。在图形绘制中,未使用双缓冲时,每次绘图操作都会立即反映到屏幕上,这可能导致屏幕...
Windows API提供SetTimer函数,可以设置定时器回调函数,每当定时器触发,就更新一次背景图像。通过调整定时器的间隔,可以控制动画的流畅度和速度。 5. **源代码解析**: "GradualChange"这个文件很可能是实现...
定时器回调函数`OnTimer()`负责更新Alpha值并重绘位图。记得在完成淡入淡出后关闭定时器,防止不必要的资源消耗。 6. **优化与注意事项**:为了提高性能,可以在不需淡入淡出时先将位图转换为设备相关的位图(DDB)...
- 定时器回调函数,更新图形状态并调用`InvalidateRect`触发窗口重绘。 文件列表中的“gdiplus demo”可能是源代码文件,包含C++代码示例,展示如何利用GDI+进行动画编程。为了深入了解这个项目,你需要打开源代码...
- 定时器回调函数:当定时器触发时,这个函数会被调用,更新渲染状态并请求重绘窗口。 - 处理键盘或鼠标事件:可能包含了控制三角形旋转速度或其他交互方式的逻辑。 通过分析和理解这个Demo,你不仅可以学习到...
3. **闪烁效果**:为了实现闪烁,我们需要设置一个定时器(`SetTimer()`函数),在定时器回调函数(`OnTimer()`)中改变指示灯的状态,比如颜色或透明度。通过反复切换状态,就能模拟出闪烁的效果。 4. **动画更新*...
在回调函数中,我们调用上述的绘图函数,将更新后的水波状态绘制到屏幕上。为了增加真实感,还可以考虑光照、透明度等视觉因素,这可能需要用到`SetPixel`或`SetPixelV`等API来调整每个像素的颜色。 易语言虽然自带...
接着,通过`RegisterClassEx`注册窗口类,设置窗口的图标、背景色、回调函数等信息。 2. **消息循环与事件处理** 微信打飞机游戏需要响应用户的输入,如鼠标点击、键盘按键等。Win32 API中的消息队列和消息循环...
4. **定时器和动画**:为了实现弹球的连续运动,开发者通常会使用SetTimer函数来设定周期性事件,然后在对应的定时器回调函数中更新弹球的位置并重绘画面,从而创建出平滑的动画效果。 5. **碰撞检测**:游戏的关键...