Добавление прозрачности в Vista к вашему приложению

Автор: Topol Воскресенье, Май 6th, 2012 Нет комментариев

Рубрика: Операционные системы

Говорит Тим Снит, «евангелист» Windows Vista. Отходя от привычных мне рассказов о Windows Presentation Foundation , хочу написать ряд технических статей об использовании новых интерфейсных возможностей Windows Vista  через управляемый код…

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

Что я подразумеваю под добавлением прозрачности? Как известно, Windows Vista включает новую тему Aero. Один из ее аспектов – прозрачные границы окон, что реализуется посредством Desktop Window Manager. Есть и другие аспекты, которые придают объем окну – это тени от окон, эффекты при развертывании, сворачивании и закрытии окон, подсветка кнопок – это не просто 50% прозрачность на скорую руку в Photoshop.

На готовых к Vista машинах, каждое окно получает прозрачную границу (даже Командная строка в их числе!). Но некоторые приложения расширяют прозрачность на область функций; примером может служить WMP11, у которого прозрачность имеется на пространстве управления воспроизведения. Ваше приложение может также получить такую расширенную прозрачность.
Но это все не игрушки – большие объемы прозрачности требуют больше усилий системы на рендеринг, поэтому не используйте это как фон для вашего окна (хм, когда автор последний раз смотрел на окно добавления гаджетов в SideBar в 5308 / 5342? – прим. пер.). С другой стороны, это замечательная возможность сделать ваше приложение органичным с новой системой.

В этой первой части я расскажу, как добавлять прозрачность в приложения Windows Forms; в будущих статьях, расскажу о других частях, таких как прорисовку текста на прозрачности, использовании прозрачности в WPF-приложениях и применении эффекта размытия.

Единственный запрос API, который и производит всю нудную и грязную работу, следующий:

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

Запрос имеет несколько параметров, основной это определение насколько DWM должен прорисовать прозрачность вокруг сторон окна:

Код:
[StructLayout(LayoutKind.Sequential)]
public struct MARGINS
{
public int cxLeftWidth;
public int cxRightWidth;
public int cyTopHeight;
public int cyBottomHeight;
}

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

Вот пример использования API, о чем шла речь ранее:

Код:
MARGINS margins = new MARGINS();
margins.cxLeftWidth = 0;
margins.cxRightWidth = 0;
margins.cyTopHeight = 45;
margins.cyBottomHeight = 0;

IntPtr hWnd = this.Handle;
int result = DwmExtendFrameIntoClientArea(hWnd, ref margins);

Итак, вы должны увидеть прозрачность в вашем приложении. Вы можете теперь перетащить туда кнопки, ярлыки или другие средства управления, и пока их фоновый цвет будет прозрачным, вы увидеть их интегрированными в вашу прозрачность. Вот пример такого приложения:

Есть только один неприятный нюанс, касающийся сглаживания текста, которое не работает хорошо. Так как используется прозрачный фоновый цвет, и вы выбрали этот цвет слишком ярким и броским, скажем Fuchsia, вы будете видеть небольшой некрасивый ореол вокруг теста. Но если вы выберите более подобающий прозрачности цвет (именно поэтому я выбрал Gainsboro) этот эффект почти неприметен.
Есть и более сложный путь удаления этого эффекта. Win32 проводит для этой ситуации практичный DrawThemeTextEx, который заставляет отображать текст правильно даже на прозрачности.
Но об этом, и многом другом, мы поговорим в следующей статье. А пока предлагаю вам скачать типично обсуждаемое нам приложение и его исходный код, для тестирования всего того, о чем говорилось выше.

Источник: http://blogs.msdn.com/
Перевод: Райкер

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

Источник: thevista.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты