Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

How to make a TextBox/RichTextBox transparent

0.00/5 (No votes)
19 Nov 2004 1  
This article shows how to create transparent TextBox control in C#.

Introduction

The problem is that, it seems that the TextBox and the RichTextBox do not accept Color.Transparent for their BackColor property. I developed a solution for the RichTextBox control and a synthesized solution from Bob Bradley's article for the TextBox control.

This is not a clear, nice solution. I am just contributing. Beginners may have a tough time understanding this. If you feel at home with OOP and C#, then this article should be a light snack for you.

RichTextBox

class TransparentControl : Control
{
   public TransparentControl()
   {
      base.SetStyle( ControlStyles.UserPaint, true );
      base.SetStyle( ControlStyles.DoubleBuffer, true );
      base.SetStyle( ControlStyles.SupportsTransparentBackColor, true );
   }
}

class TransparentRichTextBox : RichTextBox
{
   public TransparentRichTextBox()
   {
      base.ScrollBars = RichTextBoxScrollBars.None;
   }

   override protected CreateParams CreateParams
   {
      get
      {
         CreateParams cp = base.CreateParams;
         cp.ExStyle |= 0x20;
         return cp;
      }
   }

   override protected void OnPaintBackground( PaintEventArgs e )
   {
   }
}

TextBox

public class TransparentTextBox : TextBox
{
   PictureBox pictureBox = new PictureBox();

   public TransparentTextBox()
   {
      pictureBox.Dock = DockStyle.Fill;
      this.Controls.Add( pictureBox ); 
   }
   protected override void WndProc( ref Message m )
   {
      base.WndProc( ref m );
      switch( m.Msg )
      {
         case Win32.WM_PAINT:

            Bitmap bmpCaptured = 
              new Bitmap( this.ClientRectangle.Width, this.ClientRectangle.Height );
            Bitmap bmpResult = 
              new Bitmap( this.ClientRectangle.Width,this.ClientRectangle.Height );
            Rectangle r = 
              new Rectangle( 0, 0, this.ClientRectangle.Width, 
              this.ClientRectangle.Height );
 
            CaptureWindow( this, ref bmpCaptured ); 
            this.SetStyle( ControlStyles.SupportsTransparentBackColor, true );
            this.BackColor = Color.Transparent;

            ImageAttributes imgAttrib = new ImageAttributes();

            ColorMap[] colorMap = new ColorMap[ 1 ];

            colorMap[ 0 ] = new ColorMap();

            colorMap[ 0 ].OldColor = Color.White;

            colorMap[ 0 ].NewColor = Color.Transparent;

            imgAttrib.SetRemapTable( colorMap ); 

            Graphics g = Graphics.FromImage( bmpResult );

            g.DrawImage( bmpCaptured, r, 0 , 0, this.ClientRectangle.Width, 
                this.ClientRectangle.Height, GraphicsUnit.Pixel, imgAttrib );

            g.Dispose();

            pictureBox.Image = ( Image )bmpResult.Clone(); 
         break;


         case Win32.WM_HSCROLL:

         case Win32.WM_VSCROLL:

            this.Invalidate(); // repaint

           // if you use scrolling then add these two case statements


         break;
   }
}

private static void CaptureWindow( Control control, ref Bitmap bitmap )
{
   Graphics g = Graphics.FromImage( bitmap );
   int i = ( int )( Win32.PRF_CLIENT | Win32.PRF_ERASEBKGND );
   IntPtr iPtr = new IntPtr( 14 );
   IntPtr hdc = g.GetHdc();
   Win32.SendMessage( control.Handle, Win32.WM_PRINT, hdc, iPtr ); 
   g.ReleaseHdc( hdc );
   g.Dispose();
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here