With themed controls, you can change text colors with Custom Draw
Test in C++/Win32 with a RadioButton with ID = 12 by changing text color to red and keeping Button theme on Windows 10 :
case WM_NOTIFY:
{
LRESULT lResult = 0;
switch (((NMHDR*)lParam)->code)
{
case NM_CUSTOMDRAW:
{
if (12 == ((NMHDR*)lParam)->idFrom)
{
NMHDR* pnm = (LPNMHDR)lParam;
lResult = OnCustomDraw(((NMHDR*)lParam)->hwndFrom, (LPNMCUSTOMDRAW)pnm);
}
}
break;
default:
return FALSE;
}
return lResult;
}
break;
LRESULT OnCustomDraw(HWND hWnd, __inout NMCUSTOMDRAW* pNMCD)
{
LRESULT lResult = CDRF_DODEFAULT;
switch (pNMCD->dwDrawStage)
{
case CDDS_PREPAINT:
{
SetBkMode(pNMCD->hdc, TRANSPARENT);
SetTextColor(pNMCD->hdc, RGB(255, 0, 0));
SIZE sizeCheckBox;
HTHEME hTheme = OpenThemeData(NULL, TEXT("Button"));
HRESULT hr = GetThemePartSize(hTheme, pNMCD->hdc, BP_CHECKBOX, CBS_UNCHECKEDNORMAL, NULL, TS_DRAW, &sizeCheckBox);
CloseThemeData(hTheme);
SIZE sizeExtent;
GetTextExtentPoint32(pNMCD->hdc, TEXT("0"), 1, &sizeExtent);
int nShift = sizeExtent.cx / 2;
RECT rc = pNMCD->rc;
OffsetRect(&rc, sizeCheckBox.cx + nShift, 0);
WCHAR wszText[MAX_PATH];
GetWindowText(hWnd, wszText, MAX_PATH);
DrawText(pNMCD->hdc, wszText, -1, &rc, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS | DT_END_ELLIPSIS);
lResult = CDRF_SKIPDEFAULT;
}
break;
}
return lResult;
}