CTimer,对同一定时器,多次调用SetTimer

本文通过一个具体示例探讨了Windows消息处理中SetTimer函数的行为特性,特别是当同一个定时器被连续触发时的效果,并展示了如何通过代码实现这一过程。

1.结论

    对同一定时器,多次调用SetTimer,定时器会被重置。

2.验证

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	RECT rect;
	DWORD tick;
	static DWORD tick_s;
	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 在此添加任意绘图代码...
		GetClientRect(hWnd, &rect);
		tick_s = ::GetTickCount();
		DrawText(hdc, tmp_g, -1, &rect, DT_LEFT);	
		SetTimer(hWnd, 1, 3000, NULL);
		Sleep(1000);
		SetTimer(hWnd, 1, 3000, NULL);
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_TIMER:
		KillTimer(hWnd, 1);
		tick = GetTickCount();
		tmp_g.Format( _T("times:%ld"), tick - tick_s);
		//UpdateWindow(hWnd);
		InValidateRect( hWnd, NULL, TRUE ); //使用InvalidRect使窗口重绘

  结果会发现界面上显示的时间段为:4000毫秒


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值