Transparente Kontrolle über PictureBox

68

In meinem C # -Formular habe ich ein Label, das einen Download-Prozentsatz im Download-Ereignis anzeigt:

  this.lblprg.Text = overallpercent.ToString("#0") + "%";

Die BackColor-Eigenschaft des Label-Steuerelements ist transparent und soll über einer PictureBox angezeigt werden. Aber das scheint nicht richtig zu funktionieren, ich sehe einen grauen Hintergrund, es sieht nicht transparent über dem Bildfeld aus. Wie kann ich das beheben?

Derezzed
quelle

Antworten:

169

Das Label-Steuerelement unterstützt die Transparenz gut. Es ist nur so, dass der Designer Sie das Etikett nicht richtig platzieren lässt. Das PictureBox-Steuerelement ist kein Containersteuerelement, daher wird das Formular zum übergeordneten Element des Etiketts. Sie sehen also den Hintergrund des Formulars.

Es ist einfach zu beheben, indem dem Formularkonstruktor ein bisschen Code hinzugefügt wird. Sie müssen die Parent-Eigenschaft des Etiketts ändern und den Speicherort neu berechnen, da es sich jetzt relativ zum Bildfeld anstelle des Formulars befindet. So was:

    public Form1() {
        InitializeComponent();
        var pos = this.PointToScreen(label1.Location);
        pos = pictureBox1.PointToClient(pos);
        label1.Parent = pictureBox1;
        label1.Location = pos;
        label1.BackColor = Color.Transparent;
    }

Sieht zur Laufzeit so aus:

Geben Sie hier die Bildbeschreibung ein


Ein anderer Ansatz besteht darin, das Problem der Entwurfszeit zu lösen. Das braucht nur ein Attribut. Fügen Sie einen Verweis auf System.Design hinzu und fügen Sie Ihrem Projekt eine Klasse hinzu. Fügen Sie diesen Code ein:

using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;    // Add reference to System.Design

[Designer(typeof(ParentControlDesigner))]
class PictureContainer : PictureBox {}
Hans Passant
quelle
Danke, es funktioniert perfekt, aber die Bildbox ist eine benutzerdefinierte ProgressBar und die Download-Details werden erst angezeigt, wenn die ProgressBar am Etikettenort erhöht wird. Wie kann ich sie immer sichtbar machen und nicht nur, wenn die ProgressBar sie berührt? Hier ein ! Bild
Derezzed
1
Ich tat dies, bis mir klar wurde, dass ich keine Bilderbox brauchte. Das Label-Steuerelement selbst verfügt über eine Image-Eigenschaft, die in einfachen Szenarien, in denen keine Bildformatierung erforderlich ist, möglicherweise ausreicht.
Larry
9
Auch dies funktioniert nicht ProgresBarunter dem Etikett.
Bitterblue
Vielleicht könnte dieser Trick doch mit einer ProgressBar gemacht werden? wie man?
ElektroStudios
2
Besonders Ihr '... und die Neuberechnung des Standorts, da es jetzt relativ zum Bildfeld anstelle des Formulars ist ...' ist wirklich hilfreich!
PeterCo
40

Sie können einfach verwenden

label1.Parent = pictureBox1;
label1.BackColor = Color.Transparent; // You can also set this in the designer, as stated by ElDoRado1239
Wouter
quelle
3
Das ist perfekt!, Nie verwendete übergeordnete Eigenschaft des Etiketts. Gut gemacht. :)
Bravo
Für mich erscheint "Color.Transparent" als unbekannt und "System.Drawing.Color.Transparent" schlägt nach dem Ausführen fehl ...
kokbira
Vielen Dank für die Bestätigung meines Gefühls, dass die akzeptierte Antwort unnötig lang ist. Sie können die transparente BackColor auch im Designer festlegen, ohne dass Sie dies ausschreiben müssen.
ElDoRado1239
Vielen Dank. Das Einstellen von Parent funktioniert einwandfrei. Das Hinzufügen der Beschriftung zu den PictureBox-Steuerelementen scheint auch die Parent-Eigenschaft festzulegen (z. B. pictureBox1.Controls.Add (label1);). Das Label FlatStyle muss auf "Standard" gesetzt sein, damit das Label BackColor auf Color.Transparent gesetzt werden kann.
LT Dan
10

Sie können Text mit TextRenderer zeichnen, der ihn ohne Hintergrund zeichnet:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    TextRenderer.DrawText(e.Graphics, 
                          overallpercent.ToString("#0") + "%", 
                          this.Font, 
                          new Point(10, 10), 
                          Color.Red);
}

Wenn sich der Gesamtprozentsatzwert ändert, aktualisieren Sie die imageBox:

pictureBox1.Refresh();

Sie können auch Graphics.DrawString verwenden, aber TextRenderer.DrawText (mit GDI) ist schneller als DrawString (GDI +)

Schauen Sie sich hier auch eine andere Antwort und hier die DrawText-Referenz an

Maciej
quelle
1
Vielen Dank! Dies war die einzige Lösung, die dazu beitrug, einen Text (transparenter Hintergrund) in eine ProgressBar einzufügen.
Prokurors
5

Für einfach für Ihr Design. Sie können Ihr Etikett in einem Panel platzieren. und Hintergrundbild des Panels einstellen ist das, was jedes Bild Sie wollen. Der festgelegte Etikettenhintergrund ist transparent

Grauer Wolf
quelle
1
Diese Lösung funktioniert nicht, wenn das Bild ein animiertes GIF ist. Die Animation funktioniert nicht als Hintergrund eines Panels.
Chun Lin
1

Nachdem ich die meisten der bereitgestellten Lösungen ohne Erfolg ausprobiert hatte, funktionierte Folgendes für mich:

label1.FlatStyle = FlatStyle.Standard
label1.Parent = pictureBox1

label1.BackColor = Color.Transparent    
Falke
quelle
0

Eine Möglichkeit, die für alles funktioniert, aber Sie müssen die Position, die Größe ändern, verschieben usw. verwenden, ist die Verwendung eines transparenten Formulars:

        Form form = new Form();
        form.FormBorderStyle = FormBorderStyle.None;
        form.BackColor = Color.Black;
        form.TransparencyKey = Color.Black;
        form.Owner = this;
        form.Controls.Add(new Label() { Text = "Hello", Left = 0, Top = 0, Font = new Font(FontFamily.GenericSerif, 20), ForeColor = Color.White });
        form.Show();
Stefan Pintilie
quelle
-3

Wenn Sie Visual Studio mit Windows Form verwenden, können Sie Beschriftungen oder anderen Elementen Transparenz hinzufügen , indem Sie sie mit System.Drawing hinzufügen . in Form1.Designer.cs Auf diese Weise steht Ihnen im Eigenschaftenfenster Transparenz zur Verfügung (unter Darstellung bei BackColor). Oder bearbeiten Sie einfach den Code in Designer.cs this.label1.BackColor = System.Drawing.Color.Transparent;

Andrei Magic
quelle