Добавление прозрачности в Vista к вашему приложению
Говорит Тим Снит, «евангелист» 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, который заставляет отображать текст правильно даже на прозрачности.
Но об этом, и многом другом, мы поговорим в следующей статье. А пока предлагаю вам
Источник:
Перевод: Райкер
Я не уверен, стоит ли переводить продолжения этой статьи, когда они выйдут; вернее не уверен, имеются ли у нас на сайте пользователи, которым эта тема действительно интересна. Поэтому отписывайтесь в комментариях – если наберется достаточное количество голосов за, то будем продолжать переводы на эту тему.
Комментарии
мда. я вовремя. скажу так: статья полезная, но без инфы по выводу теста на прозрачность она безсмысленна. а переводить-то и нечего, я лично не нашел продолжений по этой статье.
По теме
- Создаем контекстно-зависимое WPF-приложение
- #024 – Знакомство с WPF/E
- #023 – Введение в WPF, reloaded…
- #022 Введение в Microsoft Interactive Designer RC1
- #021 Применение 3D в WPF - Часть 2
- #020 Применение 3D в WPF - Часть 1
- #019 Введение в возможности 3D на WPF
- #018 Размещение контрола NET 2.0 на форме WPF
- #017 Первое Web-приложение / Подробнее о Grid / Элемент Frame
- #016 EXE, XBAP, XAML? - Все равно!