Как я упоминал ранее, цель
LockWindowUpdate
может быть описана всего одним словом: перетаскивание.Простейший случай использования LockWindowUpdate оконным менеджером - это когда вы двигаете или меняете размер окна и опция "Показывать содержимое окна при перетаскивании" отключена. Когда вы начинаете операцию перемещения/изменения размера, менеджер окон блокирует весь рабочий стол, так что он может рисовать на нём прямоугольник из точек (как visual feedback), без риска конфликта с другим окном. Когда операция завершается, рабочий стол разблокируется и мир снова становится нормальным.
Частным случаем, когда приложение использует
LockWindowUpdate
- это когда оно хочет нарисовать своё изображение во время операции перетаскивания. В этом случае приложение блокирует своё собственное окно, чтобы нарисовать значок перетаскивания. Затем, оно использует флаг DCX_LOCKWINDOWUPDATE
для рисования - и ему не нужно волноваться о своей оконной процедуре или любом другом коде, который захочет порисовать на окне. К примеру, когда приложение рисует такой значок операции перетаскивания на ListView, то какая-то асинхронная операция могла бы добавлять в этот ListView элементы, приводя (в обычных условиях) к его перерисовке.Случай, когда вы можете захотеть заблокировать окно другого приложения - это если вы перетаскиваете объект по экрану. К примеру, программа вроде Spy++ имеет возможность указать окно, перетащив на него "прицел". Вы должны заблокировать целевое окно под мышью не только затем, чтобы рисование самого окна не конфликтовало бы с вашим рисование "прицела", но и чтобы оно не затёрло эффект подсвечивания, который вы рисуете по границе окна.
К этому моменту вы уже могли заметить общий момент у всех этих сценариев с
LockWindowUpdate
: они все включают в себя какой-то вид перетаскивания. Перетаскивание окна, границы окна для изменения размера, перетаскивание объекта в окно или из окна. Это не совпадение. Функция LockWindowUpdate
была спроектирована для этих сценариев с перетаскиванием. Дело в том, что операция перетаскивания задействует мышь. Поскольку у вас может быть только одна мышь, то у вас не может происходить несколько операций перетаскивания одновременно, и поэтому нет надобности в блокировке более одного окна одновременно. Возможно, функция могла бы быть названа более удачно как LockDragWindow
.Читать далее.
Только что специально посмотрел - не использует Spy++ LockWindowUpdate - окна не блокируются, если окно прорисовывается, то портит подсветку (рамку вокруг окна), а прицел - судя по всему просто курсор, так что он впринципе не влияет на содержимое окна. Spy++ просто захватывает мышь, так что ИМХО это совсем неудачный пример применения LockWindowUpdate
ОтветитьУдалитьВообще-то никто и не говорил, что Spy++ вообще когда-то использовал или использует LockWindowsUpdate.
ОтветитьУдалитьБыло сказано: программа вроде Spy++ может использовать LockWindowsUpdate для выполнения подобных операций. Т.е. был приведён пример операции, которая может существовать в единственном экземпляре в системе.