#c #winapi #window #gdi #dwm
Вопрос:
В моей программе у меня есть пользовательская оконная рамка, с помощью которой рамка расширяется DwmExtendFrameIntoClientArea
. Я поместил элемент управления кнопкой поверх рамки, проблема в том, что текст кнопки черный и прозрачный. Я пытаюсь использовать BufferedPaintXXX
функции, и я разделил кнопку на подклассы, чтобы попытаться сделать кнопку непрозрачной.
Я подключил WM_PAINT
обработчик, и это решение, которое я придумал:
if (msg == WM_PAINT)
{
PAINTSTRUCT ps;
if (BeginPaint(hWnd, amp;ps))
{
HDC bHdc;
HPAINTBUFFER buffer = BeginBufferedPaint(ps.hdc, amp;ps.rcPaint, BPBF_TOPDOWNDIB, NULL, amp;bHdc);
if (buffer)
{
SendMessageW(hWnd, WM_PRINTCLIENT, (WPARAM)bHdc, PRF_CLIENT | PRF_ERASEBKGND);
BufferedPaintMakeOpaque(buffer, NULL);
EndBufferedPaint(buffer, TRUE);
}
EndPaint(hWnd, amp;ps);
}
return 0;
}
Это работает, однако есть одна проблема: на кнопочном элементе управления больше нет анимации. Например, при наведении курсора на кнопку больше нет эффекта «затухания», который обычно имеет элемент управления, вместо этого состояние наведения указателя окрашивается, поэтому оно просто появляется. Я подозреваю, что это связано с WM_PRINTCLIENT
использованием.
Поэтому, чтобы вернуть приятную анимацию, я попробовал другой подход:
if (msg == WM_PAINT)
{
DefSubclassProc(hWnd, msg, wParam, lParam);
RECT rc;
GetClientRect(hWnd, amp;rc);
HDC dc = GetDC(hWnd), bHdc;
HPAINTBUFFER buffer = BeginBufferedPaint(dc, amp;rc, BPBF_TOPDOWNDIB, NULL, amp;bHdc);
BitBlt(bHdc, 0, 0, rc.right - rc.left, rc.bottom - rc.top, dc, 0, 0, SRCCOPY);
BufferedPaintMakeOpaque(buffer, NULL);
EndBufferedPaint(buffer, TRUE);
ReleaseDC(hWnd, dc);
return 0;
}
Это решение действительно работает, анимации появляются, однако, поскольку я звоню DefSubclassProc
, сначала на экран выводится элемент управления «кнопка». Затем моя буферизованная логика вступает во владение, затем рисует непрозрачную клиентскую область поверх текущей клиентской области элемента управления кнопкой. Проблема с этим заключается в том, что иногда возникает мерцание между полупрозрачным рисунком, выполняемым элементом управления кнопкой, а затем он немедленно перезаписывается буферизованными вызовами рисования.
Есть ли способ «установить» DC элемента управления на буферизованный HDC для рисования, чтобы мне не приходилось мерцать во время рисования и чтобы я мог сохранять анимацию кнопок? Или есть лучший способ подойти к этому?
Я знаю , что могу изменить цветовую клавишу с помощью SetLayeredWindowAttributes
, однако, я не хочу этого делать, а также я буду отображать изображения, и я не могу рисковать, чтобы случайные цвета стали прозрачными.
Комментарии:
2. Я просто пытаюсь использовать непрозрачную буферизованную живопись с помощью элемента управления кнопкой без потери анимации элемента управления.