【问题标题】:Why doesn't drawing onto the hdc immediately update the window?为什么在 hdc 上绘图不立即更新窗口?
【发布时间】:2019-02-23 21:39:38
【问题描述】:

根据this website,对BeginPaint返回的HDC进行的任何绘制操作都会立即显示在屏幕上。但是,以下代码打印的数字仅在调整窗口大小时更新:

int counter = 0;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            std::string s = std::to_string(counter).c_str();
            TextOutA(hdc, 0, 0, s.c_str(), s.length());
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_KEYDOWN:
        counter++;
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

即使连续发送 WM_PAINT 到窗口

RedrawWindow(hwndMain, 0, 0, RDW_INTERNALPAINT);

在 EndPaint 之后,数字仅在调整窗口大小时更新。如何在不手动调整窗口大小的情况下获取要更新的数字?

【问题讨论】:

  • 我们需要minimal reproducible example。也许我们会在哪里看到您的消息循环。如果你有的话。
  • 你在调用 InvalidateRect(hWnd, nullptr, FALSE);和更新窗口(hWnd); ?这就是通常触发 WM_PAINT 的方式。
  • 你知道你实际上已经收到了一条 WM_PAINT 消息吗?
  • According to the docs,除了RDW_INTERNALPAINT,您至少可以尝试 3 个标志。你这样做了吗,如果你这样做了,你得到了同样的结果吗?
  • WM_PAINT 仅在需要重新绘制窗口时触发。仅仅更新counter 变量是不够的,您必须明确地向窗口发出信号,然后重新绘制自身,以便它可以绘制新的counter 值。通常首选使用InvalidateRect(),因为它允许操作系统决定何时触发WM_PAINT。但是,如果需要,使用 UpdateWindow()RedrawWindow() 可以强制立即重新绘制。

标签: c++ windows winapi gdi


【解决方案1】:

使用不同的标志调用 RedrawWindow 解决了这个问题。 特别是RedrawWindow(hWnd, 0, 0, RDW_FRAME | RDW_INVALIDATE);counter++; 之后

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多