WIN32学习——定时器消息

 1 定时器消息
    可以在程序中设置定时器,当到达时间间隔时,定时器会向窗口发送一个WM_TIMER消息,定时器的精度为毫秒,但是精准度很低。
  2 消息的参数
    WPARAM - 定时器ID
    LPARAM - 定时器处理函数的指针
  3 定时器的使用步骤
    a、创建定时器
      UINT SetTimer(
HWND hWnd, //定时器窗口句柄
UINT nIDEvent, //定时器ID
UINT uElapse, //时间间隔
TIMERPROC lpTimerFunc //定时器处理函数指针
      );创建成功,返回非0.
      说明:当lpTimerFunc设置为NULL时,使用窗口处理函数作为定时器处理函数,否则就使用定时器处理函数处理定时器消息
    b、消息处理 WM_TIMER
    c、关闭定时器
      BOOL KillTimer(
HWND hWnd, //定时器窗口句柄
UINT uIDEvent //定时器ID

      );

附加定时器消息学习代码:

/*
说明:
	窗口的实现
	对于WM_TIMER消息的学习
	在窗口绘制小球,并用定时器让小球运动起来,看小球的运行轨迹
*/

#include <Windows.h>
//圆的半径
#define REDIUS 20
HINSTANCE g_hInstance;
HANDLE g_hOutputHandle;
int n_xPos = 100,n_yPos = 100;

//表示从左到右,从上到下的方向
int LEFT_RIGHT = 1;
int UP_DOWN = 1;

void CALLBACK MyTimer(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
{
	TCHAR szText[256] = {0};
	wsprintf(szText,__TEXT("TIMER:%d\n"),idEvent);
	WriteConsole(g_hOutputHandle,szText,lstrlen(szText),NULL,NULL);
	//得到窗口的矩形区域
	RECT rt = {0};
	GetClientRect(hwnd,&rt);
	if(n_xPos >= rt.right - 20)
		LEFT_RIGHT = 0;
	else if (n_xPos <= rt.left)
	{
		LEFT_RIGHT = 1;
	}
	if(LEFT_RIGHT)
		n_xPos++;
	else
		n_xPos--;

	if(n_yPos >= rt.bottom - 20)
		UP_DOWN = 0;
	else if (n_yPos <= rt.top)
	{
		UP_DOWN = 1;
	}
	if(UP_DOWN)
		n_yPos++;
	else
		n_yPos--;
	InvalidateRect(hwnd,NULL,FALSE);
}

void OnTimer(WPARAM wParam)
{
	TCHAR szText[256] = {0};
	wsprintf(szText,__TEXT("WM_TIMER:%d\n"),wParam);
	WriteConsole(g_hOutputHandle,szText,lstrlen(szText),NULL,NULL);
}
void OnCreate(HWND hWnd)
{
	//设置定时器函数中的最后一个参数如果是NULL,则调用窗口处理函数处理WM_TIMER消息,非NULL则调用自己定义的定时器处理函数MyTimer。
	//SetTimer(hWnd,1,1000,NULL);
	SetTimer(hWnd,2,10,MyTimer);
}

void OnPaint(HWND hWnd)
{
	PAINTSTRUCT ps = {0};
	HDC hDC = BeginPaint(hWnd,&ps);
	Ellipse(hDC,n_xPos,n_yPos,n_xPos + REDIUS,n_yPos+REDIUS);
	EndPaint(hWnd,&ps);
}

LRESULT CALLBACK MyProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_TIMER:
		OnTimer(wParam);
		break;
	case WM_PAINT:
		OnPaint(hWnd);
		break;
	case WM_CREATE:
		OnCreate(hWnd);
		break;
	case WM_SYSCOMMAND:
		if (wParam == SC_CLOSE)
		{
			if(IDOK == MessageBox(hWnd,__TEXT("确定关闭窗口?"),__TEXT("提示"),MB_OKCANCEL))
			{
				PostQuitMessage(0);
			}
			else
				return 0;
		}
		break;
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

ATOM Register(LPCWSTR className)
{
	WNDCLASSEX wc = {0};
	wc.cbClsExtra = 0;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hIconSm = NULL;
	wc.hInstance = g_hInstance;
	wc.lpfnWndProc = MyProc;
	wc.lpszClassName = className;
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	return RegisterClassEx(&wc);
}

HWND Create(LPCWSTR className,LPCWSTR windowName)
{
	return CreateWindowEx(0,className,windowName,WS_OVERLAPPEDWINDOW,100,100,500,400,NULL,NULL,g_hInstance,NULL);
}

void Show(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}

void Message()
{
	MSG ms = {0};
	while (GetMessage(&ms,NULL,0,0))
	{
		TranslateMessage(&ms);
		DispatchMessage(&ms);
	}
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	AllocConsole();
	g_hOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
	g_hInstance = hInstance;
	Register(__TEXT("Main"));
	HWND hWnd = Create(__TEXT("Main"),__TEXT("This is test"));
	Show(hWnd);
	Message();
	return 0;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值