Прозрачен PNG в PictureBox

Опитвам се да направя просто приложение, което позволява на човек да сравнява изображение с прозрачни PNG шаблони, като плъзга шаблона върху картината. За това имам нужда от начин да създам PictureBox, който ще съдържа PNG изображението и ще бъде прозрачен, когато png е прозрачен. Всичко работи добре, но частта за прозрачност: Когато заредя PNG изображение в PictureBox (цветът на фона е настроен на прозрачен), той показва цвета на фона на съдържащия панел, а не изображението, върху което се движи.

Търсих, но намерих само начин да направя PictureBox напълно прозрачен.


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


Отговори (2)


Трудно е да се направи контрол, който да е частично прозрачен.

Това, което трябва да направите, е да обработите събитието Paint на по-ниското PictureBox (това, което не трябва да е прозрачно) и да начертаете насложеното изображение, като използвате 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