2010-01-13 8 views
0

Прежде всего, это не значит, что управление 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] Кажется, у меня была неприятная ошибка в логике приложения, поэтому процедура рисования произошла в цикле, поэтому, когда я накопил определенное количество прозрачных прямоугольников, они стали все более и более толстыми.

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

Мой плохой.

ответ

0

alt text http://lh4.ggpht.com/_1TPOP7DzY1E/S02ivAoGgTI/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); 
    } 

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

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

фон «виднее» и объект «менее заметными» одно и то же ...

+0

Они то же самое только для перекрытия части. –

+0

Как ваше решение, так и мои примеры в порядке. Кажется, у меня была ошибка цикла. –

+0

обновлен примером строки. – serhio

Смежные вопросы