程序有几个透明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下面如果有一个前端窗口(比如把任务管理器设置成最顶端)已经启动,再启动我的这个程序,会发现按钮被覆盖了:请问这个问题如何解决?
{
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下面如果有一个前端窗口(比如把任务管理器设置成最顶端)已经启动,再启动我的这个程序,会发现按钮被覆盖了:请问这个问题如何解决?
我的想法是在设置背景图的时候把按钮背景色弄成跟背景图一样。所以放在OnEraseBkgnd里。
CDC *pDC=this->GetDC();
这不就行了……
http://d.namipan.com/downfile/btn.rar/5f57805c469d5033e705ceac581bf84b9b0d047686bf0100
是VC2008工程,装了Vista和VS2008的朋友如果有兴趣可以帮忙看看。
源代码:
http://d.namipan.com/downfile/btn.rar/2f27a240ab07e9895741a9073be06fd86e3f54e576e81600
有兴趣的朋友可以帮忙看看。解决再加分!
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中