位图透明处理有关问题。想在一个对话框中的static中透明显示一副位图。不知道为什么它就是显示不出来?大家帮忙看看
位图透明处理问题。想在一个对话框中的static中透明显示一副位图。不知道为什么它就是显示不出来?大家帮忙看看。
void CLoginDialog::OnPaint()
{
CPaintDC dc(GetDlgItem(IDC_STATIC_RECT));
// TODO: Add your message handler code here and/or call default
CBitmap* pOldLogon = m_dcLogon.SelectObject(&m_bmpLogon);
CRect rect;
m_staRect.GetClientRect(&rect); // 得到客户区矩形
CDC maskDc; // 创建设备环境maskDc
CBitmap maskBitmap;
maskDc.CreateCompatibleDC(&dc); // 创建与当前设备相兼容的设备
maskBitmap.CreateBitmap(rect.Width(), rect.Height(), 1, 1, NULL); // 创建一个单色掩码位图
CBitmap* pOldMaskDCBitmap = maskDc.SelectObject( &maskBitmap ); // 选入单色图
COLORREF clrTrans= m_dcLogon.GetPixel(2, 2); // 取得要消除的背景色值
maskDc.SetBkColor(clrTrans);
maskDc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcLogon, 0, 0, SRCCOPY ); // 将位图拷贝到maskDc
m_dcLogon.BitBlt( 0, 0, rect.Width(), rect.Height(), &maskDc, 0, 0, PATINVERT ); // 位图与mask做‘与’运算
m_dcLogon.BitBlt( 0, 0, rect.Width(), rect.Height(), &maskDc, 0, 0, SRCCOPY ); // 显示位图。
maskDc.DeleteDC();
m_dcLogon.SelectObject(pOldLogon);
dc.SelectObject(pOldMaskDCBitmap);
}
------解决方案--------------------
子类化static,把绘制代码改到CMyStatic::OnPaint()中就可以了。
void CLoginDialog::OnPaint()
{
CPaintDC dc(GetDlgItem(IDC_STATIC_RECT));
// TODO: Add your message handler code here and/or call default
CBitmap* pOldLogon = m_dcLogon.SelectObject(&m_bmpLogon);
CRect rect;
m_staRect.GetClientRect(&rect); // 得到客户区矩形
CDC maskDc; // 创建设备环境maskDc
CBitmap maskBitmap;
maskDc.CreateCompatibleDC(&dc); // 创建与当前设备相兼容的设备
maskBitmap.CreateBitmap(rect.Width(), rect.Height(), 1, 1, NULL); // 创建一个单色掩码位图
CBitmap* pOldMaskDCBitmap = maskDc.SelectObject( &maskBitmap ); // 选入单色图
COLORREF clrTrans= m_dcLogon.GetPixel(2, 2); // 取得要消除的背景色值
maskDc.SetBkColor(clrTrans);
maskDc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcLogon, 0, 0, SRCCOPY ); // 将位图拷贝到maskDc
m_dcLogon.BitBlt( 0, 0, rect.Width(), rect.Height(), &maskDc, 0, 0, PATINVERT ); // 位图与mask做‘与’运算
m_dcLogon.BitBlt( 0, 0, rect.Width(), rect.Height(), &maskDc, 0, 0, SRCCOPY ); // 显示位图。
maskDc.DeleteDC();
m_dcLogon.SelectObject(pOldLogon);
dc.SelectObject(pOldMaskDCBitmap);
}
------解决方案--------------------
子类化static,把绘制代码改到CMyStatic::OnPaint()中就可以了。