Windows窗体的透明度表示文本框

我在C#中使用Windows窗体,我需要使文本框的背景颜色透明。 我有一个从0到255的轨道栏应该控制它,但我遇到了一些麻烦。 我今天早些时候提出了一个问题问同样的问题,但没有成功。

这是我目前的代码:

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 } 

问题是绝对没有任何反应。 关于为什么这不起作用的任何想法?

在上一个问题上,这个好人讲了一些关于SetStyle(ControlStyles.SupportsTransparentBackColor, true); ,但我不知道我应该把它放在哪里。

你需要试试这样的东西。

添加一个新的用户控件,比如说CustomTextBox并进行更改

 public partial class CustomTextBox : UserControl 

 public partial class CustomTextBox : TextBox 

然后,您将收到以下错误,指出未定义“AutoScaleMode”。 删除Designer.cs类中的以下行。

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

更改新添加的控件的构造函数,如下所示。

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

如果打开,则构建,关闭自定义控件设计器,您将能够在任何其他控件或窗体上使用此控件。

将其从工具箱中删除,如下所示 在此处输入图像描述

创建一个inheritance自TextBox的新控件,将样式设置为允许构造函数中的透明度。 然后使用新控件而不是TextBox

在您的构造函数中执行此操作:

 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 

这将允许您的新控件具有透明背景颜色。

您可以在此处阅读有关控件样式的更多信 MSDN:控件样式 ,这可能也有帮助; 使用Visual C#从Windows窗体控件inheritance

我从来不喜欢为此创建自己的inheritance控件。 所以我为私有的SetStyle函数创建了一个包装函数。

尝试使用它而不是创建自己的类?

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

很抱歉发现旧post,但是,现在一直在寻找解决这个文本框没有透明度的可怕问题的解决方案! (令人惊讶的是MSAccess有一个检查状态来显示透明度!)

无论如何,我已经建立了一个VB解决方案,但是,它非常粗糙,虽然可能会帮助很多人也希望任何来自更多核心人士的任何见解的任何见解……

它基本上使用文本框,然后将其缩小并替换为标签(因此现在代表一个透明的“出现”文本框。还有一些其他的东西,比如在单行文本框中输入时停止发出哔哔声。

要使用 – 创建一个新类并将所有代码粘贴到顶部,这应该创建两个自定义对象(CTextBox和CLabel) – 您只需要在表单设计中使用CTEXTBOX。

如果这是你的语言,很容易转换为C,但如果有任何建议,请告诉我?

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