Ich habe diese Klasse für transparente Textbox gemacht

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

Aber als ich das Textfeld verlasse, verschwindet der Text, ist aber immer noch da. Wie man es repariert?

2
user3651521 25 Dez. 2015 im 14:37

2 Antworten

Beste Antwort

Sie können das Flag ControlStyles.OptimizedDoubleBuffer entfernen und dann den Text im Ereignis OnPaint mit DrawString neu zeichnen

Etwas wie das:

public partial class TransTextBox : TextBox {
    public TransTextBox() {
        SetStyle(ControlStyles.SupportsTransparentBackColor |
            //ControlStyles.OptimizedDoubleBuffer | //comment this flag out
                         ControlStyles.AllPaintingInWmPaint |
                         ControlStyles.ResizeRedraw |
                         ControlStyles.UserPaint, true);
        BackColor = Color.Transparent;
    }

    private void redrawText() {
        using (Graphics graphics = this.CreateGraphics())
        using (SolidBrush brush = new SolidBrush(this.ForeColor))
            graphics.DrawString(this.Text, this.Font, brush, 1, 1); //play around with how you draw string more to suit your original
    }

    protected override void OnPaint(PaintEventArgs e) {
        base.OnPaint(e);
        redrawText();
    }
}

Wenn Sie DoubleBuffer verwenden, wird Ihre Zeichenfolge, selbst wenn Sie die Zeichenfolge neu zeichnen, durch das Doppel "gelöscht".

0
Ian 25 Dez. 2015 im 14:16

Sie haben zwei Möglichkeiten.

Sie können ein Objekt erstellen, das TextBox und Label enthält und der Fokus in TextBox eingeht, das Label ausblendet und wenn der Fokus das TextBox verlässt. zeige das Label. Damit ist Ihr aktuelles Setup jetzt behoben.

Ein direkterer Ansatz könnte ungefähr so aussehen:

public class TransTextBox
{
    BackColor = this.Parent.BackColor;
}

Wenn sich die Hintergrundfarbe ändert, muss dies erneut aufgerufen werden.

0
AustinWBryan 25 Dez. 2015 im 13:52