Опрос
Вы участвуете в программе Windows Insider?
Популярные новости
Обсуждаемые новости

19.04.2006 23:38 | Raiker

Говорит Тим Снит, «евангелист» 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/
Перевод: Райкер

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

Комментарии

Не в сети

я за!

11.07.06 14:24
0
Не в сети

За обеими ногами и руками!

17.07.06 16:43
0
Не в сети

Я тоже за.

17.07.06 18:26
0
Не в сети

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

16.07.07 13:31
0
Для возможности комментировать войдите в 1 клик через

По теме

Акции MSFT
420.55 0.00
Акции торгуются с 17:30 до 00:00 по Москве
Все права принадлежат © ms insider @thevista.ru, 2022
Сайт является источником уникальной информации о семействе операционных систем Windows и других продуктах Microsoft. Перепечатка материалов возможна только с разрешения редакции.
Работает на WMS 2.34 (Страница создана за 0.407 секунд (Общее время SQL: 0.391 секунд - SQL запросов: 61 - Среднее время SQL: 0.00642 секунд))
Top.Mail.Ru