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

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

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

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

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

Похоже, что во время выполнения:

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


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

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

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

 pictureBox1.Refresh(); 

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

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

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

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

Interesting Posts

Должен ли я всегда возвращать IEnumerable вместо IList ?

Установка Android Studio на Windows 7 не удалась, не найден JDK

какова разница между локальными и переменными экземпляра в Java

Удалить атрибут readonly из каталога

Почему вызов c_str () для функции, которая возвращает строку, не работает?

Как копирование файлов работает в отношении ОЗУ, и могу ли я ускорить это?

Как вы это называете, когда один интерфейс «наследует» от другого?

Как поймать конкретное исключение в JDBC?

Вызов внешней функции classа из внутреннего classа

Как вы можете подключить три внешних дисплея к ноутбуку с одним портом vga или dvi и большим количеством портов USB?

Автозапуск Windows 7

PDF Где читатель Acrobat сохраняет информацию о последних настройках просмотра?

Почему шаблоны могут быть реализованы только в файле заголовка?

Visual Studio 2013 и инструмент настройки веб-конфигурации ASP.NET

Должен ли я установить DirectX 9.0 (c) на мою машину RTM для Windows 7?

Давайте будем гением компьютера.