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消息,定时器的精度为毫秒,但是精准度很低。
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;
}