Как я могу добавить прозрачность в форму C #, оставляя элементы управления видимыми?

UPDATE: I took a break from messing with the transparency stuff for a few days. I started messing with it again tonight. I got a new result using Hans Passant's solution: new result http://img3.imageshack.us/img3/4265/icontransp.jpg http://img3.imageshack.us/img3/4265/icontransp.jpg

Passant's solution does solve the issue of the transparent background gradient. However, I'm still running into the problem with the transparent colors in my icon blending with the form's BackColor. You can see the fuchsia around various parts of the icon in the above image.

ORIGINAL CONTENT:

Я занимаюсь этим уже несколько часов, и мне не очень повезло. Я перепутал с Control.Region, Form.TransparencyKey, Form.Opacity и парой других случайных вещей с некоторыми забавными эффектами.

В последнее время я пытался настроить свой рабочий стол и решил связываться с док-станциями приложений. Посмотрев, что может предложить док-станция Mac и несколько сторонних реализаций Windows, я решил, что хочу создать свою собственную.

В конце концов я хочу перейти к использованию Win32 API. Сейчас я просто хочу, чтобы что-то работало, используя как можно больше возможностей C # и .Net Framework.

There are a few things I want to be able to do in this application:

Display a form/menu with a gradient background. Allow the form/menu to have transparency while keeping icons opaque. Display icons that contain transparent backgrounds. The Menu and Icons should be able to receive mouse-related events (hover, leave, click, dragover, dragdrop, and a few others).

Это эффект, который я снимаю для: Желаемый эффект http://img207.imageshack.us/img207/5716/desired.jpg http://img207.imageshack.us/img207/5716/desired.jpg

Это изображение показывает визуальные эффекты, которые я пытаюсь достичь. Это был скин, который я сделал для программы Rainmeter. Изображение показывает Notepad ++ за скином с несколькими открытыми в редакторе файлами скина. Меню прозрачное, но значки остаются непрозрачными.

My Approach:

Использование формы в качестве меню показалось мне логичным выбором. У меня есть базовое понимание событий. Я не совсем уверен, как создавать свои собственные события кликов, поэтому форма облегчит работу с событиями. Я рассмотрел несколько вариантов значков. Я решил использовать PictureBox для значков, так как они могут содержать изображения и получать события.

Как только я закончил код для всей структурной логики моего меню, я начал играть с ним, пытаясь получить нужный визуальный эффект. Form.Opacity влияет на прозрачность всего в форме. Поскольку я хочу, чтобы значки были полностью непрозрачными, я оставил это свойство в покое. Я попытался установить BackColor в Color.Transparent, но это дает ошибку. Я играл с несколькими комбинациями ... Комбинированные эффекты http://img204.imageshack.us/img204/757/effectsi.jpg http://img204.imageshack.us/img204/757/effectsi.jpg

Я нарисовал градиент с помощью Drawing2D.LinearGradientBrush в растровое изображение. Это растровое изображение было затем помещено как Form.BackgroundImage или как PictureBox.Image. Если используется, размер PictureBox должен охватывать всю форму и отправляться обратно.

Я заметил, что некоторые из Form.BackgroundColor будут смешаны с контурами моих значков. Значки имеют прозрачность по краям для более плавного внешнего вида. Поскольку значки выбирают BackgroundColor формы, это заставляет меня думать, что PictureBox создает новые изображения, когда значки загружаются в форму. Полупрозрачные части изображения затем объединяются с BackgroundColor формы, когда они должны сливаться с любыми цветами позади формы.

эффект с белым рабочим столом http://img838.imageshack.us/img838/8299/whitedesktop.jpg http://img838.imageshack.us/img838/8299/whitedesktop.jpg

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

Я не совсем уверен, что делать дальше. Я чувствую, что могу получить то, что хочу, если бы смог каким-то образом сделать одну форму полностью прозрачной. Я также подумал, что мне может повезти больше, просто рисуя значки вместо использования PictureBoxes. Тогда проблема заключается в настройке значков для получения событий мыши. (Я никогда не проводил свои собственные события, и я думаю, что это потребовало бы некоторых вызовов Win32 API.)

Что еще я могу сделать с PictureBox, чтобы получить желаемый эффект? В любом случае я открыт для любых идей или предложений относительно общего эффекта, которого я пытаюсь достичь.

Ответы на вопрос(2)

Ваш ответ на вопрос