WIN32学习——定时器消息

来源:互联网 发布:网络ip地址冲突 编辑:程序博客网 时间:2024/06/05 15:11
 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 20HINSTANCE 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++;elsen_xPos--;if(n_yPos >= rt.bottom - 20)UP_DOWN = 0;else if (n_yPos <= rt.top){UP_DOWN = 1;}if(UP_DOWN)n_yPos++;elsen_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);}elsereturn 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 0
原创粉丝点击