omatai
omatai

Reputation: 3728

Coloring the entire background of an MFC static label

This Answer is really great if you want to change the background color of a "conventional" text label. But what if you want to put a border around that text label and expand its size so that the text is swimming in a veritable sea of color? It only paints the text background in the required color, and leaves the rest of the expanded control with the standard button face. How can one make the color consistent across the entire control?

Note: The attractive feature (to me anyway) about the above answer is that it makes use of OnCtlColor(), which provides a pointer to the CWnd control concerned. So there is no need to create a subclass of CStatic to handle the color change. An answer that avoids creating such a subclass would be preferred.

Upvotes: 1

Views: 3368

Answers (2)

hypheni
hypheni

Reputation: 814

I'm not very sure about OP's Note section. Still posting this code for his help.

HBRUSH CSampleDlg::OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor)
{
  switch (nCtlColor)
  {
  case CTLCOLOR_STATIC:
    {
      CRect rcWindow(0, 0, 220, 40);
      //::GetWindowRect(pWnd->GetSafeHwnd(), &rcWindow);
      pDC->FillSolidRect(rcWindow, RGB(49, 49, 49));
      pDC->SetTextColor(RGB(255, 255, 255));
      return (HBRUSH)GetStockObject(NULL_BRUSH);
    }
  default:
    {
      return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    }
  }
}

Upvotes: 2

Barmak Shemirani
Barmak Shemirani

Reputation: 31679

You can make the static control invisible in the resource editor then paint it from CMyDialog.

void CMyDialog::OnPaint()
{
    CDialog::OnPaint();
    paintstatic(IDC_STATIC1);
}

void CMyDialog::paintstatic(int id)
{
    CClientDC dc(this);
    CRect rc;
    CWnd *child = GetDlgItem(id);
    child->GetWindowRect(&rc);
    CPoint offset(0, 0);
    ClientToScreen(&offset);
    rc.OffsetRect(-offset);
    dc.FillSolidRect(rc, RGB(0, 255, 128));

    CFont *font = GetFont();
    dc.SelectObject(font);
    CString text;
    child->GetWindowText(text);
    dc.DrawText(text, rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

Upvotes: 0

Related Questions