winapi — Win32 C ++ Пользовательская роспись подкласса радиокнопки.

Я пытаюсь нарисовать радиокнопку с прозрачным фоном, используя подклассную радиокнопку & WM_PAINT. Я знаю, как это сделать, используя функцию TransparentBlt & внеэкранный (задний) буфер.

Моя проблема в том, что изначально радио-кнопка по умолчанию рисует какой-то текст & круг (см. изображение 1). Мое сообщение WM_PAINT состоит только из BeginPaint () и EndPaint (). Когда я сворачиваю окно и затем снова активирую окно, текст по умолчанию & круг заменяется черным квадратом, как и следовало ожидать (см. изображение 2).

Желтое окно также окрашивается аналогичным образом с использованием WM_PAINT.

Обе процедуры возвращают 1 для WM_ERASEBKGND и возвращают 0 для WM_PAINT, как требуется для пользовательского рисования & двойная буферизация.

Это нормальное поведение? Я нашел «исправление» с помощью WS_EX_TRANSPARENT, но я хотел бы сначала понять, почему радиопереключатель изначально окрашивается таким образом, чтобы определить, подходит ли мне это исправление.

Заранее спасибо.

Создание радиопереключателя:

MControlRect rect(0, 0, 100, 20);
unsigned long style = WS_CHILD | BS_AUTORADIOBUTTON;

if (isGroupStarter) {
style += WS_GROUP;
}

::HWND hWnd = _create(pControlParent, WC_BUTTON, style, rect);

::WNDPROC systemProc = (::WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC);
::SetWindowLong(hWnd, GWL_WNDPROC, (long)customRadiobuttonProcedure);
::SetWindowLong(hWnd, GWL_USERDATA, (long)systemProc);

::UpdateWindow(hWnd);

::ShowWindow(hWnd, SW_SHOW);

Процедура радиобаттона:

switch (msg) {

case WM_ERASEBKGND:
{

return 1;

break;
}

case WM_NCPAINT:
{

return 0;

break;
}

case WM_PAINT:
{::PAINTSTRUCT ps;
::HDC hdc = ::BeginPaint(hWnd, &ps);

::EndPaint(hWnd, &ps);

return 0;

break;
}
}::WNDPROC defaultWindowProc = (::WNDPROC)::GetWindowLong(hWnd, GWL_USERDATA);

return ::CallWindowProc(defaultWindowProc, hWnd, msg, wParam, lParam);

Изображение 1: начальная радиоперекрашенная кнопка

Изображение 2: кнопка радио после сворачивания> показать снова

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …