.NET Framework 4.0 и рисунок по проблеме Aero Glass

В моем приложении у меня есть форма, которую я настраиваю, используя метод DWM API DwmExtendFrameIntoClientArea, чтобы увеличить высоту строки заголовка Aero Glass, чтобы часть моей клиентской области формы отображалась на кадре Aero. Чтобы добиться этого эффекта, я также рисую черный прямоугольник в части клиентской области, которая находится «над» стеклянной рамкой, чтобы она выглядела прозрачной, как предлагают многие статьи в Интернете. Это работало довольно хорошо под Windows Vista / Windows 7, но, поскольку я скачал VS 2010 и использовал .NET Framework 4.0 в качестве платформы trarget для создания моего приложения, этот подход больше не работает. Проблема в том, что виден черный прямоугольник, т.е. черный цвет больше не считается прозрачным при рисовании на стекле Aero. Есть ли у кого-нибудь идеи, что с этим может быть не так и как это можно преодолеть?


person WorldIntruder    schedule 19.04.2010    source источник
comment
Aero glass работает на Windows 7? Я думаю, что это работает только с DWM в Windows Vista.   -  person Svisstack    schedule 19.04.2010
comment
@Svisstack: Да; Aero Glass работает в Windows 7.   -  person SLaks    schedule 19.04.2010
comment
Ага, работает. Что не работает, так это рисование на нем так, как я делал при использовании более ранних версий .NET (‹4.0)   -  person WorldIntruder    schedule 19.04.2010
comment
@Svisstak Вы видели Windows 7? В нем явно есть Aero Glass (хотя я понимаю, что могут быть небольшие стилистические изменения).   -  person Jonathan Sterling    schedule 03.12.2010


Ответы (2)


Ответ на этот вопрос описан здесь: http://msdn.microsoft.com/en-us/magazine/cc163435.aspx#S6 с решениями для C #.

Выдержка со связанной страницы (если ссылка не работает):

Использовать стекло в качестве фона в вашем окне немного сложно. Если вы визуализируете что-либо естественно непрозрачное (например, функции GDI), вы получите визуализацию вашего элемента на стекле, хотя иногда с неожиданными результатами. Если вы хотите фактически наложить рендеринг на стеклянную поверхность, вам необходимо воспользоваться функциональностью, использующей альфа-канал цветов, например GDI +, Windows Presentation Foundation или Windows XP Theme API.

Одна конкретная проблема заключается в том, что для рендеринга элемента GDI в черном используется битовый шаблон 0x00000000, который также оказывается полностью прозрачным черным, если вы используете альфа-канал. Это означает, что если вы рисуете черной кистью или ручкой GDI, вы получите прозрачный цвет, а не черный. Самая большая проблема, возникающая при этом, - это когда вы пытаетесь использовать цвет текста по умолчанию в элементе управления текстовой меткой, которая находится в области стекла. Поскольку цвет текста по умолчанию обычно черный, DWM будет считать его прозрачным, и текст будет написан на стекле неправильно.

И решение для WinForms:

К счастью, есть несколько способов обойти эту проблему. Одно из них - использование элементов управления, отрисовываемых владельцем. Другой вариант - рендеринг в растровое изображение с альфа-каналом. К счастью, самый простой способ получить текст на элементах управления - позволить .NET Framework 2.0 использовать GDI + за вас. Это легко сделать, установив свойство UseCompatibleTextRendering в ваших элементах управления. По умолчанию для этого свойства установлено значение false, чтобы элементы управления, написанные для предыдущих версий .NET Framework, отображали то же самое. Но если вы установите для него значение true, ваш текст будет выглядеть правильно. Вы можете установить свойство глобально с помощью метода Application.SetUseCompatibleTextRenderingDefault. Если вы используете Visual Studio® 2005, код шаблона будет включать вызов, чтобы установить для совместимого отрисовки текста значение false в основной подпрограмме перед созданием формы. Вы можете просто отредактировать его, чтобы установить значение true, как показано ниже, и все ваши элементы управления будут выглядеть правильно, когда они написаны на стеклянном окне.

static void Main()
{
    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(true); // this line fixes an issue

    Application.Run(new GlassForm());
}
person Gman    schedule 24.01.2011

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

(Я обнаружил аналогичную проблему с рендерингом аппаратных курсоров, когда при определенных обстоятельствах можно было перепутать прозрачный и черный. В конечном итоге оказалось, что я неправильно рассчитал PBGRA, так что один из BGR был больше, чем A, что может быть верным для вашего фон должен быть прозрачным-цветом.)

Есть и другие сложности с использованием метода DWM API. Я не совсем уверен, но по памяти есть что-то сложное с установкой новых полей - если я правильно помню, все они должны были иметь одинаковый знак (+ / -) или артефакты (например, ваш внезапно появляющийся черный фон) иногда появлялся.

person David Hagan    schedule 11.01.2011