Wczoraj udało się dodać przezroczystość do Labeli. Teraz fajnie by było, gdyby jeszcze obrazy w PictureBox’ach zachowywały przezroczystość zapisaną np. w plikach PNG. Oczywiście standardowo Visual Studio olewa całkowicie wszystko co jest związane z przezroczystością. Trzeba stworzyć swoją nową, ulepszoną wersję PictureBox’a. MSND Library ma nawet wpis na ten temat pt. „How to: Draw Images with Transparency„. Przykładowy kod można użyć do stworzonej wczoraj klasy TransparentLabel.
I tak, dodajemy do niej tylko obraz który ma się wyświetlać:
public Bitmap myimage { get; set; }
a następnie zmieniamy lekko OnPaint:
protected override void OnPaint(PaintEventArgs e)
{
if (!base.HasBackground)
{
if (off_screen == null)
{
off_screen = new Bitmap(ClientSize.Width, ClientSize.Height);
}
using (Graphics g = Graphics.FromImage(off_screen))
{
using (SolidBrush brush = new SolidBrush(Parent.BackColor))
{
g.Clear(BackColor);
g.FillRectangle(brush, ClientRectangle);
}
}
}
else
{
using (SolidBrush brush = new SolidBrush(ForeColor))
{
ImageAttributes attr = new ImageAttributes();
attr.SetColorKey(Color.Transparent, Color.Transparent);
Rectangle dstRect = new Rectangle(0, 0, myimage.Width, myimage.Height);
e.Graphics.DrawImage(myimage, dstRect, 0, 0, myimage.Width, myimage.Height,
GraphicsUnit.Pixel, attr);
}
}
}
Na koniec wystarczy wywalić wszystko, co było potrzebne w Labelu, a nie jest potrzebne tutaj i zmienić nazwę klasy na TransparentPanel.