C # прозрачный PNG для кнопок, панелей ... как? - PullRequest
1 голос
/ 16 декабря 2010

Я много искал, видел несколько примеров, но они не работают, по крайней мере, для меня.Это то, что мне нужно: в моем приложении мне нужно использовать прозрачные значки PNG для панелей инструментов, а также для перетаскиваемых представлений визуальных объектов, то есть значок «страница» размером 72x72, который можно перетаскивать и, возможно, по всем элементам клиентской области.Сначала я думал об использовании кнопки, установите для ее BackImage прозрачный PNG и установите BackColor как «прозрачный»: он не будет работать, кнопка всегда будет отображаться сплошным цветом.Что касается панели, та же проблема: я могу поместить прозрачный PNG в качестве фонового изображения, но элемент управления никогда не выглядит «прозрачным» там, где PNG имеет прозрачные области.Я думаю то же самое с картинкой и любым другим элементом управления, позволяющим фоновые изображения.Так что, я думаю, дело в том, чтобы сделать фон элемента управления прозрачным ... Любые идеи?

Мне все равно, нужно ли мне создавать какие-то пользовательские "кнопки изображения" или "панель изображений" -что бы ни было - иметь действительно PNG прозрачные кнопки, панели и т.д!Кроме того, обратите внимание, что речь идет о прозрачности PNG с использованием альфа-канала, а не прозрачных пикселей, что в этом возрасте отстой ИМХО для достойных графических интерфейсов.

Cheers

litium

1 Ответ

1 голос
/ 17 декабря 2010

Хорошо, я нашел следующий код, который работает не только для панелей, но и для кнопок, и я предполагаю, что другие элементы управления - кроме PictureBox:

public class TransparentPanel : Panel <==change to Button for instance, and works
    {
        Timer Wriggler = new Timer();
        public TransparentPanel()
        {
            Wriggler.Tick += new EventHandler(TickHandler);
            this.Wriggler.Interval = 500;
            this.Wriggler.Enabled = true;
        }
        protected void TickHandler(object sender, EventArgs e)
        {
            this.InvalidateEx();
        }
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 
                return cp;
            }
        }
        protected void InvalidateEx()
        {
            if (Parent == null)
            {
                return;
            }
            Rectangle rc = new Rectangle(this.Location, this.Size);
            Parent.Invalidate(rc, true);
        }
        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            // Do not allow the background to be painted  
        }
    }

Работает для меня на 100%!Кажется, не работает для PictureBoxes.

...