两个方块的运动轨迹

#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) ;

上一篇:Windows 程序设计--(六)键盘


下一篇:windows编程,消息函数中拦截消息的问题