着色MFC静态标签的整个背景

时间:2015-05-06 01:29:11

标签: c++ mfc

This Answer如果你想改变传统的"的背景​​颜色真的很棒。文字标签。但是,如果你想在文本标签周围放一个边框并扩大它的大小以便文本在一个名副其实的海洋中游泳呢?它仅以所需颜色绘制文本背景,并使用标准按钮面保留扩展控件的其余部分。如何在整个控件中使颜色保持一致?

注意:关于上述答案的有吸引力的功能(对我而言)是它使用了OnCtlColor(),它提供了指向CWnd控件的指针。因此,无需创建CStatic的子类来处理颜色更改。一个避免创建这样一个子类的答案将是首选。

2 个答案:

答案 0 :(得分:2)

我对OP的Note部分不太确定。仍然发布此代码以供他帮助。

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

答案 1 :(得分:0)

您可以在资源编辑器中使静态控件不可见,然后从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);
}