Mark Danniel Ответов: 1

Как установить задний цвет управления переключателем в MFC ?


Я использовал несколько переключателей в своем приложении MFC.Я хочу установить соответствующий задний цвет, когда я нажимаю или щелкаю относительный переключатель управления.

Я добавил сообщение WM_CTLCOLOR в свою программу.Вот код:
HBRUSH xxxDlg::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor)
{
      if(TRUE == ((CButton*)GetDlgItem(IDC_RADIO_INPUT_BUY))->GetCheck())
         {
            if(pWnd->GetDlgCtrlID() == IDC_RADIO_INPUT_BUY)
            {
              COLORREF backColor = RGB(0xFF,0x40,0x40);
              pDC->SetBkMode(TRANSPARENT);
              return CreateSolidBrush(backColor);
            }
         }
      else if(FALSE== ((CButton*)GetDlgItem(IDC_RADIO_INPUT_BUY))->GetCheck())
         {
            if(pWnd->GetDlgCtrlID() == IDC_RADIO_INPUT_BUY)
            {
              COLORREF backColor = RGB(0xFF,0xFF,0xFF);
              pDC->SetBkMode(TRANSPARENT);
              return CreateSolidBrush(backColor);
            }
         }
   
}


IDC_RADIO_INPUT_BUY-это идентификатор элемента управления переключателем.
После запуска моей программы MFC я обнаружил, что цвет переключателя backcolor не меняется при нажатии на него(выбранный или не выбранный).Так есть ли какие-то проблемы в моем коде?

Что я уже пробовал:

См. предыдущее описание проблемы.

1 Ответов

Рейтинг:
2

Jochen Arndt

Невозможно установить цвет фона флажков и переключателей для стандартных элементов управления Windows. Они нарисованы внутри системы.

Единственным решением было бы использовать элементы управления, нарисованные владельцем. Но это довольно сложно для проверки и радиомаркеров.

См. также мой ответ на аналогичный вопрос для флажков: Как изменить цвет фона флажка в MFC?[^].

Но рисование переключателей более сложное, потому что вы должны определить размеры круга и пули для заполнения цветом фона и рисования пули в том же стиле, что и система.

Некоторая информация, если вы все еще хотите это сделать:


  • Нарисуйте непроверенную кнопку, используя другие стили по мере необходимости (DrawThemeBackground соответственно. CDC:DrawFrameControl)
  • Получите прямую кишку кнопки
  • Уменьшите прямоугольник на 2 пикселя в каждом измерении, чтобы получить прямоугольник для фона
  • Особый случай: при наведении перчатка является активным, уменьшите прямоугольник на 4 пикселя
  • Заполните фон с помощью CDC::Ellipse с твердым пером и кистью, настроенными на цвет фона
  • Размер rect для пули это кнопка rect уменьшенная на 3 пикселя с тематическими приложениями или на 4 пикселя с классическими элементами управления
  • Результирующая ширина обычно составляет 13 с тематическими приложениями. Затем уменьшите левую позицию и увеличьте нижнюю позицию
  • Цвет есть COLOR_WINDOWTEXT (активный или COLOR_BTNSHADOW (отключено) для классического стиля
  • С тематическим использованием приложения GetThemeColor() чтобы получить цвет для BP_RADIOBUTTON, стиль кнопки, и TMT_FILLCOLORHINT
  • Нарисуйте пулю с помощью CDC::Ellipse с твердым пером и кистью, настроенными на цвет фона
Обратите внимание, что вышеописанное не рисует затененную / градиентную пулю с активными темами.