Вопрос

Прежде всего, речь идет не о том, чтобы сделать управление PictureBox прозрачным. Речь идет о прозрачности растрового изображения на полностью непрозрачном «холсте».

В PictureBox всегда будет размером 300*300 с белым фоном. Прозрачности не требуется для контроля.

Что мне нужно, так это способ натянуть прозрачный прямоугольник (или что -то еще) на рисунок, так что все, что было уже там, будет видно «через« прямоугольник ».

Скажи, что у меня есть следующий код

Bitmap bmp = new Bitmap(300, 300);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 100, 100);
pictureBox.Image = bmp;

Это нарисует красный прямоугольник в середине белого холста. Теперь мне нужен еще один (прозрачный) «слой» на картинке, содержащем другой прямоугольник, но тот, который является прозрачным.

я могу попробовать

Brush brush = new SolidBrush(Color.FromArgb(128, 0, 80, 0));
g.FillRectangle(brush, 50, 50, 200, 200);

Поскольку я использую цвет, указывая его альфа = 128, полученный прямоугольник должен быть прозрачным, поэтому первый красный прямоугольник должен быть просмотрен через этот другой зеленый.

Однако это не происходит правильно. Я вижу красный прямоугольник за новым зеленым, но часть зеленого прямоугольника, которая не перекрывает красный, останется совершенно непрозрачной. Однако, если я установите альфа-значение цвета на некоторое чрезвычайно небольшое значение (скажем, 1-5), весь прямоугольник будет выглядеть прозрачным. На мой взгляд, это не нормально - что 5/255 только наполовину прозрачна, и что 128/255 вообще не является прозрачным ... и если ранее была нарисована строка с G.DrawString (), строка либо отображается позади позади. Зеленый прямоугольник или это не так, в зависимости от уровня прозрачности. Например, если альфа больше или равна (около) 40, строка вообще не видна, и если она составляет менее 40, то она будет показана, более видимая для меньших альфа -значений, вплоть до альфа = 0.

Как применяется эта щетка (при создании цвета argb)? Я что-то упускаю? Для меня кажется, что установка прозрачной кисти делает фон «более заметным» вместо того, чтобы устанавливать объект «менее заметным».

Спасибо за любые ответы с предложениями.

РЕДАКТИРОВАТЬ Похоже, у меня была неприятная ошибка в логике приложения, поэтому процедура рисования произошла в цикле, поэтому, когда я накопил определенное количество прозрачных прямоугольников, они становились все более и более толстыми.

Код, выведенный из петли, работает правильно.

Виноват.

Это было полезно?

Решение

Alt Text http://lh4.ggpht.com/_1tpop7dzy1e/s02ivaogti/aaaaaaaac6s/zqvzq5gdwsu/s800/capture4.png

выполняется этим кодом:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Bitmap bmp = new Bitmap(300, 300);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
        g.FillEllipse(new SolidBrush(Color.Blue), 25, 25, 100, 200);
        g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 300, 100);
        g.DrawString("this is a STRING", SystemFonts.DefaultFont, 
            Brushes.Black, new Point(150, 150));
        pictureBox1.Image = bmp;

        Brush brush = new SolidBrush(Color.FromArgb(40, 0, 80, 0));
        g.DrawRectangle(Pens.Black, 50, 50, 200, 200);
        g.FillRectangle(brush, 50, 50, 200, 200);
    }

Зеленая часть не является непрозрачной, как вы можете видеть ... струна идеально видна.

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

Фон "более заметный" и объект "менее заметный" - это одно и то же ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top