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

C++ 为MFC静态标签的整个背景着色,c++,mfc,C++,Mfc,如果您想更改“常规”文本标签的背景色,这真是太棒了。但是,如果您想在文本标签周围添加边框并扩展其大小,使文本在真实的颜色海洋中游动,该怎么办?它仅以所需的颜色绘制文本背景,并将扩展控件的其余部分保留为标准按钮面。如何使整个控件的颜色一致 注意:上述答案的吸引人的特性(无论如何对我来说)是它使用了OnCtlColor(),它提供了指向相关CWnd控件的指针。因此,不需要创建CStatic的子类来处理颜色更改。最好的答案是避免创建这样的子类。您可以在资源编辑器中使静态控件不可见,然后从CMyDial

如果您想更改“常规”文本标签的背景色,这真是太棒了。但是,如果您想在文本标签周围添加边框并扩展其大小,使文本在真实的颜色海洋中游动,该怎么办?它仅以所需的颜色绘制文本背景,并将扩展控件的其余部分保留为标准按钮面。如何使整个控件的颜色一致


注意:上述答案的吸引人的特性(无论如何对我来说)是它使用了
OnCtlColor()
,它提供了指向相关
CWnd
控件的指针。因此,不需要创建
CStatic
的子类来处理颜色更改。最好的答案是避免创建这样的子类。

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

我不太清楚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);
    }
  }
}

当你自己做所有的绘画时,为什么要调用默认绘画?@xMRi:调用默认绘画是我必须做的。如果使用了
CPaintDC
,则不应调用
CDialog::OnPaint
。但是我正在使用
CClientDC
绘制静态控件,以防静态控件需要独立于
OnPaint
进行更新。否。不需要它。如果您自己完成整个工作,您可以自己使用CPaintDC(而不是CClientDC)。@xMRI:它不是绘制整个对话框,只是对话框中的一个静态控件。这个问题涉及静态控件,它需要更改背景以响应按钮单击或计时器,而不使用子类。这是我知道如何做的唯一方法,而不必在每次单击按钮时更新整个对话框。它需要
CClientDC
。是的,我明白了,但比这更奇怪。。。从父对象绘制子对象?是否希望为父对象对话框处理带有OnCtlColor()消息的代码?