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


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

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

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

5 56

5 ответов:

элемент управления 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


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

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

[Designer(typeof(ParentControlDesigner))]
class PictureContainer : PictureBox {}

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

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

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

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

когда overallpercent значение изменения, обновить элемент управления PictureBox:

pictureBox1.Refresh();

вы также можете использовать графики.Но это не совсем так.DrawText (с помощью GDI) быстрее, чем DrawString (GDI+)

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

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

используя Visual Studio с формой Windows, вы можете применить прозрачность к меткам или другим элементам, добавив использование системы.Рисование; на форма form1.Дизайнер.cs таким образом, Вы будете иметь прозрачность, доступную из панели свойств ( по внешнему виду в BackColor ). Или просто редактировать код в конструкторе.cs этого.label1.BackColor = Система.Рисунок.Цвет.Прозрачный;