#include <windows.h>
#define TIMER_SEC 1
#define TIMER_MIN 2
LRESULT CALLBACK MyWNDPROC(HWND hWnd,UINT meseage,WPARAM wParam,LPARAM lParam);
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASSEX ex;
HWND hWnd;
MSG msg;
//1.设计窗口
ex.style = CS_HREDRAW | CS_VREDRAW;
ex.cbSize = sizeof(ex);
ex.cbClsExtra = 0;
ex.cbWndExtra = 0;
ex.hInstance = hInstance;
ex.hIcon = NULL;
ex.hCursor = NULL;
ex.hbrBackground = CreateSolidBrush(RGB(0,255,0));
ex.hIconSm = NULL;
ex.lpfnWndProc = &MyWNDPROC;
ex.lpszMenuName = NULL;
ex.lpszClassName = "aaa";
//2.注册窗口
RegisterClassEx(&ex);
//3.创建窗口
hWnd = CreateWindow(ex.lpszClassName,"当然选择原谅他",WS_OVERLAPPEDWINDOW,50,50,500,500,NULL,NULL,hInstance,NULL);
//4.显示窗口
ShowWindow(hWnd,SW_SHOW);
SetTimer(hWnd,TIMER_SEC,500,NULL); //第4个参数为定时器消息的处理函数,如果为NULL,则由第1个参数指定的窗口的消息处理函数来处理
SetTimer(hWnd,TIMER_MIN,1000,NULL);
//消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK MyWNDPROC(HWND hwnd,UINT meseage,WPARAM wPAREAM,LPARAM lParam)
{
static int n = 10;
static int m = 10;
HDC hdc1;
HDC hdc2;
switch(meseage)
{
case WM_CLOSE:
PostQuitMessage(0);
break;
case WM_KEYDOWN:
if(wPAREAM == 65) //停止计时器1 a键
{
KillTimer (hwnd, 1);
}
else if(wPAREAM == 66) //停止计时器2 b键
{
KillTimer (hwnd, 2);
}
else if(wPAREAM == 67) //启动计时器1 c键
{
SetTimer(hwnd,TIMER_SEC,500,NULL);
}
else if(wPAREAM == 68) //启动计时器2 d键
{
SetTimer(hwnd,TIMER_MIN,1000,NULL);
}
break;
case WM_TIMER:
if(wPAREAM == 1)
{
hdc1 = GetDC(hwnd);
Rectangle(hdc1,10 + n,10,30 + n,30);
ReleaseDC(hwnd,hdc1);
n = n + 10;
}
else
{
hdc2 = GetDC(hwnd);
Rectangle(hdc2,10 + m,50,30 + m,70);
ReleaseDC(hwnd,hdc2);
m = m + 10;
}
break;
}
return DefWindowProc(hwnd,meseage,wPAREAM,lParam);
}
方法一
这是最方便的一种方法,它让Windows把WM_TIMER消息发送到应用程序的正常窗口消息处理程序中,SetTimer呼叫如下所示:
SetTimer (hwnd, 1, uiMsecInterval, NULL) ;
第一个参数是其窗口消息处理程序将接收WM_TIMER消息的窗口句柄。第二个参数是定时器ID,它是一个非0数值,在整个例子中假定为1。第三个参数是一个32位无正负号整数,以毫秒为单位指定一个时间间隔,一个60,000的值将使Windows每分钟发送一次WM_TIMER消息。
您可以通过呼叫
KillTimer (hwnd, 1) ;
在任何时刻停止WM_TIMER消息(即使正在处理WM_TIMER消息)。此函数的第二个参数是SetTimer呼叫中所用的同一个定时器ID。在终止程序之前,您应该响应WM_DESTROY消息停止任何活动的定时器。
当您的窗口消息处理程序收到一个WM_TIMER消息时,wParam参数等于定时器的ID值(上述情形为1),lParam参数为0。如果需要设定多个定时器,那么对每个定时器都使用不同的定时器ID。wParam的值将随传递到窗口消息处理程序的WM_TIMER消息的不同而不同。为了使程序更具有可读性,您可以使用#define叙述定义不同的定时器ID:
#define TIMER_SEC 1
#define TIMER_MIN 2
然后您可以使用两个SetTimer呼叫来设定两个定时器:
SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;
SetTimer (hwnd, TIMER_MIN, 60000, NULL) ;