Прозрачный контроль над PictureBox - PullRequest
63 голосов
/ 22 февраля 2012

В моей форме C # у меня есть метка, которая отображает процент загрузки в событии загрузки:

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

Свойство BackColor элемента управления Label установлено прозрачным, и я хочу, чтобы оно отображалось поверх PictureBox,Но это, кажется, не работает правильно, я вижу серый фон, он не выглядит прозрачным в верхней части графического блока.Как я могу это исправить?

Ответы [ 5 ]

150 голосов
/ 22 февраля 2012

Элемент управления Label хорошо поддерживает прозрачность.Просто дизайнер не позволит вам правильно разместить этикетку.Элемент управления PictureBox не является контейнерным элементом управления, поэтому форма становится родительской для метки.Итак, вы видите фон формы.

Это легко исправить, добавив немного кода в конструктор формы.Вам нужно будет изменить свойство Parent метки и пересчитать его местоположение, поскольку теперь оно относится к графическому блоку, а не к форме.Например:

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

Во время выполнения выглядит примерно так:

enter image description here


Другой подход заключается в решении проблемы времени разработки.Это просто берет атрибут.Добавьте ссылку на System.Design и добавьте класс в свой проект, вставьте этот код:

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

[Designer(typeof(ParentControlDesigner))]
class PictureContainer : PictureBox {}
37 голосов
/ 13 апреля 2013

Вы можете просто использовать

label1.Parent = pictureBox1;
label1.BackColor = Color.Transparent; // You can also set this in the designer, as stated by ElDoRado1239
9 голосов
/ 22 февраля 2012

Вы можете рисовать текст, используя TextRenderer, который будет рисовать без фона:

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

Когда общее значение процента изменяется, обновите pictureBox:

pictureBox1.Refresh();

Вы также можете использовать Graphics.DrawString, ноTextRenderer.DrawText (с использованием GDI) работает быстрее, чем DrawString (GDI +)

Также посмотрите другой ответ здесь и ссылку DrawText здесь

5 голосов
/ 02 апреля 2014

Для легкого для вашего дизайна. Вы можете разместить свой ярлык внутри панели. и установить фоновое изображение панели, это то, что вы хотите. установить прозрачный фон этикетки

0 голосов
/ 19 апреля 2015

Используя Visual Studio с формой Windows, вы можете применить прозрачность к меткам или другим элементам, добавив с помощью System.Drawing; в Form1.Designer.cs Таким образом, у вас будет прозрачность из панели свойств (в появлении на BackColor). Или просто измените код в Designer.cs this.label1.BackColor = System.Drawing.Color.Transparent;

...