SetClipboardData( wFormat, NULL );…
Когда приложение запрашивает данные, которые идентифицируются зна-
чением NULL,
а не дескриптором блока, Windows расценивает это как запрос
отложенного копирования и вызывает владельца буфера обмена (приложение,
поместившее в него данные) с помощью сообщения WM_RENDERFORMAT,
в
котором запрашиваемый формат задан посредством параметра wParam. В от-
вет на сообщение WM_RENDERFORMAT
приложение вызывает функцию
SetClipboardData(), которой передается дескриптор глобального блока памяти
и идентификатор формата (вместо вызова функций OpenClipboard() и EmptyC-
lipboard()). Таким образом, реальные данные передаются только тогда, когда
получатель готов принять их.
В буфер обмена можно поместить несколько элементов в виде комбина-
ции обычных и отложенных данных. Когда приложение перестает быть вла-
дельцем буфера обмена, Windows посылает ему сообщение
WM_DESTROYCLIPBOARD,
констатирующее этот факт. В ответ на это со-
общение приложение может вернуть себе право на владение буфером обмена
и снова передать в него те же самые данные, однако такой способ рекоменду-
ется применять лишь в исключительных ситуациях.
Кроме того, если приложение готово завершить свою работу, но является
владельцем буфера обмена, который содержит дескрипторы данных со значени-
ем NULL,
Windows посылает сообщение WM_RENDERALLFORMATS без ука-
зания каких-либо спецификаций формата. В ответ на это сообщение приложе-
ние-владелец должно либо полностью очистить буфер обмена, либо завершить
отложенные вызовы.
Но в этом случае, в отличие от реакции на сообщение
WM_RENDERFORMAT,
приложение, прекращающее свою работу, не будет
вызывать функцию SetClipboardData(), а просто очистит буфер обмена и цели-
ком запишет в него новые данные, как если бы отложенные вызовы вообще не
существовали.
Еще один частный формат данных буфера обмена объявляется следую-
щим образом:
SetClipboardData( CF_OWNERDISPLAY, NULL );…
Данные типа CF_OWNERDISPLAY
всегда передаются с глобальным де-
скриптором памяти, имеющим значение NULL
(по аналогии с форматом отло-
женного копирования). Но поскольку в этом случае владелец буфера обмена
несет непосредственную ответственность за отображение данных, при их за-
просе Windows не посылает сообщение WM_RENDERFORMAT.
Просто со-
общение из программы просмотра должно быть передано непосредственно
программе-владельцу буфера обмена. Как было сказано ранее, идентифициро-
вать владельца буфера можно с помощью функции GetClipboardOwner(). И на-
оборот, программа-владелец может определить программу просмотра с помо-
щью функции GetClipboardViewer().
При использовании данного формата программа просмотра посылает
приложению-владельцу запрос на формирование реального изображения и
87