2013-06-26 1 views
0

Je m'excuse pour le flou du titre, mais je ne suis pas entièrement sûr de la façon dont je veux résoudre le problème. Fondamentalement, j'ai 2 groupes de boutons. Lorsque l'utilisateur sélectionne un bouton de l'un des groupes, je veux définir un indicateur que ce groupe a été sélectionné. Donc, soit un rectangle les entourant (en bleu) ou en coloriant l'arrière-plan (ou l'image de fond) derrière le groupe. L'utilisateur final a indiqué qu'un rectangle les entourant serait bien, ce qui serait préférable. J'ai essayé de surcharger l'onCtlColor sur une boîte de groupe, mais je ne sais pas comment limiter la coloration à la bordure. Je sais qu'il doit absolument être le plus en arrière dans z-ordre Un conseil?MFC - définir une image de fond sur un contrôle

Exemple de code (je suis conscient qu'il fait mal l'ensemble de la boîte)

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); 

Répondre

0

je pouvais trouver seulement un moyen de changer la couleur de fond du texte d'une zone de groupe:

EDIT Vous pouvez peindre tout ce que vous voulez dans la zone Groupe!

a) déclarer une variable membre CBrush m_br et créer une brosse colorée avec elle

b) Remplacer WindowProc pour une zone de groupe avec 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

Meilleur code (au moins pour moi):

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

Si vous ne voulez pas faire la peinture pendant 'WM_CTLCOLORSTATIC' (voir ma réponse), il serait préférable de donner l'ID des ressources aux zones de groupe et récupérer les rectangles des contrôles à la place de coder en dur les coordonnées –

Questions connexes