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

StackOverflow https://stackoverflow.com/questions/86143

Вопрос

Есть пара хитростей для получения поддержки glass для .Чистые формы.

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

Это было полезно?

Решение

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

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

Другие советы

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

В конце концов я сделал кое-что отвратительное.Создал свой собственный пользовательский интерфейс с помощью GDI +.(Кнопки, закругленные надписи и т.д.).Это выглядит одинаково независимо от версии Windows.Конкурсы.Формы действительно уродливы, но это все, что у вас есть в XP < сбоку.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top