2013-06-26 5 views
0

Прошу прощения за неопределенность названия, но я не совсем уверен, как я хочу решить проблему. В принципе, у меня есть две группы кнопок. Когда пользователь выбирает кнопку из одной из групп, я хочу установить индикатор, выбранный этой группой. Так что либо прямоугольник, окружающий их (синим), либо окрашивающий фон (или фоновое изображение) позади группы. Конечный пользователь указал, что окружающий их прямоугольник будет приятным, так что это будет предпочтительным. Я попытался переопределить onCtlColor в групповом поле, но я не знаю, как ограничить раскраску только границей. Я знаю, что это абсолютно необходимо, чтобы быть самым дальним в z-порядке. Любой совет?MFC - установить фоновое изображение на элементе управления

Пример кода (я знаю, что это причиняет боль полноту коробки)

pDC->SetBkColor(GetSysColor(RGB(100,149,237))); 
CRect rect; 
testGb.GetClientRect(rect); 
CBrush brushBlue(RGB(0, 0, 255)); 
CBrush* pOldBrush = pDC->SelectObject(&brushBlue); 

pDC->Rectangle(rect); 
pDC->SelectObject(pOldBrush); 

ответ

0

я смог найти только способ изменить цвет фона Текст коробки группы:

EDIT Вы можете нарисовать все, что захотите, в поле Группы!

а) объявляет переменный-член CBrush m_br и создать цветную кисть с ней

б) замещает WindowProc для групповой коробки с ID = IDC_GROUPBOX:

LRESULT CTestMFCDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{ if (message == WM_CTLCOLORSTATIC) 
     if (::GetDlgCtrlID((HWND) lParam) == IDC_GROUPBOX) 
      return (LRESULT) m_br.GetSafeHandle(); 

    return CDialogEx::WindowProc(message, wParam, lParam); 
} 

LRESULT CTestMFCDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{ if (message == WM_CTLCOLORSTATIC) 
     if (::GetDlgCtrlID((HWND) lParam) == IDC_GROUPBOX) 
     { HWND hWnd = (HWND) lParam; 
      HDC hDC = (HDC) wParam; 
      RECT rc; 
      ::GetClientRect(hWnd, &rc); 
      HBRUSH hOldBrush = (HBRUSH) ::SelectObject(hDC, m_br); 
      ::Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); 
      ::SelectObject(hDC, hOldBrush); 
    //  return (LRESULT) m_br.GetSafeHandle(); 
     } 

    return CDialogEx::WindowProc(message, wParam, lParam); 
} 
0

Лучший код (по крайней мере, для меня):

void MyClass::OnPaint() 
{ 
CPaintDC dc(this); // device context for painting 
COLORREF highlightFillColor; 
CPen nPen, *pOldPen = NULL; 
CBrush nBrush, *pOldBrush = NULL; 
CRect rect; 
GetWindowRect(rect); 

ScreenToClient(rect); 
BmsMemDC memDc(&dc, &rect); 
memDc.SetBkMode(TRANSPARENT); 

//dc.Re 
highlightFillColor = RGB(0x99,0xB4,0xFF); 
nPen.CreatePen(PS_SOLID, 4, highlightFillColor); 
nBrush.CreateSolidBrush(GetSysColor(COLOR_3DFACE)); 

pOldPen = memDc.SelectObject(&nPen); 
pOldBrush = memDc.SelectObject(&nBrush); 

if(leftGroupSelected) 
{   
    rect.SetRect(rect.left + 4, rect.top+30, rect.left + 126, rect.bottom - 5); 
    memDc.FillRect(&rect,&nBrush); 
    memDc.RoundRect(rect.left, rect.top, rect.right, rect.bottom, 8, 8); 
} 
if (rightGroupSelected) 
{ 
    rect.SetRect(rect.left + 134, rect.top+30, rect.left + 256, rect.bottom - 5); 
    memDc.FillRect(&rect,&nBrush); 
    memDc.RoundRect(rect.left, rect.top, rect.right, rect.bottom, 8, 8); 
} 

}

+1

Если вы не хотите, чтобы сделать эту картину во время 'WM_CTLCOLORSTATIC' (см моего ответа), было бы лучше, чтобы дать идентификаторы ресурсов для групповых коробок и получить прямоугольники управления вместо жесткого кодирования координат –