Буфер обмена. Форматы буфера обмена, страница 3

Управление данными буфера обмена в среде WindowsСистема Windows управляет содержимым и форматами буфера обмена. Windows сохраняет данные для каждого формата отдельно таким образом, что помещение данных в один формат не затрагивает данные, записанные в другом формате. Кроме того, Windows управляет удалением данных, помещенных в буфер обмена. Данные, хранимые в буфере обмена для данного формата, должны удаляться при сохранении в формате новых данных, а также при вызове функции EmptyClipboard для очистки всего содержимого буфера обмена.Windows удаляет элементы данных буфера обмена путем вызова специальной функции удаления. Выбор функции зависит от типа данных, хранимых в формате буфера обмена. Для объектов GDI Windows использует функцию DeleteObject. Для объектов памяти применяется функция GlobalFree. Объекты, вложенные в объекты памяти (например, дескриптор типа HANDLE на метафайл в структуре METAFILEPICT для формата буфера обмена CF_METAFILEPICT), также принадлежат Windows и удаляются при уничтожении связанных объектов памяти.Исключением из этих правил служат приватные форматы буфера обмена. Как 6yJ дет показано, Windows не управляет данными, хранимыми в упомянутых форматах буфера обмена. Фактически, управлять хранимыми в приватных форматах данными должны программы, которые эти форматы создают. На вопрос: "Кто владеет данными буфера обмена?" возможен следующий обобщенный ответ: "Владельцы форматов, в которых данные хранятся". Из табл. 18.1 видно, что владельцем большинства форматов буфера обмена является Windows.Воспроизведение данных буфера обмена с задержкойОбработка большого количества форматов данных буфера обмена сопряжена с затратами времени, в особенности, если приложение поддерживает графические форматы, такие как bitmap-изображения или метафайлы. Управление GDI-объектами требует больших затрат времени и памяти. Не имеет смысла обрабатывать или хранить данные, если их формат вообще не используется.К счастью, API-интерфейсы Win32 предоставляют простой метод задержки помещения данных в буфер обмена, пока не будет сгенерирован запрос на извлечение данных в определенном формате. Это называется воспроизведением с задержкой (delayed rendering). Для его задействования достаточно передать значение NULL в качестве дескриптора типа HANDLE на данные буфера обмена при установке данных с помощью функции SetClipboardData. Если приложение требует воспроизведения формата, отправляется сообщение WM_RENDERFORMAT с переменной wParam, чтобы указать запрашиваемый формат.Воспроизведение с задержкой экономит время и ресурсы. Единственный недостаток подобного подхода заключается в том, что система может не отвечать немедленно после запроса пользователя на вставку, поскольку некоторое время затрачивается на форматирование данных. Тем не менее, обычно воспроизведение с задержкой считается наилучшим подходом в случае поддержки большого количества форматов, либо при отсутствии времени на помещение данных в буфер обмена. Помните, часто бывает, что данные вырезаются или копируются, но не вставляются.Примером воспроизведения с задержкой служат описания функций IsClipboardFormatAvailable и GetPriorityClipboardFormat.Формат CF_OWNERDISPLAYУникальный формат буфера обмена CF_OWNERDISPLAY возлагает функции отображения данных буфера обмена на его владельца. Владелец буфера обмена принимает набор сообщений, описывающих изменения клиентской области в окне просмотра буфера обмена. Эти сообщения сведены в табл. 18.2.Одним из наглядных примеров формата CF_OWNERDISPLAY служит утилита Clipbook — окно просмотра буфера обмена Windows, которое распознает, казалось бы, неограниченное количество форматов. На самом деле Clipbook предоставляет свою клиентскую область владельцу данных буфера обмена, который, конечно же, способен отображать содержимое так же, как и в исходном документе. Единственное отличие для владельца буфера обмена составляет окно, где должны выводиться данные. Однако это не вносит изменений в логику программы.Таблица 18.2 Сообщения, принимаемые владельцем буфера обмена для отображения данных     ___