Помогите получить приложения .Net WinForms для поддержки Vista Aero Glass - PullRequest
4 голосов
/ 17 сентября 2008

Существует несколько приемов получения поддержки стекла для форм .Net.

Я думаю, что оригинальный источник для этого метода здесь: http://blogs.msdn.com/tims/archive/2006/04/18/578637.aspx

В основном:

//reference Desktop Windows Manager (DWM API)
[DllImport( "dwmapi.dll" )]
static extern void DwmIsCompositionEnabled( ref bool pfEnabled );

[DllImport( "dwmapi.dll" )]
static extern int DwmExtendFrameIntoClientArea( IntPtr hWnd, ref MARGINS pMarInset );


//then on form load
//check for Vista
if ( Environment.OSVersion.Version.Major >= 6 )
{
    //check for support
    bool isGlassSupported = false;
    DwmIsCompositionEnabled( ref isGlassSupported );

    if ( isGlassSupported )
        DwmExtendFrameIntoClientArea( this.Handle, ref margins );
...

//finally on print draw a black box over the alpha-ed area
//Before SP1 you could also use a black form background

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

Например, полоса табуляции над областью класса будет иметь прозрачный текст.

Есть ли способ обойти это?

Есть ли более простой способ сделать это?

Приложения, над которыми я работаю, должны работать как на XP, так и на Vista - мне нужно, чтобы они корректно ухудшались. Есть ли здесь лучшие практики?

Ответы [ 5 ]

3 голосов
/ 17 сентября 2008

Там действительно нет более простого способа сделать это. Эти API не доступны .NET Framework (пока), поэтому единственный способ сделать это - через какое-то взаимодействие (или WPF).

Что касается работы с обеими версиями Windows, у вас должен быть хороший код, так как среда выполнения не ищет точку входа в DLL, пока вы на самом деле не вызовете функцию.

1 голос
/ 17 сентября 2008

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

В приложении Windows Forms вы просто нужно установить TransparencyKey свойство цвета, который вы не будете использовать в другом месте приложения (я использую Гейнсборо, по причинам, которые будут станет очевидным позже). Тогда ты можешь создать одну или несколько панелей, которые пристыкован к краям вашей формы и установить цвет фона для панели к ключу прозрачности. Теперь, когда ты вызовите DwmExtendFrameIntoClientArea, стекло покажет в своих рамках где бы вы ни установили что-то из соответствующий ключ прозрачности.

1 голос
/ 17 сентября 2008

ДэнниСмурф сказал это. У вас нет прямого «управляемого» доступа к этим API через платформу .NET (я сам пробовал несколько недель назад).

Я закончил тем, что делал что-то противное. Создал свой собственный интерфейс с GDI +. (Кнопки, округлые метки и т. Д.). Выглядит одинаково независимо от версии Windows. Win.Forms действительно ужасны, но это все, что у вас есть на стороне XP.

0 голосов
/ 09 июля 2009

Дешевый хак, который вы можете использовать, это поместить прозрачный элемент управления Panel на вашу форму и поместить на него элементы управления - тогда черный будет черным.

0 голосов
/ 17 сентября 2008

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

...