Transparência para a checkbox de texto de formulários do Windows

Estou usando os formulários do windows em c # e preciso tornar transparente a cor do plano de fundo de uma checkbox de texto. Eu tenho um trackbar que vai de 0 a 255, que deve controlá-lo, mas estou tendo alguns problemas. Eu criei uma pergunta hoje mais cedo perguntando exatamente a mesma coisa, mas sem sucesso.

Aqui está o código que tenho atualmente:

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 } 

O problema é que absolutamente nada acontece. Alguma idéia de por que isso não está funcionando?

Na pergunta anterior, esse cara legal disse algo sobre SetStyle(ControlStyles.SupportsTransparentBackColor, true); , mas não tenho ideia de onde devo colocar isso.

Você precisa experimentar algo assim.

Adicione um novo controle de usuário, diga CustomTextBox e altere

 public partial class CustomTextBox : UserControl 

para

 public partial class CustomTextBox : TextBox 

Você receberá o seguinte erro informando que o ‘AutoScaleMode’ não está definido. Exclua a seguinte linha na class Designer.cs.

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

Faça alterações no construtor do seu controle recém-adicionado da seguinte maneira.

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

Criar, feche o designer de controle personalizado se aberto e você poderá usar esse controle em qualquer outro controle ou formulário.

Solte-o da checkbox de ferramentas como mostrado abaixo insira a descrição da imagem aqui

Crie um novo controle que herda de TextBox, defina o estilo para permitir a transparência no construtor. Em seguida, use seu novo controle em vez de TextBox

Faça isso no seu construtor:

 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 

Isso permitirá que seu novo controle tenha uma cor de plano de fundo transparente.

Você pode ler mais sobre estilos de controle aqui; MSDN: Estilos de Controle , isso pode ajudar também; Herdando de um controle de formulários do Windows com o Visual C #

Eu nunca gostei de ter que fazer meus próprios controles herdados para isso. Então eu fiz uma function wrapper para a function privada SetStyle.

Tente usá-lo em vez de criar sua própria aula?

 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);

Desculpe desenterrar postagens antigas, no entanto, estou procurando há alguns dias para encontrar uma solução para este terrível problema de falta de transparência para checkboxs de texto !!! (Surpreendentemente MSAccess tem um estado de seleção para mostrar transparência!)

De qualquer forma, eu construí uma solução alternativa VB, no entanto, é muito grosseiro e, embora possa ajudar muita gente também gostaria de qualquer input dos mais hard-core’rs com qualquer insights …

Ele basicamente usa a checkbox de texto, em seguida, redimensiona e substitui com um label (portanto, agora representando uma checkbox de texto transparente “aparecendo”. Também par de outras coisas como parar o sinal sonoro se pressione enter em uma checkbox de texto de linha única.

Para usar – Crie uma nova class e cole TODO o código no topo. Isso deve criar dois objects personalizados (CTextBox e CLabel) – você só precisa usar o CTEXTBOX no seu design de formulário.

Converte-se facilmente em C, se essa é a sua língua, mas, por favor, deixe-me saber se tem alguma sugestão?

 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);