Прозрачный PNG в PictureBox

Я пытаюсь сделать простое приложение, которое позволяет сравнивать изображение с прозрачными шаблонами PNG, перетаскивая шаблон поверх изображения. Для этого мне нужен способ создать PictureBox, который будет содержать изображение PNG и быть прозрачным там, где прозрачный PNG. Все работает нормально, но часть прозрачности: когда я загружаю изображение PNG в PictureBox (цвет фона установлен на прозрачный), он показывает цвет фона содержащей панели, а не изображения, на котором он наведен.

Я искал, но нашел только способ сделать PictureBox полностью прозрачным.


person SimSimY    schedule 23.11.2009    source источник


Ответы (2)


Трудно сделать элемент управления частично прозрачным.

Что вам нужно сделать, так это обработать нижнее событие PictureBox Paint (то, которое не обязательно должно быть прозрачным), и нарисовать оверлейное изображение с помощью e.Graphics.DrawImage(image, x, y). Это позволит правильно рисовать прозрачные и полупрозрачные изображения.

ИЗМЕНИТЬ: в ответ на ваш комментарий нет ничего плохого в вызове метода Invalidate в событии MouseMove. Однако вы заметите некоторое мерцание. Чтобы устранить мерцание, создайте элемент управления, наследующий PictureBox, и вызовите SetStyle(ControlStyles.DoubleBuffered, true) в конструкторе.

person SLaks    schedule 23.11.2009
comment
проблема в перетаскивании - разве не будет катастрофой, если мне нужно перерисовать изображение при каждом перемещении мыши на пиксель? - person SimSimY; 23.11.2009
comment
Чтобы устранить мерцание, в большинстве случаев я обнаружил, что Update (); работает лучше. - person ; 17.10.2010
comment
@lucifer: Вызов Update() не уменьшит мерцание. - person SLaks; 17.10.2010

Это отлично работает, если вы добавляете pictureBoxOnTop в список элементов управления pictureBoxToBeHovered для зависания.

        pictureBoxToBeHovered.Controls.Add(pictureBoxOnTop);
        pictureBoxOnTop.BackColor = Color.Transparent;
        pictureBoxOnTop .Location = new Point(0,0) ;
person CSharper    schedule 07.04.2013