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.

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read