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

Coloring the entire background of an MFC static label

本文关键字:背景 MFC 静态 标签      更新时间:2023-10-16

如果要更改"常规"文本标签的背景颜色,此答案真的很棒。但是,如果您想在该文本标签上放置边框并扩大其尺寸,以便文字在名副其实的色彩海洋中游泳呢?它仅以所需颜色的形式绘制文本背景,然后将其余的扩展控制权带有标准按钮面。如何使整个控件的颜色保持一致?

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

我对OP的注释不确定。仍在发布此代码以寻求帮助。

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

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