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

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

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

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


person Derezzed    schedule 22.02.2012    source источник


Ответы (7)


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

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

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

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

введите описание изображения здесь


Другой подход - решить проблему времени разработки. Это просто принимает атрибут. Добавьте ссылку на 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 {}
person Hans Passant    schedule 22.02.2012
comment
Спасибо, он работает отлично, но окно с картинками - это настраиваемый ProgressBar, и детали загрузки не отображаются до тех пор, пока ProgressBar не увеличится в месте метки, как я могу сделать его видимым всегда, а не только тогда, когда ProgressBar касается его? Вот! изображение - person Derezzed; 22.02.2012
comment
Я делал это, пока не понял, что мне не нужен ящик с картинками. Сам элемент управления Label имеет свойство Image, которого может быть достаточно в простых сценариях, не требующих форматирования изображения. - person Larry; 13.09.2012
comment
Также это не работает для ProgresBar под ярлыком. - person Bitterblue; 23.05.2014
comment
Может быть, этот трюк все-таки удастся проделать с помощью ProgressBar? как? - person ElektroStudios; 19.03.2017
comment
Для второго подхода убедитесь, что метка принадлежит PictureBox (PictureContainer). Это можно увидеть и установить в структуре документа, где метка должна быть подузлом PictureBox. - person GDS; 01.05.2017
comment
Особенно полезно ваше «... и пересчитать его местоположение, поскольку теперь оно относится к графическому блоку, а не к форме ...»! - person PeterCo; 10.01.2019

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

label1.Parent = pictureBox1;
label1.BackColor = Color.Transparent; // You can also set this in the designer, as stated by ElDoRado1239
person Wouter    schedule 12.04.2013
comment
Thats Perfect !, никогда не использовал родительское свойство метки. Отличная работа. :) - person Bravo; 27.07.2014
comment
Для меня Color.Transparent отображается как unknown, а System.Drawing.Color.Transparent не работает после запуска ... - person kokbira; 03.06.2015
comment
Спасибо за подтверждение моего мнения, что принятый ответ излишне длинный. Кроме того, вы можете установить прозрачный BackColor в дизайнере, это тоже не нужно писать. - person ElDoRado1239; 09.08.2015
comment
Спасибо. Настройка Родителя работает нормально. Добавление метки к элементам управления PictureBox также, по-видимому, устанавливает свойство Parent (например, pictureBox1.Controls.Add (label1);). И для метки FlatStyle необходимо установить значение Standard, чтобы можно было установить для метки BackColor значение Color.Transparent. - person LT Dan; 02.03.2018

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

person Maciej    schedule 22.02.2012
comment
Спасибо! Это было единственное решение, которое помогло разместить текст (прозрачный фон) на ProgressBar. - person Prokurors; 24.07.2015

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

person Grey Wolf    schedule 02.04.2014
comment
Это решение не сработает, если изображение представляет собой анимированный gif. Анимация не будет работать в качестве фона панели. - person Chun Lin; 07.05.2016

После безуспешной попытки большинства из предоставленных решений у меня сработало следующее:

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

label1.BackColor = Color.Transparent    
person Falcon    schedule 29.04.2020

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

        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();
person Stefan Pintilie    schedule 18.10.2019

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

person Andrei Magic    schedule 19.04.2015