WM_PAINT с PROGRESS_CLASS - PullRequest
0 голосов
/ 31 мая 2018

Я создаю элемент управления 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);"затем появляется текст, но элемент управления по умолчанию полностью исчезает (как будто он не рисуется). Как я могу исправить это, чтобы показывать элемент управления по умолчанию для окон с текстом на нем, потому что мне не нужно рисовать пользовательский элемент управления, только добавить наложенный текст?Спасибо

1 Ответ

0 голосов
/ 31 мая 2018

Проблема в том, что вы очистили регион обновления с помощью вызовов BeginPaint и EndPaint, поэтому индикатор выполнения не считает, что он должен что-то рисовать.Слабость способа работы 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, вы должны выбрать старый обратно, когда закончите.Опять же, мой код показывает, как это сделать.
...