it-swarm.com.de

Transparenz für Windows-Formularfelder

Ich verwende Windows-Formulare in C # und muss die Hintergrundfarbe einer Textbox transparent machen. Ich habe eine Trackleiste, die von 0 bis 255 reicht, die sie steuern soll, aber ich habe einige Probleme. Ich habe heute eine Frage erstellt, in der ich genau dasselbe gefragt habe, aber keinen Erfolg.

Hier ist der Code, den ich aktuell habe:

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
}

Das Problem ist, dass absolut nichts passiert. Irgendwelche Ideen, warum das nicht funktioniert?

Auf der vorigen Frage hat dieser nette Mann etwas über SetStyle(ControlStyles.SupportsTransparentBackColor, true); gesagt, aber ich habe keine Ahnung, wo ich das setzen soll.

14
P1C Unrelated

Sie müssen so etwas ausprobieren. 

Fügen Sie ein neues Benutzersteuerelement hinzu, sagen Sie CustomTextBox und ändern Sie es

public partial class CustomTextBox : UserControl

zu 

public partial class CustomTextBox : TextBox

Sie erhalten dann die folgende Fehlermeldung, dass "AutoScaleMode" nicht definiert ist. Löschen Sie die folgende Zeile in der Designer.cs-Klasse.

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

Nehmen Sie am Konstruktor des neu hinzugefügten Steuerelements wie folgt Änderungen vor.

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

Erstellen Sie, schließen Sie den benutzerdefinierten Steuerelement-Designer, falls er geöffnet ist, und Sie können dieses Steuerelement für jedes andere Steuerelement oder Formular verwenden.

Legen Sie es wie unten gezeigt aus der Toolbox ab  enter image description here

15
Patrick D'Souza

Erstellen Sie ein neues Steuerelement, das von TextBox erbt, und legen Sie den Stil so fest, dass Transparenz im Konstruktor möglich ist. Verwenden Sie dann Ihr neues Steuerelement anstelle von TextBox

Tun Sie dies in Ihrem Konstruktor:

this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

Dies ermöglicht Ihrem neuen Steuerelement eine transparente Hintergrundfarbe.

Weitere Informationen zu Steuerungsstilen finden Sie hier. MSDN: Steuerstile , dies kann ebenfalls hilfreich sein; Vererben von einem Windows Forms-Steuerelement mit Visual C #

5
madbrendon

Ich habe es nie gemocht, meine eigenen geerbten Steuerelemente dafür zu erstellen. Also habe ich eine Wrapper-Funktion für die private SetStyle-Funktion erstellt.

Versuchen Sie es, anstatt Ihre eigene Klasse zu erstellen?

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

4
Plater

Es tut uns leid, alte Beiträge aufzudecken, aber seit einigen Tagen nach einer Lösung für dieses schreckliche Problem suchen, das für Textboxen keine Transparenz bietet !!! (Erstaunlicherweise verfügt MSAccess über einen Check-Status, um Transparenz zu zeigen!)

Wie auch immer, ich habe einen VB Workaround aufgebaut, der jedoch sehr grob ist und vielleicht vielen Leuten helfen würde, wenn auch jeder Input von den etwas härteren Core'rs mit irgendwelchen Einsichten gefallen würde ...

Es verwendet im Wesentlichen das Textfeld, formatiert es und ersetzt es durch eine Beschriftung (daher stellt es jetzt ein transparentes "erscheinendes" Textfeld dar. Außerdem gibt es einige andere Dinge, wie den Piepton zu stoppen, wenn Sie die Eingabetaste in einem einzeiligen Textfeld drücken.

Verwendung - Erstellen Sie eine neue Klasse und fügen Sie den gesamten Code über den oberen Rand ein. Dies sollte zwei benutzerdefinierte Objekte (CTextBox und CLabel) erstellen. Sie müssen nur CTEXTBOX in Ihrem Formularentwurf verwenden.

Kann leicht in C konvertiert werden, wenn dies Ihre Sprache ist, aber lassen Sie es mich wissen, wenn Sie Vorschläge haben.

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
0
Chicken