我写了一个CStatic派生类CTransparent,用来显示文字信息,同时能透明显示背景图片。
有个奇怪的现象,如果我将对话框上的一个static对象改成我的这个类,就可以正确显示文字(也能透明显示背景图片),但如果我定义一个CTransparent的对象m_Trans,然后m_Trans.Create()之后却不能透明显示背景图片,而是显示一个白色的背景,为什么?我的Create代码:
BOOL CTransparent::Create(CWnd* pParent, int WndID, CRect rect,CString  ShowStr)

   m_pParent = pParent;
   m_WndID = WndID;
   m_Rect = rect;
   m_ShowStr = ShowStr;
   return this->Create(NULL,_T("CTransparent"),WS_CHILD|WS_VISIBLE ,m_Rect,pParent, WndID);
}void CTransparent::OnPaint() 
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
    GetClientRect(m_rcClient);
CFont* pOldFont = dc.SelectObject(&m_Font);
int oldBkMode = dc.SetBkMode(TRANSPARENT);
dc.Rectangle(CRect(0,0,50,50));
dc.SetTextColor(RGB(255,0,0));
dc.ExtTextOut(0,0,ETO_CLIPPED,&m_rcClient,m_ShowStr,NULL);
dc.SetBkMode(oldBkMode);
dc.SelectObject(pOldFont); // Do not call CStatic::OnPaint() for painting messages
}

解决方案 »

  1.   

    上面有错,OnPaint中应去除dc.Rectangle(CRect(0,0,50,50));
      

  2.   

    在对话框的WM_CTLCOLOR中设置透明
      

  3.   

    我试过了,不行,我奇怪的是为什么Create出来的就不对?
      

  4.   

    是不是我的Create的风格有误啊?
      

  5.   

    没错,你以经猜到了,设EX STYLE |= WS_EX_TRANSPARENT
      

  6.   

    呵呵,不好意思,这招我也试过了,不对,问题的关键在于Create出来的不能透明显示,而将static控件定义为
    CTransparent类就可以透明显示背景,怪!
      

  7.   

    ModifyStyleEx(0,WS_EX_TRANSPARENT);Create后就什么都不显示了!
      

  8.   

    试一试
    CDC *pDC = m_pParent->GetDC()
    int oldBkMode = pDC->SetBkMode(TRANSPARENT);
    ....
    pDC->SetBkMode(oldBkMode);
    pDC->DeleteDC();
      

  9.   

    我找到原因了,是因为我把Create出来的控件放在了最上层,可是要是不放在最上层,变化的背景就会将其擦除,于是就要不停的重绘,这样是透明了,可是又出现了闪烁,怎么办啊?
      

  10.   

    修改WM_ERASEBKGND响应,双缓冲,窗口裁剪