Подтвердить что ты не робот

Прозрачный контроль над PictureBox

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

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

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

4b9b3361

Ответ 1

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

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

    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 {}

Ответ 2

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

label1.Parent = pictureBox1;
label1.BackColor = Color.Transparent; // You can also set this in the designer, as stated by ElDoRado1239

Ответ 3

Вы можете нарисовать текст с помощью 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 здесь

Ответ 4

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

Ответ 5

Один способ, который работает для всего, но вам нужно обрабатывать положение, изменение размера, перемещение и т.д. - это использование прозрачной формы:

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

Ответ 6

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