【问题标题】:Win32 GDI and timer issueWin32 GDI 和计时器问题
【发布时间】:2017-03-20 14:19:42
【问题描述】:

我正在尝试使用 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,但结果相同......

【问题讨论】:

  • 我当然声明了 const int ID_TIMER1 = 1;静态长定时器 = 0L;
  • 但你不是每秒都得到WM_PAINT,因为得到它你需要在WM_TIMER上调用例如InvalidateRect
  • 这是我的 wndProc,(RbMm thx 的建议)我修改但仍然没有开始工作,这是预期的
  • 糟糕,无法添加为评论

标签: winapi timer gdi


【解决方案1】:

您在case WM_KEYDOWN: 之前缺少break;。在收到第一个WM_TIMER 时,您跌倒并最终隐藏了窗口,然后才有机会重新绘制。

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

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 2012-12-13
    • 2021-08-03
    • 2023-03-28
    • 2011-09-03
    • 2010-09-20
    • 2010-09-26
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多