Как сделать PictureBox действительно прозрачным - PullRequest
2 голосов
/ 31 декабря 2011

У меня есть PictureBox, который можно перемещать по вертикали. Изображение, отображаемое в PictureBox, представляет собой прозрачный GIF, поэтому при просмотре в средстве просмотра изображений оно не имеет фона.

Проблема в том, что когда я перемещаю PictureBox в приложении, фон PictureBox перемещается слишком странно - почти как если бы PictureBox сам имел фон.

До:

enter image description here

После (во время движения):

enter image description here

Некий код:

path = "C:\\note.gif";
note.Image = Image.FromFile(path);
note.Visible = true;
note.BackColor = Color.Transparent;
panel.Controls.Add(note);

Я также пытался сделать буфер рисунка с двойной буферизацией, но это тоже не работает.

Ответы [ 2 ]

4 голосов
/ 31 декабря 2011

Хотя WinForms плохо подходит для прозрачности в пользовательском контроле, это возможно.См. эту статью здесь.В нем автор предлагает использовать вместо PanelControl Panel и переопределить метод OnPaintBackground, чтобы ничего не делать.это остановит ваш фон от рисования

protected override void OnPaintBackground(PaintEventArgs pevent)
{
    //do nothing
}

protected override void OnMove(EventArgs e)
{
    RecreateHandle();
}

// Override the CreateParams property:
protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle = 0x00000020; //WS_EX_TRANSPARENT
        return cp;
    }
}

Наконец, переопределяя функцию OnPaint, вы можете нарисовать свой Picturebox.обратите внимание, вы получите мерцание и размытость, если вы перемещаете его по экрану в режиме реального времени.

Используя эту и аналогичные методики, нам удалось получить приложение WinForms Premex XPort для рендеринга с похожим брендом на их веб-сайте.Это включало несколько прозрачных элементов управления, рисование хаков и все виды, чтобы заставить его отображаться правильно.

В заключение, причина, по которой Winforms делает это плохо, заключается в технологиях на основе Win32: один элемент управления владеет одним пикселем на экране.Нет никакого способа по-настоящему составить пиксели с прозрачностью, как вы ожидаете в HTML или WPF.Более поздние технологии Windows (WPF) делают это особенно хорошо, поэтому, если вы действительно хотите интенсивно использовать прозрачность в своем приложении, я бы предложил перейти на эту платформу, по крайней мере частично (WPF можно разместить в WinForms и наоборот).

С уважением,

2 голосов
/ 31 декабря 2011

Элементы управления Win32 не являются действительно прозрачными.

Вы можете выбрать:

  • Изменить на WPF
  • Используйте PictureBox.Region, чтобы обрезать ненужные элементы управления ("прозрачный"") Площади
  • Проверьте, есть ли сторонние элементы управления, которые будут делать то, что вы хотите
...