У меня есть элемент управления (полученный из System.Windows.Forms.Control), который должен быть прозрачным в некоторых областях. Я реализовал это с помощью SetStyle():
public TransparentControl()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent.
}
Теперь это работает, если между формой и прозрачным элементом управления нет элементов управления. Однако, если есть еще один элемент управления под прозрачным элементом управления (который здесь используется), он не работает. Промежуточный контроль - это не рисование, но приведенная ниже форма показывает. Я могу получить эффект, который мне нужен, переопределив CreateParams и установив flasg WS_EX_TRANSPARENT следующим образом:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20; // WS_EX_TRANSPARENT
return cp;
}
}
Проблема здесь в том, что она действительно замедляет картину элемента управления. Элемент управления уже дважды буферизирован, поэтому ничего не делать. Снижение производительности настолько плохо, что это неприемлемо. Кто-нибудь еще столкнулся с этой проблемой? Все ресурсы, которые я могу найти, предлагают использовать метод # 1, но опять же, это не работает в моем случае.
EDIT: Я должен отметить, что у меня есть обходное решение. Детский (прозрачный) элемент управления мог просто нарисовать себя на родительском объекте Graphics, но он действительно нечеткий, и мне совсем не нравится это решение (хотя это может быть все, что у меня есть).
EDIT2: Итак, следуя советам, которые я получил о том, как прозрачность работает в .NET, я реализовал интерфейс IContainer в своем пользовательском элементе управления, который содержит прозрачные элементы управления. Я создал класс, который реализует ISite, я добавляю свои дочерние элементы управления в коллекцию компонентов UserControl, свойство Container правильно выравнивается в отладчике, но я до сих пор не получаю эффект прозрачности. У кого-нибудь есть идеи?