就象MSN中,当别人输入消息时,对话框的下面就显示XX在输入消息但是那个Static又不改变主对话框的背景图片我怎么设置Static的属性都不行。总是出现灰色的static。怎么才能让自己的static完全透明的只显示其中的文字而不遮盖背景图片???

解决方案 »

  1.   

    显示文字时,用SetBkMode(TRANSPARENT);
    可以响应对话框的OnCtlColor事件,判断控件是否为静态框,是则设置背景模式为透明
      

  2.   

    把对话框的背景复制一份(因为对话框本身的DC包含有CStatic的内容,需要用内存DC/内存位图),在CStatic的WM_ERASEBKGND消息响应时复制到CStatic的DC,返回TRUE;如果你对效果要求很苛刻,只有这个方法
      

  3.   

    添加OnCtlColor事件:
    if(nCtlColor == CTLCOLOR_STATIC)
    {
    pDC->SetBkMode (TRANSPARENT);
    return (HBRUSH) GetStockObject (HOLLOW_BRUSH);;
    }
      

  4.   

    BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
    //{{AFX_MSG_MAP(CMyStatic)
    ON_WM_ERASEBKGND() ON_WM_CTLCOLOR_REFLECT()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()BOOL CMyHyperLink::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    if (m_pParentDC && m_pParentDC->GetSafeHdc())
    {
    CRect rc;
    GetWindowRect(rc);
    GetParent()->ScreenToClient(rc);
    pDC->BitBlt(0, 0, rc.Width(),rc.Height(), m_pParentDC,rc.left,rc.top,SRCCOPY);
    return TRUE;
    } return FALSE;
    }
    BRUSH CMyStatic::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
    UNUSED_ALWAYS(nCtlColor);
    pDC->SetBkMode(TRANSPARENT);
    return ((HBRUSH)GetStockObject(HOLLOW_BRUSH));
    }
    .....
    用法 CDC* pDC = GetDC();
    m_MemDC.CreateCompatibleDC(pDC);
    m_Bitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
    m_MemDC.SelectObject(&m_Bitmap);//内存位图不能选出来
    ReleaseDC(pDC);
             m_cStatic.m_pParentDC = &m_MemDC;
      

  5.   

    不填充背景不就可以了阿,另外显示文字时,用SetBkMode(TRANSPARENT);
      

  6.   

    补充一点,m_cStatic.SetWindowText改变文本之后需要调用Invalidate(TRUE);