程序有几个透明button,下面是EraseBkgnd。BOOL CbtnDlg::OnEraseBkgnd(CDC* pDC)
{
if(m_bmp.GetSafeHandle() && m_nType)
{
CRect rect;
GetClientRect(rect); CDC bgDC;
bgDC.CreateCompatibleDC(NULL);
bgDC.SelectObject(&m_bmp); BITMAP bmp;
m_bmp.GetBitmap(&bmp);
int nWidth = bmp.bmWidth;
int nHeight = bmp.bmHeight; switch(m_nType)
{
case BITMAP_CENTER:
CbtnDlg::OnEraseBkgnd(pDC);
BITMAP bmp;
m_bmp.GetBitmap (&bmp);
pDC->BitBlt ((rect.Width() - bmp.bmWidth) / 2, (rect.Height() - bmp.bmHeight) / 2, bmp.bmWidth, bmp.bmHeight, &bgDC, 0, 0, SRCCOPY);
return TRUE;
case BITMAP_STRETCH:
pDC->SetStretchBltMode(HALFTONE);
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &bgDC, 0, 0, nWidth, nHeight, SRCCOPY);
m_checkbox1.SetBk(pDC);
m_checkbox2.SetBk(pDC);
m_checkbox3.SetBk(pDC);
return TRUE;
default:
CBrush bgBrush(&m_bmp);
pDC->FillRect(rect,&bgBrush);
return TRUE;
}
}
else
CbtnDlg::OnEraseBkgnd(pDC); return TRUE; //Let's get rid of flickering
}
在xp下面正常显示是这样的:但是在Vista下面,把光标移到按钮上面的时候会变黑:解决办法是把
m_checkbox1.SetBk(pDC);
m_checkbox2.SetBk(pDC);
m_checkbox3.SetBk(pDC);这三行注释掉。但是又带来一个新的问题:
在xp下面如果有一个前端窗口(比如把任务管理器设置成最顶端)已经启动,再启动我的这个程序,会发现按钮被覆盖了:请问这个问题如何解决?

解决方案 »

  1.   

    把你的代码移到 OnPaint 里面看看
      

  2.   

    m_checkbox1.SetBk(pDC); 放在OnPaint会报错,因为OnPaint里面没有定义pDC。
    我的想法是在设置背景图的时候把按钮背景色弄成跟背景图一样。所以放在OnEraseBkgnd里。
      

  3.   

    放在OnPaint会报错,因为OnPaint里面没有定义pDC。Orz......
    CDC *pDC=this->GetDC();
    这不就行了……
      

  4.   

    还发现了一个问题,把Vista主题调成经典主题就不存在"光标移到按钮上面的时候会变黑"的情况.
      

  5.   

    源代码下载:
    http://d.namipan.com/downfile/btn.rar/5f57805c469d5033e705ceac581bf84b9b0d047686bf0100
    是VC2008工程,装了Vista和VS2008的朋友如果有兴趣可以帮忙看看。
      

  6.   

    CButtonST那个透明效果是基于他自己设计的对话框,CTransparetnDlg.源码里面有
      

  7.   

    现在XP下面也有问题了:都成黑色了。
    源代码:
    http://d.namipan.com/downfile/btn.rar/2f27a240ab07e9895741a9073be06fd86e3f54e576e81600
    有兴趣的朋友可以帮忙看看。解决再加分!
      

  8.   

    解决了,办法是在一楼代码:
    m_checkbox1.SetBk(pDC);
    m_checkbox2.SetBk(pDC);
    m_checkbox3.SetBk(pDC);
    后追加:
    m_checkbox1.SetIcon(IDI_ON, IDI_OFF);
    m_checkbox1.DrawTransparent();
    m_checkbox2.SetIcon(IDI_ON, IDI_OFF);
    m_checkbox2.DrawTransparent();
    m_checkbox3.SetIcon(IDI_ON, IDI_OFF);
    m_checkbox3.DrawTransparent();
    而不是放在OnInitDialog中