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.



Downloads

Comments

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Best-in-Class organizations execute on a strategy that supports the multi-channel nature of customer requests. These leading organizations do not just open up their service infrastructures to accommodate new channels, but also empower their teams to deliver an effective and consistent experience regardless of the channel selected by the customer. This document will highlight the key business capabilities that support a Best-in-Class customer engagement strategy.

  • A global data storage provider whose business is booming needed a best-in-class data center to serve as the backbone of its technical operations going forward—and it needed it delivered within a year.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds