Transparent Edit Using a Pattern Background Brush
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.

Comments