Win32 API. Буфер обмена
Страница 2. Форматы буфера обмена


 

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

Окно может поместить в буфере обмена больше чем один объект, запись каждого из которых, та же самая информация в другом формате буфера обмена. Пользователям нет необходимости знать форматы буфера обмена, используемые в нем для объекта. 

Зарегистрированные форматы буфера обмена

Многие прикладные программы работают с данными, которые не могут быть переданы в стандартном формате буфера обмена без потери информации. Эти программы могут создавать свои собственные форматы буфера обмена. Формат буфера обмена, который используется прикладной программой, в противоположность стандартному формату, называется зарегистрированным форматом буфера обмена (registered clipboard format). Например, если бы программа обработки текстов скопировала форматированный текст в буфер обмена, который использует стандартный текстовый формат, информация форматирования была бы потеряна. Решение проблемы состоит в том, чтобы зарегистрировать новый формат буфера обмена, такой как расширенный текстовый формат (Rich Text Format - RTF).

Чтобы зарегистрировать новый формат буфера обмена, используйте функцию RegisterClipboardFormat. Эта функция берет имя формата и возвращает значение целого числа без знака, которое представляет зарегистрированный формат буфера обмена. Чтобы извлечь информацию об имени зарегистрированного формата буфера обмена, передайте значение целого числа без знака в функцию GetClipboardFormatName.

Если больше чем одна прикладная программа регистрируют формат буфера обмена с точно таким же самым именем, то этот формат регистрируется только один раз. Оба обращения к функции RegisterClipboardFormat возвращают то же самое значение. Таким образом, две различных прикладных программы могут совместно использовать данные, используя зарегистрированный формат буфера обмена.

Для ознакомления со списком стандартных форматов буфера обмена, см. функцию SetClipboardData

Собственные форматы буфера обмена

Прикладная программа может идентифицировать собственный формат буфера обмена, определяя значение в диапазоне от CF_PRIVATEFIRST до CF_PRIVATELAST. Прикладная программа может использовать собственный формат буфера обмена для определяемого программой формата данных, который не должен быть зарегистрирован системой.

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

Для получения дополнительной информации о сообщении WM_DESTROYCLIPBOARD, см. Монопольное использование буфера обмена (Clipboard Ownership).

Прикладная программа может помещать дескрипторы данных в буфер обмена, определяя собственный формат в диапазоне с CF_GDIOBJFIRST по CF_GDIOBJLAST. При использовании значений в этом диапазоне, дескриптор данных является не дескриптором объекта GDI, а дескриптором, назначенным функцией GlobalAlloc с флажками GMEM_MOVEABLE и GMEM_DDESHARE. Когда буфер обмена освобождается, система автоматически удаляет объект, использующий функцию GlobalFree

Параллельные форматы буфера обмена

Окно может поместить больше чем один объект в буфере обмена, каждая запись которого, та же самая информация в другом формате буфера обмена. При размещении информации в буфере обмена, окно должно обеспечить данные в стольких форматах, сколько это возможно. Чтобы выяснить, сколько форматов в настоящее время используется на буфере обмена, вызовите функцию CountClipboardFormats.

Форматы буфера обмена, которые содержат самую большую информацию, должны быть помещены в начале буфера обмена, следуя за менее важными квалифицирующими форматами. Окно, вставляющее информацию из буфера обмена, обычно возвращает обратно объект буфера обмена в первом формате, который оно распознает. Поскольку форматы буфера обмена перечислены по порядку, оно помещает в буфер обмена первый распознанный формат, как наиболее квалифицирующий.

Например, предположим, что пользователь копирует стилизованный текст из документа текстового процессора. Окно, содержащее документ, может сначала поместить данные в буфер обмена в зарегистрированном формате, типа RTF. Впоследствии, окно поместит данные в буфер обмена в менее квалифицирующем формате, типа текстового (CF_TEXT).

Когда содержание буфера обмена вставляется в другое окно, окно возвращает обратно данные в наиболее квалифицирующем формате, который оно распознает. Если окно распознает RTF, соответствующие данные вставляются в документ. Иначе, текстовые данные вставляются в документ, а информация о форматировании текста теряется. 

Синтезируемые форматы буфера обмена

Система неявно преобразует данные между некоторыми форматами буфера обмена: если окно запрашивает данные в формате, которых нет в буфере обмена, система преобразует доступный формат в запрошенный формат. Система может преобразовать данные, как обозначено в следующей таблице.

Формат Буфера обменаФормат преобразованияПлатформа поддержки
CF_BITMAPCF_DIBWindows NT, Windows 95
CF_DIBCF_BITMAPWindows NT, Windows 95
CF_DIBCF_PALETTEWindows NT, Windows 95
CF_ENHMETAFILECF_METAFILEPICTWindows NT, Windows 95
CF_METAFILEPICTCF_ENHMETAFILEWindows NT, Windows 95
CF_OEMTEXTCF_TEXTWindows NT, Windows 95
CF_OEMTEXTCF_UNICODETEXTWindows NT
CF_TEXTCF_OEMTEXTWindows NT, Windows 95
CF_TEXTCF_UNICODETEXTWindows NT
CF_UNICODETEXTCF_OEMTEXTWindows NT
CF_UNICODETEXTCF_TEXTWindows NT

Если система обеспечивает преобразование между параллельными форматами, нет никакой выгоды от размещения параллельных форматов в буфере обмена. При копировании точечных рисунков, самое лучшее, в буфер обмена поместить только формат CF_DIB. Это потому, что цвета в аппаратно-зависимом точечном рисунке (CF_BITMAP) взаимосвязаны с палитрой системы, которая может измениться до того, как точечный рисунок будет вставлен. Если только формат CF_DIB находится в буфере обмена, а окно запрашивает формат CF_BITMAP, система представляет аппаратно-зависимый точечный рисунок (DIB), используя текущую палитру этого момента.

Если Вы помещаете формат CF_BITMAP в буфер обмена (а не CF_DIB), система выполняет формат буфера обмена CF_DIB, как только буфер обмена будет закрыт. Это гарантирует то, что используется правильная палитра для создания DIB. Преобразования между другими форматами буфера обмена происходят после запроса.

 
« Предыдущая статья   Следующая статья »