Буфер обмена. Форматы буфера обмена

Страницы работы

Содержание работы

Буфер обмена

Одна из задач программиста Windows-приложений состоит в создании продуктов, которые настолько подобны другим программам Windows, что пользователь сможет легко переключаться между ними, не ощущая различий в их поведении и внешнем виде. В идеале пользователь должен воспринимать однородную среду и не замечать разграничений между программами. В такой среде сама собой напрашивается возможность переноса данных между приложениями. Например, результат вычислений одного приложения должен легко импортироваться в документ другого приложения. Буфер обмена (clipboard) Windows обеспечивает простой обмен данными между приложениями.

Содержимое буфера обмена в любой момент времени представляет собой набор объектов в памяти, созданных программой, которая поместила данные в буфер обмена. Функции API и сообщения, реализующие буфер обмена, управляют его содержимым. Буфер обмена служит единственным протоколом доступа к хранимым данным.

Форматы буфера обмена

Приложения могут обрабатывать одни и те же данные по-разному. Например, текст может представлять собой простые символы, сгенерированные эмулятором терминала, либо результат применения современного полнофункционального текстового процессора. Данные, импортируемые любой программой из буфера обмена, необходимо представлять в наилучшем из возможных форматов. С этой целью приложения, помещающие данные в буфер обмена, экспортируют их как можно большим числом способов. В результате при считывании из буфера обмена клиенту предоставляется набор опций. Различные способы представления данных в буфере обмена называются форматами буфера обмена.

Когда приложение использует функцию SetClipboardData для помещения данных в буфер обмена в определенном формате, принято говорить, что приложение воспроизводит этот формат. Вообще говоря, чем больше форматов буфера обмена поддерживается приложением, тем точнее оно осуществляется обмен данными с другими Windows-приложениями. Поэтому имеет смысл воспроизводить как можно большее число форматов буфера обмена.

Приложение, которое очищает буфер обмена через функцию EmptyClipboard, а затем помещает в него данные любого формата с использованием функции SetClipboardData, называется владельцем буфера обмена (clipboard owner). (Термин не совсем точен, поскольку после помещения данных в буфер обмена они более не принадлежат владельцу. Эти данные принадлежат среде Windows.) Другие приложения, извлекающие данные, называются клиентами буфера обмена (clipboard readers). Извлечение данных из буфера обмена не делает клиента его владельцем. Программа Windows, единственной целью которой является просмотр содержимого буфера обмена, называется окном просмотра буфера обмена (clipboard viewer). Утилита Clipbook, впервые появившаяся в Windows for Workgroups, — один из примеров окна буфера обмена. Она позволяет соединять буферы обмена различных рабочих станций как файлы через механизм сетевого динамического обмена данными (DDE — dynamic data exchange).

Для каждого формата буфера обмена, поддерживаемого приложением, должен выполняться отдельный вызов функции SetCIipboardData. Данные, записываемые в буфер обмена в результате каждого вызова, только замещают данные, хранимые в буфере обмена для данного формата. По этой причине перед помещением новых данных в буфер обмена, программа должна вызвать функцию EmptyClipboard, чтобы очистить все хранимые форматы от неподходящих данных. В противном случае эти данные могут быть ошибочно сохранены. Вызов функции EmptyClipboard также позволяет старому владельцу буфера обмена очистить все области памяти, выделенные определенным форматам, путем обработки сообщения WM_DESTROYCLIPBOARD.

На рис. 18.1 показано взаимодействие между владельцем и клиентом буфера обмена. Обратите внимание, что клиент выбрал просмотр данных в формате CF_TEXT, хотя владелец воспроизводит не менее трех текстовых форматов, включая CF_TEXT, CF_OEMTEXT и CF_UNICODETEXT. Клиент буфера обмена может поддерживать и другие форматы, но для вставки данных ему более всего подходит формат CF_TEXT.

Рисунок 18.1

Взаимодействие между владельцем и клиентом буфера обмена.

В табл. 18.1 перечислены предопределенные форматы и описаны данные, а такж тип дескриптора, передаваемого функции SetClipBoardData для каждого типа. Наиболее распространенным типом записей буфера обмена является глобальный блок памяти, выделенный с опцией GMEM_DDESHARE. Для него в таблице применяется простое обозначение HANDLE (дескриптор). Постоянные значения форматов буферг обмена описаны в файле заголовков winuser.h вместе с прототипами функций API, которые определяют интерфейс буфера обмена.

Таблица 18.1 Предопределенные форматы буфера обмена

Похожие материалы

Информация о работе