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