Прозрачная панель поверх другой обычной панели - PullRequest
1 голос
/ 03 мая 2009

Я хочу показать прозрачную панель поверх другой панели, обе панели имеют дочерние элементы управления, такие как метки, текстовые поля и т. Д. Прозрачность работает нормально, если прозрачная панель является дочерним элементом управления другой панели, но если нет, то метка и текстовое поле обычной панели появляется сверху прозрачной панели. Прозрачность для остальной части области работает отлично.

Есть идеи ???

Я пытался вывести прозрачную панель вперед, но это не помогло. Возможно, мне нужно указать порядок, в котором элементы управления должны быть нарисованы? Если да, то как мне это сделать?

Интересно, если я перенесу приложение ниже панели задач и выведу его. Достигает правильного результата. (Перепечатка решает проблему !! но почему ??). Однако, когда я минимизирую это и восстанавливаю, это не исправляет это!

Спасибо

Ответы [ 3 ]

5 голосов
/ 05 мая 2009

Прозрачность в Windows.Forms реализуется реляционной иерархией, а не визуальной иерархией. Когда отображается прозрачный элемент управления, .NET в основном вызывает родительское дерево, запрашивая каждый родительский элемент управления для рисования, а затем рисует сам фактический элемент управления.

Два родных брата в одном контроле закрашивают друг друга.

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

1 голос
/ 26 мая 2011

Если вам нужен прозрачный элемент управления, который не затеняет своих братьев и сестер, в соответствии с Бобом Пауэллом вы можете сделать это, переопределив метод CreateParams для добавления истинной прозрачности. Прочитайте ссылку для полного описания.

0 голосов
/ 05 мая 2009

Если все ваши панели / метки / элементы управления являются частью одного UserControl, то вы, вероятно, правы, что вам просто нужно установить Z-порядок (порядок от начала до конца). Это можно сделать с помощью структуры документа в конструкторе Visual Studio в меню «Просмотр»> «Другие окна»> «Структура документа».

Если вы делаете это программно, тогда вы можете поиграть с вызовом Control.BringToFront () или Control.SendToBack (), чтобы изменить их z-порядок. Один из возможных способов сделать это: предположить, что ctl1 должен быть сзади, а ctl4 предназначен для фронтального режима.

SuspendLayout()
ctl1.BringToFront()
ctl2.BringToFront() ' Bring ctl2 in front of ctl1
ctl3.BringToFront() ' 3 in front of 2 (and in turn 1)
ctl4.BringToFront() ' 4 in front of the rest
ResumeLayout()

Вызовы макета Suspend / Resume не позволяют обновлять пользовательский интерфейс во время перестановки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...