Прежде всего, речь идет не о прозрачности элемента управления PictureBox. Речь идет о растровой прозрачности на полностью непрозрачном «холсте».
PictureBox всегда будет иметь размер 300 * 300 с белым фоном. Для контроля не требуется прозрачность.
Мне нужен способ нарисовать прозрачный прямоугольник (или что-то еще) на pictureBox, чтобы все, что там было, будет видно «через» прямоугольник.
Скажите, у меня есть следующий код
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)? Я что-то пропустил? Мне кажется, что установка прозрачной кисти делает фон «более видимым» вместо настройки объекта «менее видимым».
Спасибо за любые ответы с предложениями.
[EDIT] Кажется, у меня была неприятная ошибка в логике приложения, поэтому процедура рисования происходила в цикле, поэтому, когда я накапливал определенное количество прозрачных прямоугольников, они становились все более и более толстыми.
Код, выведенный из цикла, работает правильно.
Мой плохой.