Помогите получить приложения .Net WinForms для поддержки Vista Aero Glass

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

Я думаю, что исходный источник этого метода находится здесь: http://blogs.msdn.com/tim/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 - мне нужно, чтобы они постепенно деградировали. Есть ли здесь какие-нибудь передовые практики?


person Keith    schedule 17.09.2008    source источник


Ответы (5)


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

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

person TheSmurf    schedule 17.09.2008

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

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

person Martin Marconcini    schedule 17.09.2008

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

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

person Abe Heidebrecht    schedule 17.09.2008
comment
Спасибо, но это не работает после SP1 - вроде коробка должна быть черной. - person Keith; 18.09.2008

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

person Keith    schedule 17.09.2008

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

person softwerx    schedule 09.07.2009