Как добиться прозрачного BackColor на оригинальном элементе управления WinForms? - PullRequest
3 голосов
/ 02 декабря 2010

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

Картинка стоит тысячи слов:

alt text

И еще несколько слов:
То, что стоит за CheckBox, окрашено PictureBox и Button.
CheckBox s BackColor установлен на Transparent. Но почему-то он решает, что это означает, что он должен разделить BackColor содержащего Form (это его идея иллюзии прозрачности?).

Разве это не возможно в WinForms? Я могу поклясться, что делал это раньше.

UPDATE:
Я только что попробовал это:
В этой форме установите CheckBox BackColor на Transparent, затем измените BackColor содержащего Form на другой цвет, и CheckBox будет соответствовать этому BackColor. Что за .......?

Ответы [ 3 ]

6 голосов
/ 02 декабря 2010

Это побочный эффект элементов управления Windows. За рисование отвечает само окно, об этом заботятся методы OnPaintBackground и OnPaint.

Эта модель рендеринга плохо поддерживает прозрачность. Существует поддержка истинной прозрачности с помощью многослойных окон. Это реализовано с помощью видеоадаптера, Windows использует функцию аппаратного наложения. Но это работает только для окон верхнего уровня, а не для дочерних окон. Обратите внимание на свойства Form.Opacity и Form.TransparencyKey.

Есть частичная поддержка прозрачности через трюк. Элемент управления может подделать его, попросив родительское окно сначала нарисовать себя внутри окна элемента управления. Это создает фоновые пиксели, а затем может рисовать поверх этого. Установка для свойства BackColor значения Color.Transparent позволяет использовать этот прием для элементов управления, которые поддерживают это. Все производные от ButtonBase классы делают. Но не элементы управления, которые являются обертками для собственных элементов управления Windows.

«Запрашиваемое родительское окно» - это то, где недостаток этого трюка становится видимым на снимке экрана. Вы видите форму пикселей. Эффекты суммирования не работают, он никогда не рассматривает какое-либо промежуточное окно в Z-порядке, только родительское. Это поправимо, но очень ужасно, есть статья в КБ, в которой показан код.

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

1 голос
/ 03 декабря 2010

Боб Пауэлл написал превосходную статью о прозрачных элементах управления.Проверьте это:

http://www.bobpowell.net/transcontrols.htm

1 голос
/ 02 декабря 2010

Можете ли вы установить задний цвет флажка вручную на нужный вам цвет?(Значение в картинке за ним)

«Прозрачный» может означать что-то отличное от того, что вы хотите MS.

Кроме того, попробуйте изменить порядок сортировки изображений (перенести на передний план) ипосмотрите, не изменит ли это основной цвет флажка.

...