Установка родительского элемента usercontrol предотвращает его прозрачность - PullRequest
5 голосов
/ 17 декабря 2008

Я создал простой пользовательский элемент управления, который создается вручную с помощью чего-то вроде

MyUserControl ctrl = new MyUserControl();

Элемент управления был разработан, чтобы иметь BackColor = Color.Transparent , и это прекрасно работает, пока я не установлю Parent элемента управления в форму, в которой он превращается в цвет формы.

Может показаться прозрачным, но он скрывает все элементы управления, существующие в форме. Я не уверен на 100%, что это элемент управления, который получает сплошной фон или что-то еще, что происходит, когда я подключаю его, что мешает отображению других элементов управления.

В основном, если вы делаете это

  • Создать форму
  • Нажмите на кнопку
  • В обработчике клика для кнопки вы делаете следующее
* * Пример тысяча двадцать-одина * * тысяча двадцать-дв
MyUserControl ctrl = new MyUserControl();
ctrl.Parent = this;
ctrl.BackColor = Color.Transparent;
ctrl.Size = this.Parent.ClientRectangle.Size;
ctrl.Location = this.Parent.ClientRectangle.Location;
ctrl.BringToFront();
ctrl.Show();

По сути, я хочу, чтобы usercontrol перекрывал всю форму, показывая на ней нижележащие элементы управления (отсюда и прозрачный фон). Я не хочу добавлять его в коллекцию элементов управления формами, потому что он на самом деле не принадлежит форме, он просто отображается поверх всего остального

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

Спасибо!

РЕДАКТИРОВАТЬ: если я переопределить метод OnPaintBackground в пользовательском контроле и не буду рисовать фон, то он будет работать, однако это будет мешать прозрачным частям изображения PNG, которое я рисую в элементе управления с помощью DrawImage, что имеет смысл.

1 Ответ

6 голосов
/ 17 декабря 2008

Windows Forms не поддерживает прозрачные элементы управления.
Вы можете обойти это ограничение, переопределив свойство CreateParams элемента управления и установив собственный стиль (найдите его в Google).
Кроме того, вы должны переопределить рисование вашего элемента управления, чтобы перерисовывать не только ваш элемент управления, но и родительский элемент управления. Причина в том, что фон должен быть закрашен до того, как ваш контроль закрасит себя.
Наконец, вы должны переопределить метод OnPaintBackground, как вы это сделали, чтобы убедиться, что фон не закрашен.

Довольно неуклюжий и не идеальный, но он должен работать.

...