本文由導學寶轉自:http://blog.csdn.net/zhmxy555/article/details/7343337
定時器的使用
定時器(Timer)對象可以每隔一段時間發出一個時間消息,程序一旦接收到此消息之後,便可以決定接下來要做哪些事情。這樣的一個特性剛好可以適合播放靜態的連續圖片,產生動畫的效果。下面來介紹如何建立與使用定時器。
<1>建立定時器
Windows API 的SetTimer()函數可爲窗口建立一個定時器,並說每隔一段時間就發出WM_TIMER消息,此函數的定義是
UINT_PTR SetTimer(
HWND hWnd, //接收定時器消息的窗口
UINT_PTR nIDEvent, //定時器代號
UINT uElapse, //時間間隔
TIMERPROC lpTimerFunc //處理相應函數
);
SetTimer()函數的第2個參數是定時器的代號,這個代號在同一個窗口中必須是唯一的,且值不爲0,第3個參數則是定時器發出WM_TIMER消息:第4個參則用於設定由系統調用處理WM_TIMER消息的相應函數,如果不用響應函數處理WM_TIMER消息,則此參數應設爲NULL。
下面是設定一個每隔0.5秒發出WM_TIMER消息的定時器的程序代碼。
SetTimer(1,500,NULL);
如果不使用響應函數來處理定時器的消息,那麼久必須在消息處理函數中定義處理消息的程序代碼。
<2>刪除定時器
定時器建立後,就會一直自動地按照定義設定的時間間隔發出WM_TIMER消息,如果要停用某個定時器,必須使用下面的這個函數:
BOOL KillTimer(int 定時器代號);
在大致瞭解了定時器的使用方法後,接下來將運用定時器使用預先準備得幾張人物連續擺動的位圖。產生的動畫效果,如下圖:
下面我們通過一個具體的實例來理解和運用定時器的使用。
- #include "stdafx.h"
- #include <stdio.h>
- //全局變量聲明
- HINSTANCE hInst;
- HBITMAP girl[7]; //聲明位圖數組用來儲存各張人物位圖
- HDC mdc,hdc; //聲明"hdc"爲全局變量,用來存儲窗口DC,這樣後面的程序進行動畫繪圖會比較方便
- int num; //"num"變量用來記錄目前顯示的圖號
- //全局函數的聲明
- ATOM MyRegisterClass(HINSTANCE hInstance);
- BOOL InitInstance(HINSTANCE, int);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- void MyPaint(HDC hdc);
- //**WinMain函數,程序入口點函數*********************************
- int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
- {
- MSG msg;
- MyRegisterClass(hInstance);
- //判斷
- if (!InitInstance (hInstance, nCmdShow))
- {
- return FALSE;
- }
- //消息循環
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
- //****設計一個窗口類,類似填空題,使用窗口結構體*************************
- ATOM MyRegisterClass(HINSTANCE hInstance)
- {
- WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = (WNDPROC)WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = hInstance;
- wcex.hIcon = NULL;
- wcex.hCursor = NULL;
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wcex.lpszMenuName = NULL;
- wcex.lpszClassName = "canvas";
- wcex.hIconSm = NULL;
- return RegisterClassEx(&wcex);
- }
- //****初始化函數************************************
- // 1.從文件加載位圖
- // 2.建立定時器
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
- char filename[20] = "";
- int i;
- hInst = hInstance;
- hWnd = CreateWindow("canvas", "動畫窗口" , 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<7;i++)
- {
- sprintf(filename,"girl%d.bmp",i);
- girl[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
- }
- num = 0; //設置初始的顯示圖號爲"0"
- SetTimer(hWnd,1,500,NULL); //建立定時器,間隔0.5秒發出消息
- MyPaint(hdc);
- return TRUE;
- }
- //****自定義繪圖函數*********************************
- // 按照圖號順序進行窗口貼圖
- void MyPaint(HDC hdc)
- {
- if(num == 7) //判斷是否超過最大圖號,若超過最大圖號“6”,則將顯示圖號重設爲"0"。
- num = 0;
- SelectObject(mdc,girl[num]);
- BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY); //以目前圖號進行窗口貼圖
- num++; //將“num”值加1,爲下一次要顯示的圖號
- }
- //****消息處理函數***********************************
- // 1.加入處理WM_TIMER消息
- // 2.在消息結束時刪除定時器
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- int i;
- switch (message)
- {
- case WM_TIMER: //時間消息
- MyPaint(hdc); //在消息循環中加入處理WM_TIMER消息,當接收到此消息時便調用MyPaint()函數進行窗口繪圖
- break;
- case WM_DESTROY: //窗口結束消息
- DeleteDC(mdc);
- ReleaseDC(hWnd,hdc);
- for(i=0;i<7;i++)
- DeleteObject(girl[i]);
- KillTimer(hWnd,1); //窗口結束時,刪除所建立的定時器
- PostQuitMessage(0);
- break;
- default: //其他消息
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
運行該段代碼,我們就可以看到可愛的娃娃動畫了。
筆記七到這裏就結束了。
本節源代碼請點擊這裏下載:【Visual C++】Code_Note_7
請大家繼續關注【Visual C++】遊戲開發筆記系列。
非常希望能與大家一起交流,共同學習和進步。
最後,謝謝大家的支持~~~
The end