`

图像编程----如何编写SetTimer的回调函数实现动画效果

 
阅读更多

    我们一般用到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);


}

 

效果图:



                                               圆圈不断循环运动!

  • 大小: 5.6 KB
  • 大小: 4.5 KB
分享到:
评论

相关推荐

    vc++ 风车 Windows编程实现风车

    在Windows编程中,可以通过SetTimer函数设置定时器,每隔一定时间触发一个事件,然后在响应这个事件的回调函数中更新风车的状态并重绘窗口。 在VC++环境中,项目通常会包含多个源文件(.cpp)和头文件(.h)。...

    自定义动画按钮(Button)的一个简单例子

    在VC++中,我们可以使用CWinApp::SetTimer()函数来设置定时器,然后在定时器回调函数中更新按钮的状态并调用Invalidate()强制重绘。例如,我们可以设计一个简单的颜色过渡动画,随着时间的推移逐渐改变按钮背景色。 ...

    VC++ 2005中图像渐现渐隐的设计

    在VC++ 2005中实现图像的渐现渐隐效果是一项常见的视觉效果处理,主要涉及图形用户界面(GUI)编程和动画技术。这个设计适用于各种应用,如媒体播放器、图片查看器或者任何需要动态展示图像变化的场景。在本文中,...

    基于VisualC++环境下的帧动画作品,绝对经典

    VC++的`SetTimer`函数可以设置定时器,当定时器触发时,调用相应的回调函数,更新下一帧图像。 4. **消息循环**:VC++程序中的消息循环是处理用户输入和系统事件的关键。在帧动画中,消息循环会不断检查并处理新...

    使用DIB制作动画按钮

    - **更新显示**: 在定时器回调函数中,根据帧计数器选择不同的DIB并绘制到按钮上。 4. 绘制DIB到按钮 - **位图选入设备上下文**: 使用SelectObject函数将DIB的HBITMAP选入窗口的设备上下文(DC)。 - **绘制**: ...

    Winsdows游戏编程之旅(七)

    在定时器的回调函数中,我们可以更新当前显示的图片编号,并确保在播放完最后一张图片后能重新回到第一张,从而实现循环播放。 为了优化性能,避免不必要的内存消耗,我们可以使用图像数组来存储图片资源,根据当前...

    计算机图形学 visual c++ 6.0 实时动画(有注释).zip

    在C++中,可以使用`SetTimer`函数创建一个定时器,然后在响应定时器消息的回调函数中更新动画状态。 5. **矩阵和向量运算**:在计算机图形学中,矩阵和向量是描述图形变换和位置的关键工具。通过矩阵可以实现平移、...

    CPictureEx显示gif动画(mfc dialog)

    你可以设置一个定时器,然后在定时器回调函数中更新控件: ```cpp SetTimer(IDC_TIMER, 100, NULL); // IDC_TIMER 是定时器ID,100是间隔毫秒数 ``` 然后在`OnTimer`函数中处理动画更新: ```cpp void CMyDlg::...

    VC++源码—状态栏动画

    此外,可能使用`SetTimer`函数来设置定时器,周期性地更新状态栏的内容或外观,从而实现动画效果。 2. **GDI(Graphics Device Interface)**:在Windows API中,GDI是用于图形绘制的基础,包括线条、矩形、文本等...

    pse.rar_界面编程

    计时器的事件处理通常涉及设置定时器的间隔时间,以及编写处理定时器事件的回调函数。在.NET框架中,我们可以使用System.Windows.Forms.Timer类,而在Win32 API中,则有SetTimer函数来创建和管理计时器。 综合以上...

    VC 实现窗体背景图片的渐变变化一例.rar

    在定时器回调函数中,我们可以调整阿尔法值并调用`InvalidateRect`来标记窗体需要重绘。 在代码实现上,可能需要创建一个新的C++类,继承自MFC的CWnd或CDialog,这样可以方便地重写OnPaint函数以处理自定义的绘画...

    MFC仪表编程

    要创建一个定时器,我们通常会使用CWinApp::SetTimer函数,设置定时器ID、间隔时间和回调函数。 接着,我们来讨论双缓冲技术。在图形绘制中,未使用双缓冲时,每次绘图操作都会立即反映到屏幕上,这可能导致屏幕...

    (VC++源代码)类似安装程序的渐变背景

    Windows API提供SetTimer函数,可以设置定时器回调函数,每当定时器触发,就更新一次背景图像。通过调整定时器的间隔,可以控制动画的流畅度和速度。 5. **源代码解析**: "GradualChange"这个文件很可能是实现...

    实现位图的淡入淡出显示

    定时器回调函数`OnTimer()`负责更新Alpha值并重绘位图。记得在完成淡入淡出后关闭定时器,防止不必要的资源消耗。 6. **优化与注意事项**:为了提高性能,可以在不需淡入淡出时先将位图转换为设备相关的位图(DDB)...

    gdiplus demo

    - 定时器回调函数,更新图形状态并调用`InvalidateRect`触发窗口重绘。 文件列表中的“gdiplus demo”可能是源代码文件,包含C++代码示例,展示如何利用GDI+进行动画编程。为了深入了解这个项目,你需要打开源代码...

    VC6.0下编译的OpenGL_ES 旋转三角形Demo

    - 定时器回调函数:当定时器触发时,这个函数会被调用,更新渲染状态并请求重绘窗口。 - 处理键盘或鼠标事件:可能包含了控制三角形旋转速度或其他交互方式的逻辑。 通过分析和理解这个Demo,你不仅可以学习到...

    用vc实现的闪烁的指示灯

    3. **闪烁效果**:为了实现闪烁,我们需要设置一个定时器(`SetTimer()`函数),在定时器回调函数(`OnTimer()`)中改变指示灯的状态,比如颜色或透明度。通过反复切换状态,就能模拟出闪烁的效果。 4. **动画更新*...

    利用API制作水波特效

    在回调函数中,我们调用上述的绘图函数,将更新后的水波状态绘制到屏幕上。为了增加真实感,还可以考虑光照、透明度等视觉因素,这可能需要用到`SetPixel`或`SetPixelV`等API来调整每个像素的颜色。 易语言虽然自带...

    微信打飞机 Win32 Api 实现

    接着,通过`RegisterClassEx`注册窗口类,设置窗口的图标、背景色、回调函数等信息。 2. **消息循环与事件处理** 微信打飞机游戏需要响应用户的输入,如鼠标点击、键盘按键等。Win32 API中的消息队列和消息循环...

    简单的WIN32弹球游戏

    4. **定时器和动画**:为了实现弹球的连续运动,开发者通常会使用SetTimer函数来设定周期性事件,然后在对应的定时器回调函数中更新弹球的位置并重绘画面,从而创建出平滑的动画效果。 5. **碰撞检测**:游戏的关键...

Global site tag (gtag.js) - Google Analytics