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

  • Application and data integration doesn't have to be slow and expensive. Learn how cloud-based integration platforms dramatically speed results and lower costs in this white paper by Bloor Research.

  • Live Event Date: September 17, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT Another day, another end-of-support deadline. You've heard enough about the hazards of not migrating to Windows Server 2008 or 2012. What you may not know is that there's plenty in it for you and your business, like increased automation and performance, time-saving technical features, and a lower total cost of ownership. Check out this upcoming eSeminar and join Rich Holmes, Pomeroy's practice director of virtualization, as he discusses the …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds