c++ - WM_PAINT 与 PROGRESS_CLASS

标签 c++ windows winapi wm-paint

我正在创建 Win32 控件:

m_progress = CreateWindowExW(0, PROGRESS_CLASSW, L"ProgressBar", WS_VISIBLE | WS_CHILD | WS_TABSTOP, 153, 339, 135, 33, m_window, (HMENU)0, m_instance, 0);
SendMessageW(m_progress, WM_SETFONT, (WPARAM)m_fontBold, TRUE);
SendMessageW(m_progress, PBM_SETRANGE, 0, MAKELPARAM(0, 100));

它可以工作,但我还想在上面绘制带有百分比的文本 所以我像这样子类化了进度控制:

m_progressPrevProc = (WNDPROC)SetWindowLongPtrW(m_progress, GWLP_WNDPROC, (LONG_PTR)ProgressMsgProcessor);
...
static LRESULT CALLBACK ProgressMsgProcessor(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    if (msg == WM_PAINT)
    {
        PAINTSTRUCT ps;
        RECT rc = { 5, 5, 135, 33 };
        //HDC hdc = BeginPaint(hwnd, &ps);
        //SelectObject(hdc, g_App.m_fontBold);
        //DrawTextA(hdc, "100 %", -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        //EndPaint(hwnd, &ps);
    }

    return CallWindowProcW((WNDPROC)PrevWndProcProzess, hwnd, msg, wparam, lparam);
}

但如果至少取消注释“HDC hdc = BeginPaint(hwnd, &ps);”然后出现文本,但默认控件完全消失(就像没有绘制一样) 我怎样才能修复它以显示带有文本的默认窗口控件,因为我不需要绘制自定义控件,只需添加覆盖文本? 谢谢

最佳答案

这里的问题是您使用 BeginPaintEndPaint 调用清除了更新区域,因此进度条认为它不必绘制任何东西。 WM_PAINT 工作方式的一个弱点是您不能以这种方式在现有控件上绘制。相反,你必须做这样的事情:

static LRESULT CALLBACK ProgressMsgProcessor(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    if (msg == WM_PAINT)
    {
        // Paint the control first
        CallWindowProcW ((WNDPROC)PrevWndProcProzess, hwnd, msg, wparam, lparam);

        // Then draw over it
        HDC hDC = GetDC (hwnd);
        HFONT hOldFont = (HFONT) SelectObject(hDC, g_App.m_fontBold);

        // Draw your own stuff into hDC

        SelectObject (hDC, hOldFont);
        ReleaseDC (hwnd, hDC);
        return 0;
    }

    return CallWindowProcW ((WNDPROC)PrevWndProcProgress, hwnd, msg, wparam, lparam);
}

其他说明:

  • 您发布的代码是在控制下绘制的,而不是在它之上(!)。我的代码解决了这个问题。
  • 如果您选择并反对一个 DC,您应该在完成后选择旧的。同样,我的代码展示了如何执行此操作。

关于c++ - WM_PAINT 与 PROGRESS_CLASS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50623686/

相关文章:

c# - Unity插件:编码(marshal)C++ double *将C#中的数组翻倍

c++ - 如何检查类型是否属于给定的模板类型

c - 如何在 WM_KEYDOWN 中吃 key

c++ - 开发一个应用程序以重启另一个应用程序

c - SetWindowLongPtr 返回 ERROR_ACCESS_DENIED

c++ - 显示前测试 QToolTip 是否被遮挡

c++ - 如何记录基于 Qt 的源代码

c++ - 使用 GetModuleHandle 获取指向 IMAGE_DOS_HEADER 的指针?

linux - 升级到 Bind 9.12 后 Windows 客户端损坏

windows - 如何将依赖walker输出到控制台?