本系列文章由@二货梦想家张程所写,转载请注明出处。

本文章链接http://blog.csdn.net/terence1212/article/details/44195831

作者:ZeeCoder 微博链接:http://weibo.com/zc463717263

我的邮箱:michealfloyd@126.com欢迎大家发邮件来和我交流编程心得

you are what you read!与大家共勉!

定时器的使用

(1)定时器事件

所谓定时器事件,顾名思义,即定时触发执行某个事件。在游戏编程中,我们经常借助它来实现简易动画。

在Windows API中提供了SetTimer这个函数来建立定时器,其原型为:

UINT SetTimer(
      HWND hWnd,              // handle of window for timer messages
      UINT nIDEvent,          // timer identifier
      UINT uElapse,           // time-out value
      TIMERPROC lpTimerFunc       // address of timer procedure
);

其中,hWnd是指向CWnd的指针,即处理Timer事件的窗口类;nIDEvent是定时器代号,即身份标志,这样在OnTimer()事件中,才能根据不同的定时器,来做不同的事件响应;uElapse是时间间隔;lpTimerFunc为相应的处理函数,如果不用响应函数处理WM_TIMER消息,则此参数应设为NULL。

在建立的定时器之后,如果程序要停用该定时器,这时候Window Api提供了killTimer函数来删除定时器。其原型为

BOOL KillTimer(
    HWND hWnd,      // handle of window that installed timer
    UINT uIDEvent     // timer identifier
);

(2)定时器使用示范

本笔记中要实现人物跑动的如下动画:



下面是代码部分:

1、全局变量声明

// Global Variables:
HINSTANCE hInst;// current instance
HBITMAP Walker[16] ;//声明人物跑动数组来存储各章人物位图
HDC mdc ,hdc ;//
int num;//用来记录当前显示的图号

2、 初始化函数

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   TCHAR filename[20] ;
   memset(filename , 0 ,sizeof(TCHAR)*20);
   int i ;
   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, _T("人物跑动"), WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   MoveWindow(hWnd , 10 ,10 ,600 ,450 ,true);
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   hdc = GetDC(hWnd);
   mdc = CreateCompatibleDC(hdc);

   //载入各个人物位图
   for ( i = 0 ; i <= 15 ;i++)
   {
       _stprintf_s(filename , TEXT("%d.bmp") , i);
       Walker[i] = (HBITMAP)LoadImage(NULL , filename , IMAGE_BITMAP , 121 ,129, LR_LOADFROMFILE);
   }

   num = 0 ;
   SetTimer(hWnd , 1, 100 , NULL);

   MyPaint(hdc) ;

   return TRUE;
}

3、自定义绘图程序

void MyPaint(HDC hdc)
{
    if (num > 15)
    {
        num = 0 ;
    }
    SelectObject(mdc , Walker[num]);
    BitBlt(hdc , 200 , 150 ,600 ,450 , mdc ,0 ,0 ,SRCCOPY);

    num ++;
}

4、运行上述代码之后就能看到人物跑动的动画了。

笔记二就到这里结束了。

end!

最新文章

  1. Python 资源大全中文版
  2. File system needs to be upgraded. You have version null and I want version 7
  3. Python之路-python(面向对象一)
  4. CSS强制中英文换行与不换行
  5. 电脑ip(本地ip和本机ip)
  6. SqlDataReader执行带输出参数存储过程 错误分析
  7. [Effective JavaScript 笔记]第44条:使用null原型以防止原型污染
  8. win7系统安装FAQ
  9. Windows上安装Yeoman
  10. lucene和egg项目的异同点
  11. Android中为窗口定义主题
  12. HDU--杭电--4502--吉哥系列故事——临时工计划--背包--01背包
  13. mybatis-generator自动生成代码插件使用详解
  14. Unicode编码范围
  15. 第九篇——Struts2的拦截器
  16. 【mysql】一个很小但很影响速度的地方
  17. 基于spring boot的定时器
  18. java读取大容量excel之一
  19. 不规则ROI的提取
  20. Struct2笔记②--完善登陆代码

热门文章

  1. Cassandra Secondary Index 介绍
  2. Hazelcast源码剖析之Eviction
  3. Dynamics CRM2016 Web API之删除
  4. Java程序员的必备知识-类加载机制详解
  5. 【java集合框架源码剖析系列】java源码剖析之TreeSet
  6. StringBuffer与StringBuilder详解
  7. 5个你不知道的HTML5的接口
  8. ORACLE数据库 DBA常用知识
  9. 海量数据挖掘MMDS week7: 局部敏感哈希LSH(进阶)
  10. 多进程log4cxx区分日志