While working on a project that needed a transparent edit control, I found an article from Duncan Weir on this Web site about editor background colors. To see the article, click here
In this article, to make an editor transparent, a NULL_BRUSH was created and returned from the OnCtlColor message handler. This idea was very simple, but when I tried to use it, I found that the blue rectangle of text selection remained in the background after the text was unselected.
So, instead of creating a NULL_BRUSH, I created a pattern brush by using a chunk of bitmap from where the edit control is going to be shown. That is, instead of using this:
void CInPlaceEdit::PrepareBackground( CRect pos ) { m_Brush.GetStockObject(NULL_BRUSH); }
I did this instead:
void CInPlaceEdit::PrepareBackground( CRect pos ) { CClientDC thisDC( this ); CClientDC parentDC( GetParent() ); CDC thisMem; INT OldParentMapMode = parentDC.SetMapMode( MM_LOENGLISH ); CBitmap* pOldThisBmp; thisMem.CreateCompatibleDC( &thisDC ); INT OldThisMapMode = thisMem.SetMapMode( MM_LOENGLISH ); CSize sz = pos.Size(); m_Background.DeleteObject(); m_Background.CreateCompatibleBitmap( &thisDC, sz.cx, -sz.cy ); pOldThisBmp = thisMem.SelectObject( &m_Background ); thisMem.BitBlt( 0, 0, sz.cx, sz.cy, &parentDC, pos.left, pos.top, SRCCOPY ); thisMem.SetMapMode( OldThisMapMode ); thisMem.SelectObject( pOldThisBmp ); parentDC.SetMapMode( OldParentMapMode ); m_Brush.DeleteObject(); m_Brush.CreatePatternBrush( &m_Background ); if ( m_Brush.m_hObject != NULL ) m_Brush.UnrealizeObject(); }
and then this:
HBRUSH CInPlaceEdit::CtlColor(CDC* pDC, UINT nCtlColor) { pDC->SelectObject( &m_Brush ); pDC->SetBrushOrg( 0, 0 ); pDC->SetBkMode(TRANSPARENT); return (HBRUSH)m_Brush; }
Note: The PrepareBackgound method must be called before showing the edit control. I have created an small sample application to ilustrate that approach. See the code for details.
I hope this can help somebody.
Thanks.