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

Единственный способ сделать это выводит класс CButton , который использует чертеж владельца. Там вы можете снять флажок с помощью системных функций. Для отмеченных ящиков заполните фон и нарисуйте стрелку вручную.

Это можно сделать для классических флажков, используя CDC :: DrawFrameControl , заполняя фон с помощью CDC :: FillSolidRect (используйте InflateRect (-2, -2) с размером флажка) и рисуя стрелку.

Но приложения в настоящее время не используют классический стиль. Затем вы должны использовать DrawThemeBackground , заполнить фон, используя CDC :: GradientFill , и нарисуйте также закрашенную стрелку. Но это не будет выглядеть точно так же, как флажки, снятые системой.

// Draw default sized check box. // Classic        Themed // // LLLLLLLLLLLLW  BBBBBBBBBBBBB // LGGGGGGGGGGSW  B           B // LG         SW  B           B // LG       K SW  B        G  B // LG      KK SW  B       GG  B // LG K   KKK SW  B  G  GGG  B // LG KK KKK  SW  B  GG GGG   B // LG KKKKK   SW  B  GGGGG    B // LG  KKK    SW  B   GGG     B // LG   K     SW  B    G      B // LSSSSSSSSSSSW  B           B // WWWWWWWWWWWWW  BBBBBBBBBBBBB //  // L = light gray, G = dark gray, S =very light gray, B/K = black, W = white // // rcBox:  Rect containing the check box // clrBk:  Background colour // clrArr: Colour for arrow (COLOR_BTNSHADOW if disabled; else COLOR_WINDOWTEXT) // save bk color; is changed by drawing functions int nBkClr = pDC->GetBkColor();  #if 1 // Add aditional states (inactive, pushed) as required pDC->DrawFrameControl(rcBox, DFC_BUTTON, DFCS_BUTTONCHECK); #else // Themed (set nThemedState accordingly): DrawThemeBackground(m_hTheme,      lpDrawItemStruct->hDC,      BP_CHECKBOX, nThemedState,      &rcBox, NULL); #endif  CRect rcBk(rcBox); // Use -3 when themed and CBS_UNCHECKEDHOT rcBk.InflateRect(-2, -2); #if 1 pDC->FillSolidRect(&rcBk, clrBk); #else // Themed: // Two triangles: upper left and lower right static GRADIENT_TRIANGLE TriG[2] = { { 0, 1, 3 }, { 0, 3, 2} }; #define GetR(rgb)   ((int)((rgb) & 0xFF)) // extract R/G/B values fro COLORREF #define GetG(rgb)   ((int)(((rgb) >> 8) & 0xFF)) #define GetB(rgb)   ((int)(((rgb) >> 16) & 0xFF)) #define Darken(a)   ((a) - ((a) >> 1)) // make R/G/B part darker #define Brighten(a) ((a) + ((0xFF - (a)) >> 1)) // make R/G/B part brighter #define Col16(c)    ((COLOR16)((c) << 8)) // convert R/G/B part to COLOR16 value #define Bright16(a) (Col16(Brighten(a))) TRIVERTEX TriV[4] = { {rc.left, rc.top, Col16(GetR(clr)), Col16(GetG(clr)), Col16(GetB(clr)), 0}, {rc.right, rc.top, Bright16(GetR(clr)), Bright16(GetG(clr)), Bright16(GetB(clr)), 0}, {rc.left, rc.bottom, Bright16(GetR(clr)), Bright16(GetG(clr)), Bright16(GetB(clr)), 0}, {rc.right, rc.bottom, 0xff00, 0xff00, 0xff00, 0} }; pDC->GradientFill(TriV, 4, TriG, 2, GRADIENT_FILL_TRIANGLE); #endif  // Themed: clrArr = RGB(76, 97, 152); // not shaded! CRect rcArr(rcBox.left + 3, // left start position     rcBox.top + 5, // top start position     rcBox.left + 4, // width 1 pixel     rcBox.top + 8); // height 3 pixels for (int i = 0; i < 7; i++)  {     pDC->FillSolidRect(&rcArr, clrArr);     rcArr.OffsetRect(1, (i < 2) ? 1 : -1); } pDC->SetBkColor(nBkClr); // restore bk color

Пожалуйста, войдите или зарегистрируйтесь чтобы ответить на этот вопрос.

Категории

Добро пожаловать на сайт DraftingCode Q&A, где вы можете задавать вопросы и получать ответы от других членов сообщества.

Похожие вопросы

0 голосов
0 ответов
0 голосов
0 ответов
0 голосов
0 ответов
спросил 31 Янв, 13 от merano в категории MFCVisualC
0 голосов
0 ответов
...