2009-05-03 3 views
1

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

Любые идеи ???

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

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

Спасибо,

+0

Что именно вы пытаетесь сделать? Как вы знаете, непрозрачная панель находится поверх прозрачной, если она прозрачна? – bsneeze

+0

Я могу установить прозрачность прозрачной панели. В настоящее время он установлен на уровне 50%. Поэтому я знаю, какой из них стоит на вершине. – Prithis

+0

Не могли бы вы разместить простой пример для pasteit.net (или любого другого сайта для обмена кодами)? Я был бы рад помочь больше – STW

ответ

0

Если все панели/этикетки/управления являются частью одного 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 Компоновка вызовы предотвратить UI от обновления в то время как вы переставить вещи

+0

Спасибо Yoooder Я пробовал ваше решение, но боюсь, что это не сработало. Я добавил код в конструктор формы после InitialiseComponent. – Prithis

5

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

Два брата и сестры одного и того же элемента управления будут рисовать друг над другом.

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

+0

Я думаю, что Пол прав. Я пробовал обезболивать события Paint и не мог заставить его сделать что-нибудь полезное для вашей ситуации. Вы можете заставить работать какой-нибудь хак, где вы только рисуете непересекающиеся прямоугольники или что-то в этом роде, но это кажется слишком сложным. Его можно просто добавить в качестве дочернего элемента управления, даже если он динамически. –

1

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

Смежные вопросы