Я пытаюсь нарисовать радиокнопку с прозрачным фоном, используя подклассную радиокнопку & 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: кнопка радио после сворачивания> показать снова
Задача ещё не решена.
Других решений пока нет …