WM_CTLCOLORBTN следует использовать с BS_OWNERDRAW .
То есть, только когда добавлено BS_OWNERDRAW
, WM_CTLCOLORBTN
сработает и кнопка может быть перерисована.
Но когда вы используете BS_OWNERDRAW
, ваш оригинальный стиль флажка будет заменен следующим образом.
check = CreateWindowEx(0,L"BUTTON",L"text", WS_CHILD | WS_VISIBLE | BS_CHECKBOX | BS_OWNERDRAW, 150, 100, 60, 20, hWnd, (HMENU)ID_CHECK, (HINSTANCE)GetWindowLong(hWnd, GWLP_HINSTANCE), NULL);
case WM_CTLCOLORBTN:
{
return (INT_PTR)CreateSolidBrush(RGB(0, 0, 0));
break;
}
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
if (pDIS->hwndItem == check)
{
SetTextColor(pDIS->hDC, RGB(255, 255, 255));
SetBkColor(pDIS->hDC, RGB(0, 0, 0));
WCHAR Text[99];
int len = SendMessage(check, WM_GETTEXT,
ARRAYSIZE(Text), (LPARAM)Text);
TextOut(pDIS->hDC, pDIS->rcItem.left, pDIS->rcItem.top, Text, len);
}
return TRUE;
}
Результаты отладки:
Вы обнаружите, что это отличается от того, что вы думаете.
Согласно MSDN, создает кнопку, нарисованную владельцем. Окно владельца
получает сообщение WM_DRAWITEM, когда визуальный аспект кнопки имеет
изменилось. Не комбинируйте стиль BS_OWNERDRAW с любой другой кнопкой
стили.
Итак, я предлагаю вам сделать это.
check = CreateWindowEx(0,L"BUTTON",L"text123", WS_CHILD | WS_VISIBLE | BS_CHECKBOX ,150, 100, 60, 20, hWnd, (HMENU)ID_CHECK, (HINSTANCE)GetWindowLong(hWnd, GWLP_HINSTANCE), NULL);
case WM_CTLCOLORSTATIC:
{
HDC hdc = (HDC)wParam;
HWND hWnd = (HWND)lParam;
if (hWnd == check)
{
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(255, 255, 255));
return (INT_PTR)CreateSolidBrush(RGB(0, 0, 0));
}
break;
}
При запуске WM_CTLCOLORSTATIC
цвета текста и фона отображаются самостоятельно.