Win32 GDI和计时器问题

时间:2017-03-20 14:19:42

标签: winapi timer gdi

我正在尝试使用DrawText GDI函数每隔一秒钟实现闪烁文本,但我在设置和运行计时器时遇到问题。

这是我的代码:

   const int ID_Timer1 = 1;

    SetTimer(hWnd, ID_Timer1, 1000, NULL);

    ...
LRESULT CALLBACK Splash::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) {

    case WM_PAINT:
        if((timer%2)==0)
          m_pSplashWnd->OnPaint ( hWnd, true );
        else
          m_pSplashWnd->OnPaint ( hWnd, false);
        break;

    case WM_NCDESTROY:
        delete m_pSplashWnd;
        m_pSplashWnd = NULL;
        break;

    case WM_TIMER:

        switch (wParam)
        {

            case ID_Timer1:
            {
                timer++;

                InvalidateRect(hWnd, NULL, FALSE);
                UpdateWindow(hWnd);
                break;

            }

        }

    case WM_KEYDOWN:
    case WM_SYSKEYDOWN:
    case WM_LBUTTONDOWN:
    case WM_RBUTTONDOWN:
    case WM_MBUTTONDOWN:
    case WM_NCLBUTTONDOWN:
    case WM_NCRBUTTONDOWN:
    case WM_NCMBUTTONDOWN:
        m_pSplashWnd->HideSplashScreen();
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

我做错了什么?我已经尝试使用专用TimerProc代替WM_TIMER,但结果相同......

1 个答案:

答案 0 :(得分:1)

break;之前你错过了case WM_KEYDOWN:。在收到的第一个WM_TIMER上,你会掉下来并最终隐藏窗口,然后才有机会重新绘制。

case WM_TIMER:
    switch (wParam)
    {
        case ID_Timer1:
        {
            timer++;
            InvalidateRect(hWnd, NULL, FALSE);
            UpdateWindow(hWnd);
            break;
        }
    }
    break; // <-- add this!