我自己继承了CStatic类,主要想改变文字讲颜色 字体大小====
想让背景透明 ,于是把重载了CStaticEx::OnEraseBkgnd(CDC* pDC)
{
CClientDC clDC(GetParent());
CRect rect;
CRect rect1;
GetClientRect(rect);
GetWindowRect(rect1);
GetParent()->ScreenToClient(rect1);
if (m_dcBk.m_hDC == NULL)
{
m_dcBk.CreateCompatibleDC(&clDC);
m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);
} // if pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY);
return TRUE; //CStatic::OnEraseBkgnd(pDC);
}
这代码是从Cbuttonst上copy来的 显示效果也很正常
但是,,如果程序打开的时候已经覆盖了个任务管理器窗口在上面的时候CStaticEx窗口背景都变成任务管理器窗口内容了(残留影响) 请问这是怎么回事?

解决方案 »

  1.   

    背景刷子不能为NULL, 看看OnCtlColor
      

  2.   

    HBRUSH CStaticEx::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
      pDC->SetTextColor (m_clrText);
      if (m_clrTextBkgnd == (COLORREF) -1)
    pDC->SetBkColor (m_clrBkgnd);
      else
    pDC->SetBkColor (m_clrTextBkgnd);
      return (m_brBkgnd); CDC* dc = GetDC();
    CRect rect;
    GetClientRect(rect);//获取客户区的大小
    rect.InflateRect(1,1,1,1);//将客户区域增大一个像素
    CBrush brush (RGB(200,0,0)); //创建画刷
    dc->FrameRect(rect,&brush);//绘制边框
    // return NULL;
    }
      

  3.   

    1楼对,但
    OnCtlColor和OnDrawItem只能画部分控件
      

  4.   

    谢谢各位的帮忙回iyranly: 我也试 了重载 CStaticEx::CtlColor  但是设了断点发现并没有被调用 网上我也查了 很多说这个不工作原因搞不懂 ,控件设了notify这个函数也不工作  我的本意很简单只想保留对话框原有的背景 还有,我想让CStaticEx自绘 ,并不想依赖 对话框的 OnCtlColor有人说了 “ 如果直接从CClinetDC   中拷到MemDC(还有其它办法么?),你将无法分辨“背景”是其它窗体绘制的,”到底有什么办法呢?