Transparencia para el cuadro de texto de formularios de Windows

Estoy usando formularios de Windows en C # y necesito hacer que el color de fondo de una caja de texto sea transparente. Tengo una barra de seguimiento que va de 0 a 255 que se supone que lo controla, pero estoy teniendo problemas. Creé una pregunta hoy mismo preguntando exactamente lo mismo, pero no tuve éxito.

Aquí está el código que tengo actualmente:

private void trackAlpha_ValueChanged(object sender, EventArgs e) { newColor = Color.FromArgb(trackAlpha.Value, colorDialog.Color.R, colorDialog.Color.G, colorDialog.Color.B); colorDialog.Color = newColor; // The Windows dialog used to pick the colors colorPreview.BackColor = newColor; // Textbox that I'm setting the background color } 

El problema es que no pasa absolutamente nada. ¿Alguna idea sobre por qué esto no está funcionando?

En la pregunta anterior, este tipo agradable dijo algo sobre SetStyle(ControlStyles.SupportsTransparentBackColor, true); , pero no tengo idea de dónde debería poner esto.

Tienes que probar algo como esto.

Agregue un nuevo control de usuario, diga CustomTextBox y cambie

 public partial class CustomTextBox : UserControl 

a

 public partial class CustomTextBox : TextBox 

A continuación, obtendrá el siguiente error que indica que el ‘AutoScaleMode’ no está definido. Elimine la siguiente línea en la clase Designer.cs.

 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 

Realice los cambios en el constructor de su control recién agregado de la siguiente manera.

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

Cree, cierre el diseñador de control personalizado si está abierto y podrá usar este control en cualquier otro control o formulario.

Suelta de la caja de herramientas como se muestra a continuación enter image description here

Cree un nuevo control que herede de TextBox, establezca el estilo para permitir la transparencia en el constructor. Luego use su nuevo control en lugar de TextBox

Haz esto en tu constructor:

 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 

Esto permitirá que su nuevo control tenga un color de fondo transparente.

Puede leer más sobre los estilos de control aquí; MSDN: estilos de control , esto también puede ayudar; Heredar de un control de Windows Forms con Visual C #

Nunca me gustó tener que hacer mis propios controles heredados para esto. Así que hice una función de envoltura para la función privada SetStyle.

Intenta usarlo en lugar de crear tu propia clase?

 public static bool SetStyle(Control c, ControlStyles Style, bool value) { bool retval = false; Type typeTB = typeof(Control); System.Reflection.MethodInfo misSetStyle = typeTB.GetMethod("SetStyle", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (misSetStyle != null && c != null) { misSetStyle.Invoke(c, new object[] { Style, value }); retval = true; } return retval; } 

bool itWorked = SetStyle(myControl, ControlStyles.SupportsTransparentBackColor, true);

Lamentamos descubrir publicaciones antiguas que, sin embargo, llevamos unos días buscando para encontrar una solución a este terrible problema de falta de transparencia para los cuadros de texto. (Sorprendentemente MSAccess tiene un estado de verificación para mostrar la transparencia!)

De todos modos, he construido una solución VB, sin embargo, es muy cruda y, aunque puede ayudar a mucha gente, también le gustaría cualquier aporte de los más duros con cualquier idea …

Básicamente utiliza el cuadro de texto, luego lo ajusta y lo reemplaza con una etiqueta (por lo tanto, ahora representa un cuadro de texto transparente que aparece). También hay otras cosas como detener el pitido si presionas Intro en un cuadro de texto de una sola línea.

Para usar: cree una nueva clase y pegue TODO el código en la parte superior; esto debería crear dos objetos personalizados (CTextBox y CLabel); solo necesita usar CTEXTBOX en el diseño de su formulario.

Se convierte fácilmente en C, si ese es su idioma, pero hágamelo saber si tiene alguna sugerencia.

 Imports System.ComponentModel Public Class CTextBox Inherits TextBox Dim _zUseEnterAsTab As Boolean = True Dim _zUseTransparent As Boolean = False Dim _zUseTransparentColor As Color = Color.Transparent Dim _zUseTransparentBorderColor As Color = Color.Gray  _ Public Property zUseEnterAsTab() As Boolean Get Return _zUseEnterAsTab End Get Set(value As Boolean) _zUseEnterAsTab = value Me.Invalidate() End Set End Property  _ Public Property zUseTransparent() As Boolean Get Return _zUseTransparent End Get Set(value As Boolean) _zUseTransparent = value Me.Invalidate() End Set End Property  _ Public Property zUseTransparentColor() As Color Get Return _zUseTransparentColor End Get Set(value As Color) _zUseTransparentColor = value Me.Invalidate() End Set End Property  _ Public Property zUseTransparentBorderColor() As Color Get Return _zUseTransparentBorderColor End Get Set(value As Color) _zUseTransparentBorderColor = value Me.Invalidate() End Set End Property Protected Overrides Sub OnCreateControl() 'Again for my benifit - there may be other ways to force the transparency 'code at form / event startup, but this is the way i chose, any advice 'or alternatives would be great!! :) If Not DesignMode Then 'Basically don't do in design mode! If _zUseTransparent Then 'Added to handle the event of textbox dissabled If Me.Enabled Then CreateMyLabel(Me) MakeLabelVisible(foundLabel, Me) End If End If End If MyBase.OnCreateControl() End Sub Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs) If MyBase.Multiline = True Then MyBase.OnKeyPress(e) Else If e.KeyChar = Chr(Keys.Enter) Then e.Handled = True If zUseEnterAsTab = True Then SendKeys.Send("{tab}") MyBase.OnKeyPress(e) End If End If End Sub Protected Overrides Sub OnLeave(e As EventArgs) If _zUseTransparent Then CreateMyLabel(Me) MakeLabelVisible(foundLabel, Me) End If MyBase.OnLeave(e) End Sub Protected Overrides Sub OnEnter(e As EventArgs) If _zUseTransparent Then CreateMyLabel(Me) MakeTextBoxVisible(foundLabel, Me) End If MyBase.OnEnter(e) End Sub Dim foundLabel As CLabel = Nothing Sub CreateMyLabel(_TxtBox As CTextBox) foundLabel = Nothing Dim l As CLabel If GetMyLabel("L_" & Me.Name, Me) Then l = foundLabel If Not l.Name = "L_" & Me.Name Then MsgBox("L_" & Me.Name) End If l.Font = _TxtBox.Font l.Text = _TxtBox.Text l.BorderColor = _zUseTransparentBorderColor l.BackColor = _zUseTransparentColor l.BorderStyle = Windows.Forms.BorderStyle.None 'Handled by paint event Else l = New CLabel l.Name = "L_" & _TxtBox.Name l.BorderColor = _zUseTransparentBorderColor l.BackColor = _zUseTransparentColor l.Size = _TxtBox.Size l.BorderStyle = Windows.Forms.BorderStyle.None 'Handled by paint event l.AutoSize = False l.Font = _TxtBox.Font l.Location = _TxtBox.Location l.Text = _TxtBox.Text l.Anchor = _TxtBox.Anchor _TxtBox.Parent.Controls.Add(l) foundLabel = l End If End Sub Function GetMyLabel(_LabelName As String, _TxtBox As CTextBox) As Boolean For Each ctl As Control In _TxtBox.Parent.Controls If ctl.Name = _LabelName Then foundLabel = ctl Return True End If Next Return False End Function Private Sub MakeLabelVisible(_Label As CLabel, _TxtBox As CTextBox) _Label.Location = _TxtBox.Location _Label.Anchor = _TxtBox.Anchor _Label.Size = _TxtBox.Size _TxtBox.Size = New Size(0, 0) _TxtBox.Anchor = AnchorStyles.None End Sub Private Sub MakeTextBoxVisible(_Label As CLabel, _TxtBox As CTextBox) _TxtBox.Location = _Label.Location _TxtBox.Anchor = _Label.Anchor _TxtBox.Size = _Label.Size _Label.Size = New Size(0, 0) _Label.Anchor = AnchorStyles.None End Sub End Class Public Class CLabel Inherits Label Public BorderColor As Color = Color.Gray Sub New() MyBase.FlatStyle = Windows.Forms.FlatStyle.Standard 'Added padding as labels shifted text upwards 'NOT tested on all fonts etc, purely for my sources MyBase.Padding = New Padding(0, 3, 0, 0) End Sub Protected Overrides Sub OnMouseDown(e As MouseEventArgs) Dim _TxtBox As CTextBox = Nothing Dim _TxtBoxName As String = Microsoft.VisualBasic.Right(Me.Name, Len(Me.Name) - 2) For Each elem As Control In Me.Parent.Controls If elem.Name = _TxtBoxName Then _TxtBox = elem Exit For End If Next _TxtBox.Select() MyBase.OnMouseDown(e) End Sub Protected Overrides Sub OnMouseEnter(e As EventArgs) Cursor = Cursors.IBeam MyBase.OnMouseEnter(e) End Sub Protected Overrides Sub OnMouseLeave(e As EventArgs) Cursor = Cursors.Default MyBase.OnMouseLeave(e) End Sub Protected Overrides Sub OnPaint(e As PaintEventArgs) MyBase.OnPaint(e) ControlPaint.DrawBorder(e.Graphics, Me.DisplayRectangle, Color.Gray, ButtonBorderStyle.Solid) End Sub Private Sub MakeLabelVisible(_Label As CLabel, _TxtBox As CTextBox) _Label.Size = _TxtBox.Size _TxtBox.Size = New Size(0, 0) _Label.Anchor = _TxtBox.Anchor _TxtBox.Anchor = AnchorStyles.None End Sub Private Sub MakeTextBoxVisible(_Label As CLabel, _TxtBox As CTextBox) _TxtBox.Size = _Label.Size _Label.Size = New Size(0, 0) _TxtBox.Anchor = _Label.Anchor _TxtBox.Anchor = AnchorStyles.None End Sub End Class 
 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
    Intereting Posts