Re: Transarent controls
Ok I have rewritten the control with your suggestions.
I am using reference instead of pointer for DC, I am using a CBitmap, ...
I just don't understand the part about not taking the parent device...
void CxStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect( &rcClient );
CMemDC memDC(&dc, &rcClient, TRUE);
// draw the backgound, text and bitmap.
CxStatic::DrawBackground( memDC, rcClient );
CxStatic::DrawBitmap( memDC, rcClient );
// For now let's ignore text drawing
//CxStatic::DrawText( memDC, rcClient );
// - Copy the memory device context back into the original DC via
BitBlt().
dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(),
rcClient.Height(), &memDC, 0,0, SRCCOPY);
}
void CxStatic::DrawBitmap(CDC& dc, CRect& rcItem)
{
CDC dcMem;
CBitmap bmp;
CBitmap* pOldBmp = NULL;
TRACE( _T("rcItem : Width = %d, Height = %d\n"), rcItem.Width(),
rcItem.Height() );
if (m_bTransparent == TRUE)
{
TRACE( _T("CxStatic::DrawBitmap : Transparent is enabled\n") );
// Get parent DC and retrieve current background
CDC* pParentDC = GetParent()->GetDC();
if (pParentDC != NULL)
{
CRect crect, wrect;
GetClientRect(crect);
GetWindowRect(wrect);
GetParent()->ScreenToClient(wrect);
// Create a Bitmap holding parent bmp
VERIFY( dcMem.CreateCompatibleDC( pParentDC ) );
bmp.CreateCompatibleBitmap(pParentDC, wrect.Width(),wrect.Height());
pOldBmp = dcMem.SelectObject( &bmp );
//m_hBitmap = ::CreateCompatibleBitmap ( pParentDC->m_hDC,
wrect.Width(), wrect.Height() );
//pOldBmp = (HBITMAP*) ::SelectObject(dcMem.m_hDC, m_hBitmap);
dcMem.BitBlt(0,0, wrect.Width(), wrect.Height(), &dc,
wrect.left,wrect.top,SRCCOPY);
}
}
else
{
if (m_Bmp.GetSafeHandle() == NULL)
return;
pOldBmp = dcMem.SelectObject( &m_Bmp );
//pOldBmp = (HBITMAP*) ::SelectObject(dcMem.m_hDC, m_hBitmap);
BITMAP bmInfo;
if (m_eImgMode == FitControl)
{
if( m_Bmp.GetBitmap(&bmInfo) == 0)
return;
}
::SetStretchBltMode(dc.m_hDC, BILINEAR);
dc.StretchBlt(0,0,
rcItem.Width(), rcItem.Height(),&dcMem,0,0,
bmInfo.bmWidth, bmInfo.bmHeight,
SRCCOPY);
}
::SelectObject(dcMem.m_hDC, pOldBmp);
}