WTL开发的WM程序,想做一个透明的Lable,处理了WM_CTLCOLORSTATIC,但是没能实现想要的效果。LRESULT CTestDlg::OnCtlColorStatic(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{  
  SetBkMode((HDC)wParam, TRANSPARENT);
  return (LRESULT)AtlGetStockBrush(NULL_BRUSH);
}  敬请大虾们指点一二。

解决方案 »

  1.   

    用gdi+和UpdateLayeredWindow也可以实现镂空。
      

  2.   

    我也是这样做的,可以实现的
    CDCHandle dc = (HDC)wParam; dc.SetBkMode(TRANSPARENT); return (LRESULT)GetStockObject(NULL_BRUSH);
    你是不是忘了给对话框贴背景了?
      

  3.   

     SetBkMode((HDC)wParam, TRANSPARENT);DC的背景只影响DC内的各种对象。窗口的背景透明是两回事儿,窗口要想透明,在windows下,只有用layeredwindow。
      

  4.   

    类似的效果图
    背景色使用低Alpha通道的颜色数,前景色采用高Alpha的通道数;使用UpdateLayeredWindow进行窗口的裁剪即可实现透明效果。
      

  5.   


    目前效果:
    背景是一张BMP图片,在OnEraseBkgnd里面绘:
        LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
        {
            if ( NULL != m_pBgBmp )
            {
                CDCHandle dc((HDC)wParam);
                CDC dcMem;
                dcMem.CreateCompatibleDC(dc);
                HBITMAP hOldBmp = dcMem.SelectBitmap(*m_pBgBmp);
                SIZE sizeBmp;
                m_pBgBmp->GetSize(sizeBmp);
                dc.BitBlt(0, 0, sizeBmp.cx, sizeBmp.cy, dcMem, 0, 0, SRCCOPY);
                dcMem.SelectBitmap(hOldBmp);
                dcMem.DeleteDC();
            }        return 0;
        }然后就是处理WM_CTLCOLORSTATIC消息了:
    LRESULT CTestDlg::OnCtlColorStatic(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {  
      SetBkMode((HDC)wParam, TRANSPARENT);
      return (LRESULT)AtlGetStockBrush(NULL_BRUSH);
    }目标就是为了实现Static Text控件只显示文字,背景就是对话框的背景。
      

  6.   

    HBRUSH CCopyObjFileDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if(pWnd->GetDlgCtrlID() == IDC_STATICNAME || pWnd->GetDlgCtrlID() == IDC_STATICMSG)
    {
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(0, 0, 255));
    return HBRUSH(GetStockObject(HOLLOW_BRUSH));
    }
    return hbr;
    }
    // 这个是之前做的一个satic透明的,
    注意一点.在给static设置内容后需要刷新一下static控件.否则出现内容叠加的效果,
    GetDlgItem(IDC_STATICMSG)->GetWindowRect(&rcEdit);
    SetDlgItemText(IDC_STATICMSG, m_Msg);
    this->InvalidateRect(&rcEdit, TRUE);
      

  7.   

    static的窗口扩展风格有指定WS_EX_TRANSPARENT吗?
      

  8.   

    这些代码应该是没问题的,可能你其他地方搞错了刚刚写的wtl工程:http://u.115.com/file/f05dc180df
      

  9.   


    低效率的办法是,你把下面图片的相关部分拷贝到你重载的CStatic内. 现在机器的cpu都够强,应该用着还不错.-------------------
    BeauGauge Suite V2 虚拟仪表控件升级至2.2哦
    www.beaugauge.com
      

  10.   

    我有个从 网上 下载的CLabel类然后我自己修改了下应该可以满足你的需求的13楼的效果(白色那一块是 原来的背景图片)就像 11楼中 label 的效果一样要的留言关键性代码我改了这出:
    HBRUSH CLabel::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
    // TODO: Change any attributes of the DC here

    // TODO: Return a non-NULL brush if the parent's handler should not be called if (CTLCOLOR_STATIC == nCtlColor)
    {
    pDC->SelectObject(&m_font);
    pDC->SetTextColor(m_crText);
    pDC->SetBkMode(TRANSPARENT);
    //设置透明
    HBRUSH temp = HBRUSH(GetStockObject(HOLLOW_BRUSH));

    return temp;

    }
    if (m_Type == Background)
    {
    if (!m_bState)
    return m_hwndBrush;
    } return m_hBrush;
    }
      

  11.   

    对话框不要设置WS_CLIPCHILDREN风格.
      

  12.   


       WTL开发的WM程序,,,,WM程序,,,WM-->Windows Mobile   Windows下实现的代码,楼上的代码基本上都可以实现,但是在WM下还是不可以。   有一种做法,就是获取父窗口的DC,把这个DC拷贝到CStatic控件的DC来,用这个DC来画CStatic控件的背景,这种做法在windows下可以达到目的,但是WM下还是无法达到目的。可能原因还是这个:
        绘对话框背景的时候,根本就没有去画对话框上面那些控件所在位置,也就是那些控件的背景还是系统默认的背景。这个现象在WM下调试,通过设置断点,在模拟器可以看到。Windows下进断点后,程序界面就看不到了,无法确认是相同的表现。
        个人理解:因为WM下画对话框时,控件虽在位置没有被画,所以通过父窗口DC画CStatic背景后出来的效果还是跟上面13楼的图一个效果。
      

  13.   

    http://topic.csdn.net/u/20101130/10/d2476e81-5ee1-4da2-b920-a5726131a674.html同样的帖子,大家过去抢分吧~~~帖子是论坛维护那会发的,貌似现在就我可以看到这个地址