Прежде всего, это не значит, что управление PictureBox прозрачным. Речь идет о прозрачности растрового изображения на полностью непрозрачном «холсте».Графическая прозрачность на 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] Кажется, у меня была неприятная ошибка в логике приложения, поэтому процедура рисования произошла в цикле, поэтому, когда я накопил определенное количество прозрачных прямоугольников, они стали все более и более толстыми.
Код, выведенный из цикла, работает правильно.
Мой плохой.
Они то же самое только для перекрытия части. –
Как ваше решение, так и мои примеры в порядке. Кажется, у меня была ошибка цикла. –
обновлен примером строки. – serhio