.NET Framework 4.0 и рисование на выпуске Aero Glass - PullRequest
5 голосов
/ 19 апреля 2010

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

Ответы [ 2 ]

1 голос
/ 25 января 2011

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

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

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

Одна особенность заключается в том, что для рендеринга элемента 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());
}
0 голосов
/ 11 января 2011

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

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

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

...