Re: Transarent controls
mosfet a ?crit :
Hi,
When I search after information about transparency, it seems there are
so many ways of doing it and so many interpretation that I am a bit lost.
I am interested in a simple transparency, I mean I have a CDialog with a
bitmap in the background(drawn in OnEraseBackground) and some controls
on it (labesl, editbox, ...).
I would like to have transparent controls, CStatic, CEdit, how can I do
that ?
Let's say I have the current implementation (CMemDC is avalaible
http://www.codeproject.com/gdi/flickerfree.asp) :
CxStatic::CxStatic():CStatic(),
m_hBitmap(NULL)
{
m_bTransparent = TRUE;
m_bAutoWrapping = TRUE;
m_eImgMode = FitControl;
m_pFont = NULL;
m_clrText = ::GetSysColor(COLOR_WINDOWTEXT);
m_clrBkgnd = ::GetSysColor(COLOR_CAPTIONTEXT);
m_pBrush = new CBrush(m_clrBkgnd);
}
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 );
// - 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::DrawBackground(CDC* pDC, CRect& rcItem)
{
if ((m_hBitmap != NULL) || (pDC == NULL) || (m_bTransparent))
return;
pDC->FillRect(rcItem, m_pBrush);
}
void CxStatic::DrawBitmap(CDC* pDC, CRect& rcItem)
{
CDC dcMem;
BITMAP bmInfo = {0};
bmInfo.bmWidth = rcItem.Width();
bmInfo.bmHeight = rcItem.Height();
if (m_hBitmap == NULL)
return;
// Get parent DC and retrieve current background
if (m_bTransparent)
{
??????
}
VERIFY( dcMem.CreateCompatibleDC(pDC) );
if (m_eImgMode == FitControl)
{
if (::GetObject(m_hBitmap, sizeof(BITMAP), &bmInfo) == 0)
return;
}
HBITMAP* pBmpOld = (HBITMAP*) ::SelectObject(dcMem.m_hDC, m_hBitmap);
SetStretchBltMode(pDC->m_hDC, BILINEAR);
pDC->StretchBlt(0,0,
rcItem.Width(), rcItem.Height(),&dcMem,0,0,
bmInfo.bmWidth, bmInfo.bmHeight,
SRCCOPY);
}