Я создаю элемент управления 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);" затем появляется текст, но элемент управления по умолчанию полностью исчезает (как будто он не нарисован). Как я могу исправить это, чтобы отображать элемент управления окнами по умолчанию с текстом на нем, потому что мне не нужно рисовать настраиваемый элемент управления, только добавить наложенный текст? Спасибо
BeginPaint()/EndPaint()
грязный регион проверенным, и повторный вызов вернет пустой регион. Правильный способ сделать это — сначала вызватьCallWindowProc
, чтобы позволить элементу управления выполнить отрисовку по умолчанию, а затем вызватьGetDC() / ReleaseDC()
, чтобы получить DC для рисования поверх. - person Jonathan Potter   schedule 31.05.2018