J'utilise des formulaires Windows en C # et je dois rendre la couleur d'arrière-plan d'une zone de texte transparente. J'ai une barre de suivi qui va de 0 à 255 et qui est censée la contrôler, mais j'ai des problèmes. J'ai créé une question plus tôt aujourd'hui demandant exactement la même chose, mais sans succès.
Voici le code que j'ai actuellement:
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
}
Le problème est que rien ne se passe absolument. Des idées sur pourquoi cela ne fonctionne pas?
A la question précédente, ce gentil gars a dit quelque chose à propos de SetStyle(ControlStyles.SupportsTransparentBackColor, true);
, mais je ne sais pas du tout où je devrais mettre ceci.
Vous devez essayer quelque chose comme ça.
Ajoutez un nouveau contrôle utilisateur, par exemple CustomTextBox et changez
public partial class CustomTextBox : UserControl
à
public partial class CustomTextBox : TextBox
Vous obtiendrez alors l'erreur suivante en indiquant que le 'AutoScaleMode' n'est pas défini. Supprimez la ligne suivante dans la classe Designer.cs.
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
Apportez les modifications suivantes au constructeur de votre contrôle nouvellement ajouté.
public partial class CustomTextBox : TextBox
{
public CustomTextBox()
{
InitializeComponent();
SetStyle(ControlStyles.SupportsTransparentBackColor |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.ResizeRedraw |
ControlStyles.UserPaint, true);
BackColor = Color.Transparent;
}
}
Construisez, fermez le concepteur de contrôle personnalisé s'il est ouvert et vous pourrez utiliser ce contrôle sur tout autre contrôle ou formulaire.
Créez un nouveau contrôle qui hérite de TextBox, définissez le style pour permettre la transparence dans le constructeur. Puis utilisez votre nouveau contrôle à la place de TextBox
Faites ceci dans votre constructeur:
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
Cela permettra à votre nouveau contrôle d'avoir une couleur d'arrière-plan transparente.
Vous pouvez en savoir plus sur les styles de contrôle ici; MSDN: Styles de contrôle , cela peut également aider; Hériter d'un contrôle Windows Forms avec Visual C #
Je n'ai jamais aimé avoir à faire mes propres contrôles hérités pour cela. J'ai donc créé une fonction wrapper à la fonction privée SetStyle.
Essayez de l'utiliser au lieu de créer votre propre classe?
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);
Désolé de découvrir d'anciens posts, cependant, je cherche depuis quelques jours à trouver une solution à ce terrible problème d'absence de transparence pour les zones de texte !!! (Étonnamment, MSAccess a un état de contrôle pour montrer la transparence!)
Quoi qu'il en soit, j'ai construit une solution de contournement VB, cependant, elle est très grossière et peut aider beaucoup de gens aimerait également recevoir des informations de la part des plus durs ...
Il utilise essentiellement la zone de texte, puis la redimensionne et la remplace par une étiquette (représentant désormais une zone de texte "apparente" transparente. Deux autres choses, telles que l'arrêt du bip sonore, si vous appuyez sur entrée sur une zone de texte à une seule ligne.
Pour utiliser - Créez une nouvelle classe et collez TOUT le code par-dessus, cela devrait créer deux objets personnalisés (CTextBox et CLabel) - il vous suffit d'utiliser CTEXTBOX dans votre conception de formulaire.
Convertit facilement en C, si c'est votre langue, mais s'il vous plaît laissez-moi savoir si vous avez des suggestions?
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
<Description("Use the Enter Key as Tab (Stops Beeps) only for Single line TextBox"), Category("CTextBox")> _
Public Property zUseEnterAsTab() As Boolean
Get
Return _zUseEnterAsTab
End Get
Set(value As Boolean)
_zUseEnterAsTab = value
Me.Invalidate()
End Set
End Property
<Description("Use Transparent TextBox"), Category("CTextBox")> _
Public Property zUseTransparent() As Boolean
Get
Return _zUseTransparent
End Get
Set(value As Boolean)
_zUseTransparent = value
Me.Invalidate()
End Set
End Property
<Description("Change the transparency to ANY color or shade or Alpha"), Category("CTextBox")> _
Public Property zUseTransparentColor() As Color
Get
Return _zUseTransparentColor
End Get
Set(value As Color)
_zUseTransparentColor = value
Me.Invalidate()
End Set
End Property
<Description("Border color of the texbox when transparency used"), Category("CTextBox")> _
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