2011-02-05 22 views
7

cómo puedo hacer que mi cuadro richtext sea transparente
Quiero este primo. Estoy tratando de poner un texto encima de una imagen gráfica (que es el fondo de mi formulario).transparente richTextBox

Esa es la razón por la que quería RichTextbox sea transparente,
estoy usando .NET, C# y en una aplicación de Windows Forms

+1

Tendría que codificarlo usted mismo (o encontrar a alguien que ya haya hecho esto), nada incluido para hacer esto afaik. – ChristopheD

+1

Echa un vistazo a esta posible entrada duplicada - http://stackoverflow.com/questions/1716427/making-a-textbox-transparent – eandersson

+0

¿Qué quieres decir con codificarlo solo? ¿¿como es eso?? –

Respuesta

5

No existe la verdadera transparencia en un control WinForms. El modo transparente hereda el fondo predeterminado de su principal. La forma en que lo he trabajado en el pasado ha sido usar el evento OnPaint y luego usar el método Graphics.DrawString para colocar el texto donde lo desee.

0

No hay manera de tener controles de Windows Forms con un fondo transparente. Muchos lo han probado antes y todos han fallado. Algunos inventaron hacks exóticos, pero todos fallan con algún detalle. Use WPF o HTML si necesita capacidades de representación más avanzadas que las que Windows Forms puede ofrecerle.

+1

Esto es incorrecto. Es factible, especialmente cuando se trata de la biblioteca de gráficos. Si bien todos los Winforms son GDI + o bitmap (esencialmente), la 'transparencia' es definitivamente posible simplemente estableciendo su transparencia, y luego cancelando el dibujo de fondo. Desafortunadamente, así es como funcionan todas las transparencias 2D (incluso renderizaciones 3D falsas), el fondo se dibuja o no se dibuja, pero cuando no se dibuja, verá que es un color de "máscara" con instrucciones en el encabezado del archivo qué hacer con ellos: consulte las especificaciones de transparencia de PNG para obtener más información sobre los trucos aplicados. WPF no es una excepción. –

7

Sé que esta respuesta es muy tarde, pero espero que ayude a otros a los que les gustaría una manera fácil de hacer esto.

Primero, cree un nuevo Control de usuario en su proyecto y asígnele un nombre, diga CustomRTB.cs. Una vez hecho esto, abra la clase parcial y el cambio:

public partial class CustomRTB : UserControl 

a:

public partial class CustomRTB : RichTextBox 

Esto causará un error al abrir el archivo de diseño por lo que sólo tiene que ir al archivo Designer.cs y quitar/comentario las líneas que muestran errores (no habrá más de dos líneas con errores). A continuación, añada lo siguiente a la clase parcial:

protected override CreateParams CreateParams 
{ 
    get 
    { 
     //This makes the control's background transparent 
     CreateParams CP = base.CreateParams; 
     CP.ExStyle |= 0x20; 
     return CP; 
    } 
} 

La clase debe tener este aspecto ahora:

public partial class CustomRTB : RichTextBox 
{ 
    public CustomRTB() 
    { 
     InitializeComponent(); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      //This makes the control's background transparent 
      CreateParams CP = base.CreateParams; 
      CP.ExStyle |= 0x20; 
      return CP; 
     } 
    } 
} 

Ahora construir su solución y usted será capaz de utilizar el control en sus formas. Este control será completamente transparente y no podrá ajustar la transparencia. También podrá crear diferentes controles transparentes además de un richtextbox cambiando la primera línea de este código. Esperamos que esto ayude :)

Editar:

El problema con el control anterior es que sólo se puede utilizar para mostrar el texto mediante programación, ya que es problemático para editar mientras se corre o depuración de la aplicación (como @nevelis explica en el comentario a continuación). Sin embargo, hay una solución simple para esto:

Primero, cree otro Control de usuario en su proyecto y asígnele el nombre TranslucentPanel.cs (Sí, es un panel y será translúcido cuya opacidad se puede controlar mediante programación) . Ahora abra la clase parcial y modificarlo como:

public partial class TranslucentPanel : Panel 
{ 
    public TranslucentPanel() 
    { 
     InitializeComponent(); 
     SetStyle(ControlStyles.SupportsTransparentBackColor | 
      ControlStyles.OptimizedDoubleBuffer | 
      ControlStyles.AllPaintingInWmPaint | 
      ControlStyles.ResizeRedraw | 
      ControlStyles.UserPaint, true); 
     BackColor = Color.Transparent; 
    } 
} 

Tendrá que tener cuidado de que el error que surge cuando se genera el proyecto simplemente comentando la línea en el archivo Designer.cs el que lo tira.Una vez hecho esto, crea tu proyecto nuevamente y el panel translúcido aparecerá en tu caja de herramientas como antes. Utilice este panel como control principal para su richtextbox transparente, es decir, coloque el panel en su formulario y coloque el RTB dentro de él. También puede configurar la propiedad BorderStyle como None para eliminar cualquier traza del RTB de la UI.

También puede controlar la opacidad del panel translúcido mediante el uso de su propiedad BackColor en su programa:

translucentPanel1.BackColor = Color.FromArgb(50, 0, 0, 0); 

Cambio de los argumentos que se pasan por encima le permitirá controlar la opacidad y el color del panel.

Esta solución resolverá el cursor y los problemas de desplazamiento no solo del RTB transparente, sino también de cualquier otro control transparente que cree.

+1

Esto no funciona muy bien con desplazamiento o edición. 0x20, o WS_EX_TRANSPARENT, significa que el control no se vuelve a pintar a menos que se pegue la ventana principal. Si escribe, el cursor se queda después de cada carácter, y si lo desplaza se convierte en un desastre borroso :( – nevelis

+0

@nevelis He editado mi respuesta para incluir una solución alternativa a este problema. Dígame si le sirve :) –

+0

Oh maldita seas una leyenda: DI no he probado esto con el cuadro de texto enriquecido, pero la edición es exactamente lo que necesitaba para evitar que una barra de progreso transparente personalizada parpadeara: D: D: D me has hecho el día. ¡Me pondré a probar RichTextBox en un momento y te lo haré saber! – nevelis