Хотя WinForms плохо подходит для прозрачности пользовательских элементов управления, это возможно. См. эту статью здесь. В нем автор предлагает наследовать от Panel, а не от UserControl, и переопределить метод 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, вы можете нарисовать свой графический блок.
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//Do your drawing here
}
Используя это, вы можете создать настраиваемое графическое окно с прозрачностью, хотя обратите внимание, что вы получите мерцание и размытие, если вы будете перемещать его по экрану в реальном времени.
Используя этот и аналогичные методы, нам удалось получить приложение WinForms, Premex XPort для рендеринга с таким же брендингом, что и их веб-сайт. Это включало в себя несколько прозрачных элементов управления, хаки для рисования и всевозможные способы правильного отображения.
В заключение, причина, по которой Winforms делает это плохо, заключается в технологиях на основе Win32, один элемент управления владеет одним пикселем на экране. Невозможно создать действительно составные пиксели с прозрачностью, как можно было бы ожидать в HTML или WPF. Более поздние технологии Windows (WPF) делают это особенно хорошо, поэтому, если вы действительно хотите интенсивно использовать прозрачность в своем приложении, я бы предложил перейти на эту платформу, по крайней мере, частично (WPF может быть размещен в WinForms и наоборот).
С наилучшими пожеланиями,
person
Dr. Andrew Burnett-Thompson
schedule
31.12.2011
note.Invalidate();
после перемещения? Илиpanel.Invalidate();
? - person LarsTech   schedule 31.12.2011