Как я могу заставить CMFCButton выглядеть как стандартный флажок?

Стандартный чекбокс MFC CButton на цветном фоне выглядит так:

цветная окантовка флажка введите здесь описание изображения

Я хочу избавиться от серого поля, но не могу заставить его уйти. Независимо от того, как я устанавливаю размер элемента управления, он все равно появляется.

Изменение его на CMFCButton дает следующее:

unchecked проверено

Что хорошо, это избавляет от полей, за исключением того, что теперь нет галочки. Мне нужна эта галочка.

Есть ли способ получить чистый внешний вид с галочкой? У меня была мысль передать стандартный набор изображений в CMFCControl::SetImage(), но я не вижу, как их получить. Я знаю, что могу нарисовать все сам, но я стараюсь не изобретать велосипед.

Я знаю, что здесь, на SO, есть много похожих вопросов, но ни один из ответов, которые я нашел, не подходит. Самое близкое, что я нашел, было следующим: radio-butto/25551622#25551622">Раз и навсегда: как мне получить полностью прозрачный флажок, кнопку, переключатель и т.д. в Windows API, а не с черным фоном?; но первый ответ там очень загадочный, а второй — большой кусок кода, который кажется излишним.


person egrunin    schedule 29.02.2020    source источник
comment
Непонятно, какую проблему вы пытаетесь решить. Непонятно также, почему - хотя решение известно - предпочесть отказаться от него.   -  person IInspectable    schedule 29.02.2020
comment
Я хочу убрать серую рамку вокруг окна, не усложняя приложение. Я даже не уверен, что пример, который я привел, уместен.   -  person egrunin    schedule 29.02.2020
comment
Что для вас маржа? Это не то, что имеет четко определенное значение в оконном API. А что для вас значительная сложность? Или почему вы считаете, что реализация пользовательского элемента управления вообще усложнит ваше приложение? Учитывая все это, почему вы не спрашиваете, почему ваше решение (которое вам подходит) не отображает флажок? Разве это не настоящая проблема, которую вы пытаетесь решить?   -  person IInspectable    schedule 29.02.2020
comment
В вопросе упоминается серое поле и есть иллюстрация асимметричной серой области с трех сторон от флажка с белым отступом. Что касается сложности, код, на который я ссылался (который может работать или не работать), использует 35 строк кода для решения концептуально тривиальной проблемы; и подобные проблемы часто решаются путем изменения одного или двух параметров. Действительно, я не понимаю, почему SDK вообще дает показанный результат, а я программирую Windows с версии 2.0.   -  person egrunin    schedule 05.03.2020
comment
На самом деле я вообще не нахожу первый ответ загадочным, поскольку все эти функции должным образом задокументированы. Второй ответ действительно является излишним. В любом случае, вы решили проблему, или вам все еще нужен ответ?   -  person Constantine Georgiou    schedule 05.03.2020


Ответы (1)


Я нашел что-то простое, что сработало:

После добавления ON_WM_CTLCOLOR() к MESSAGE_MAP диалогового окна я добавил это в класс диалогового окна:

HBRUSH MyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    if (myCheckbox.m_hWnd == pWnd->m_hWnd) // myCheckbox is the problem control
    {
        pDC->SetBkMode(TRANSPARENT);
        hbr = reinterpret_cast<HBRUSH>(::GetStockObject(NULL_BRUSH));
    }

    return hbr;
}
person egrunin    schedule 05.03.2020