Прозрачное изображение над элементом управления - PullRequest
0 голосов
/ 19 сентября 2018

Я делаю приложение с заставкой.

У меня есть изображение, которое я хотел бы поместить ниже индикатора выполнения, например:

Пример

Example

Мне удалось сделать растровое изображение прозрачным.Но теперь изображение находится за индикатором выполнения

Сейчас

Now

Есть ли способ получить изображение перединдикатор выполнения?Спасибо.F.

код:

public partial class Form1 : Form
{
    Bitmap m_l;
    public Form1()
    {
        InitializeComponent();

        m_l = Properties.Resources.LU;

        m_l.MakeTransparent(Color.Transparent);
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawImage(m_l, new Rectangle(new Point(0, -40), new Size(200, 264))); progressBar1.Refresh();
    }
}

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

(извините, что пропустил функцию ответа, но ответ слишком длинный для комментария)

@ TaW, кажется, вы не совсем поняли подход, поэтому я попытаюсь объяснить его более подробно

ОП спросил, может ли он сделать прозрачное изображение поверх другого элемента управления (индикатор выполнения)

Я предположил, что это прозрачное изображение находится внутри PictureBox, вы, похоже, предполагаете, что какой-то другой элемент управления

Расположите элемент управления, если мое предположение правильно, окно с картинкой, перед индикатором выполнения все, что ему нужно сделать, это щелкнуть правой кнопкой мыши и нажать «Переместить на передний план» на PictureBox

, и там у вас есть «прозрачный»PictureBox находится напротив индикатора выполнения, но, как вы упомянули в своем ответе, мы не можем останавливаться на достигнутом, поскольку «прозрачность» - это не то, что я ожидал, но, очевидно, вы знали - это «выбор цвета родительского фона», который делает WinForms, и в итоге мы получаем неполностью прозрачное изображение перед ProgressBar, но вместо этого с серым фоном

Теперьразмещенный URL-адрес приходит на место: http://www.richardhyland.com/diary/2009/05/26/how-to-truely-make-a-picturebox-background-transparent/

Это код, предоставленный и объясненный в этом URL:

public static System.Drawing.Drawing2D.GraphicsPath Transparent(Image im)
{
    int x;
    int y;
    Bitmap bmp = new Bitmap(im);
    System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
    Color mask = bmp.GetPixel(0, 0);

    for (x = 0; x <= bmp.Width - 1; x++)
    {
        for (y = 0; y <= bmp.Height - 1; y++)
        {
            if (!bmp.GetPixel(x, y).Equals(mask))
            {
                gp.AddRectangle(new Rectangle(x, y, 1, 1));
            }
        }
    }
    bmp.Dispose();
    return gp;
}

Таким образом, мы можем достичь полностью прозрачного поля изображения перед прогрессом.bar.

Итак, без этого кода у нас есть это:

Но с этим кодом:

Обратите внимание, у этого подхода есть некоторые недостатки:

  1. не работает идеально - так как вы можете видеть серые пиксели по краям изображения
  2. плохо работает на больших изображениях - так какполучение каждого пикселя с GetPixel - это «вызов»

(Пожалуйста, не обращайте внимания на тот факт, что на изображении показано «JPG», а я говорю о прозрачных изображениях - это было только первое изображение, представленное поиском в Googleмне и да, файл прозрачный png)

0 голосов
/ 19 сентября 2018

Вы можете сделать это, используя PictureBox с Region.

Добавьте PictureBox к вашей форме.Это будет держать изображение.Поместите его так, чтобы он перекрывал ProgressBar так, как вы хотите.Установите для свойства Image наложенное изображение.

В конструкторе формы мы собираемся установить Region этого PictureBox.Регион определяет форму элемента управления.Мы собираемся установить Region равным непрозрачным частям изображения.

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
    pictureBox1.Region = CreateRegion(Properties.Resources.LU);
  }

  private static Region CreateRegion(Bitmap maskImage)
  {
    // We're using pixel 0,0 as the "transparent" color.
    Color mask = maskImage.GetPixel(0, 0);
    GraphicsPath graphicsPath = new GraphicsPath();
    for (int x = 0; x < maskImage.Width; x++)
    {
      for (int y = 0; y < maskImage.Height; y++)
      {
        if (!maskImage.GetPixel(x, y).Equals(mask))
        {
          graphicsPath.AddRectangle(new Rectangle(x, y, 1, 1));
        }
      }
    }

    return new Region(graphicsPath);
  }
}

Screenshot of form

Большая часть этого кода пришлас здесь

0 голосов
/ 19 сентября 2018

Есть 5 6 опции:

  1. Вы можете установить ProgressBar's BackColor на Transparent.Результат:

enter image description here

Перевод:

Недопустимое значение свойства.Этот элемент управления не поддерживает прозрачный фоновый цвет.

Это будет справедливо и для подкласса.

Вы можете вкладывать прозрачный Panel с изображением в качестве BackgroundImage.Результат:

enter image description here

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

Вы можете наложить на панель.

Результат:

enter image description here

Похоже,Но на этот раз задний цвет является исходным фоном того места, где была панель, до ее наложения.Это способ winforms подделок прозрачности;этот фиктивный транспарен будет работать только с вложенными элементами управления, но не со всеми ..

Вы можете нарисовать свое изображение в событии индикатора прогресса Paint.Проблема: у него его нет.И если вы сделаете его подклассом, он не будет работать для вас.

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

Последний вариант: Напишите свой собственный .Вы можете создать подкласс Panel или Label и написать свой собственный индикатор выполнения.Многие люди, которые хотели иметь индивидуальный вид, сделали это, и вы можете найти много готовых примеров.

Upate: Похоже, у вас может быть 6-й вариант, который будетработать тогда и только тогда, когда вам не нужна полупрозрачность, например сглаживание и т. д.: вы можете создать GraphicsPath, чтобы создать Region, который будет маскировать некоторый контроль над изображением .. Так что, хотя мой пример не будет работать, изображение OP может выглядеть вполне нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...