вторник, 28 декабря 2010 г.

С какими операциями предполагалось использовать LockWindowUpdate?

Это перевод With what operations is LockWindowUpdate meant to be used? Автор: Реймонд Чен.

Как я упоминал ранее, цель LockWindowUpdate может быть описана всего одним словом: перетаскивание.

Простейший случай использования LockWindowUpdate оконным менеджером - это когда вы двигаете или меняете размер окна и опция "Показывать содержимое окна при перетаскивании" отключена. Когда вы начинаете операцию перемещения/изменения размера, менеджер окон блокирует весь рабочий стол, так что он может рисовать на нём прямоугольник из точек (как visual feedback), без риска конфликта с другим окном. Когда операция завершается, рабочий стол разблокируется и мир снова становится нормальным.

Частным случаем, когда приложение использует LockWindowUpdate - это когда оно хочет нарисовать своё изображение во время операции перетаскивания. В этом случае приложение блокирует своё собственное окно, чтобы нарисовать значок перетаскивания. Затем, оно использует флаг DCX_LOCKWINDOWUPDATE для рисования - и ему не нужно волноваться о своей оконной процедуре или любом другом коде, который захочет порисовать на окне. К примеру, когда приложение рисует такой значок операции перетаскивания на ListView, то какая-то асинхронная операция могла бы добавлять в этот ListView элементы, приводя (в обычных условиях) к его перерисовке.

Случай, когда вы можете захотеть заблокировать окно другого приложения - это если вы перетаскиваете объект по экрану. К примеру, программа вроде Spy++ имеет возможность указать окно, перетащив на него "прицел". Вы должны заблокировать целевое окно под мышью не только затем, чтобы рисование самого окна не конфликтовало бы с вашим рисование "прицела", но и чтобы оно не затёрло эффект подсвечивания, который вы рисуете по границе окна.

К этому моменту вы уже могли заметить общий момент у всех этих сценариев с LockWindowUpdate: они все включают в себя какой-то вид перетаскивания. Перетаскивание окна, границы окна для изменения размера, перетаскивание объекта в окно или из окна. Это не совпадение. Функция LockWindowUpdate была спроектирована для этих сценариев с перетаскиванием. Дело в том, что операция перетаскивания задействует мышь. Поскольку у вас может быть только одна мышь, то у вас не может происходить несколько операций перетаскивания одновременно, и поэтому нет надобности в блокировке более одного окна одновременно. Возможно, функция могла бы быть названа более удачно как LockDragWindow.

Читать далее.

2 комментария:

  1. Только что специально посмотрел - не использует Spy++ LockWindowUpdate - окна не блокируются, если окно прорисовывается, то портит подсветку (рамку вокруг окна), а прицел - судя по всему просто курсор, так что он впринципе не влияет на содержимое окна. Spy++ просто захватывает мышь, так что ИМХО это совсем неудачный пример применения LockWindowUpdate

    ОтветитьУдалить
  2. Вообще-то никто и не говорил, что Spy++ вообще когда-то использовал или использует LockWindowsUpdate.

    Было сказано: программа вроде Spy++ может использовать LockWindowsUpdate для выполнения подобных операций. Т.е. был приведён пример операции, которая может существовать в единственном экземпляре в системе.

    ОтветитьУдалить

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

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

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

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

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