четверг, 30 декабря 2010 г.

Последние замечания о LockWindowsUpdate

Это перевод Final remarks on LockWindowUpdate. Автор: Реймонд Чен.

Это завершающий пост в серии про LockWindowUpdate: Теперь, когда вы понимаете цель LockWindowUpdate, я расскажу вам, почему вы вообще не захотите использовать её - даже для её предполагаемой цели!

Вам нужно вернуться в исторический контекст, в котором создавалась функция LockWindowUpdate. Перемотайте на время 16-ти битных Windows, а конкретно - Windows 3.1. В те дни память была дорогой. Видеодрайвера были весьма ораничены в своей функциональности. Не существовало DirectX. Не было функции AlphaBlend. Всё что у вас было - экранный буфер. Функция LockWindowUpdate позволяла вам взять контроль над частью экранного буфера, занимаемой одним окном, так что вы могли применить свои эффекты, а окно об этом бы не узнало.

С тех пор прошло больше пятнадцати лет. За это время у нас появились оверлеи DirectX, регионы в окнах, слои, альфа-каналы, композитные окна, разнокалиберные клёвые графические эффекты, которые не были доступны тогда. В частности, слои и регионы позволяют вам делать любые из вещей, для которых вы могли бы захотеть вызывать LockWindowUpdate. Если вы хотите рисовать вокруг окна, то вы можете вырезать регион в окне и расположить его вокруг целевого окна. Если вы хотите рисовать поверх окна, то вы можете создать окно со слоем (layered window) и разместить его над целевым окном. Дайте этому окну со слоем регион, примените ваши любимые альфа-эффекты - и пусть графическое ядро делает всю грязную работу по смешению и композиции конечных пикселей на экране. И даже круче: окно со слоем может быть расширено за пределы исходного окна - LockWindowUpdate так не умеет (вы можете видеть этот эффект в Windows XP, если вы сделаете "Выбрать всё" в Проводнике, а затем начнёте таскать всё выделение. Заметьте, что изображение выделенных объектов не ограничено одним окном).

И даже более: в волнующем новом композитном мире менеджера окон рабочего стола (Desktop Window Manager - DWM) Windows Vista LockWindowUpdate ещё менее желательна. Блокировка окна для обновления ещё не так плоха, поскольку DWM может просто дать вам фоновый растр. Но если вы блокируете весь экран (я видел, как некоторые люди так делают), то DWM придётся слить все окна в один растр, который он потом отдаст вам, когда вы вызовите GetDCEx с флагом DCX_LOCKWINDOWUPDATE. DWM делает такую композицию на лету с помощью DirectX и видеодрайверов. Обычно результат композиции идёт прямо на экран, минуя сохранение в "композитный" растр. Но если вы блокируете экран, то DWM нужно эмулировать старое поведение, чтобы вернуть вам что-то, что представляет то, что вы имели бы ранее, когда не было такой вещи как композиция. И это не дёшево.

Эпилог. Я не уверен, была ли эта серия успехом или нет. Моей целью было помочь людям более эффективно использовать LockWindowUpdate (вернее: эффективно не использовать - прим.пер.) и указать им на альтернативы LockWindowUpdate, когда она является ошибочным кандидатом для выполнения работы. Другими словами, это статья о LockWindowUpdate, а не документация по функции. Я пытался вести беседу легко и непринуждённо, но, кажется, мои шутки не имели успеха, и люди просто использовали их в качестве плацдарма для негативных комментариев.

Отдельное спасибо людям, которые воспользовались возможностью пожаловаться на документацию. Я имею ввиду - какого чёрта, если бы документация была совершенна и идеальна, мне не пришлось бы всё это писать. Хотя эти люди даже не удосужились прочитать документацию целиком; они просто взглянули на страницу описания функции. Люди, документация не состоит из списка описаний функций! Описание функции - это справочная информация. Вы открываете её когда уже знаете, что происходит, чтобы узнать мельчайшие детали. Настоящее изучение находится в обзорах и статьях. Если вы хотите научиться управлять своим радио, не надо сначала читать схематический план.

См. также:

Комментариев нет:

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

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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