div.main {margin-left: 20pt; margin-right: 20pt} Буфер обмена
Александр Бельбаков, msa.km.ru
Буфер обмена - это набор функций и сообщений, который позволяет
приложениям сохранять в памяти данные и передавать их между разными
приложениями. Объект в буфере обмена может быть представлен в любом
формате данных, называемом форматом буфера обмена. Каждый формат определён
целым значением. Для стандартных форматов буфера обмена эти значения
являются константами, определёнными в Win32 API.
Множество приложений работает с данными, которые не могут быть переданы
в стандартных форматах буфера обмена без потери информации. Во избежание
этого программы создают свой собственный формат. Стандартные
(предопределённые) форматы называются зарегистрированными форматами буфера
обмена. Например, если приложение копирует форматированный текст в буфер
обмена, используя текстовый формат, то информация о форматировании будет
потеряна. Решением проблемы будет создание (реистрация) нового формата,
такого как Rich Text Format (RTF).
Для регистрации нового формата
буфера обмена используйте функцию RegisterClipboardFormat. Эта функция
присваивает новому формату целое числовое значение, которое представляет
этот формат. Чтобы получить имя зарегистрированного формата буфера обмена,
передайте его номер функции GetClipboardFormatName.
Если более чем
одно приложение регистрирует формат буфера обмена с одинаковым именем,
вызовы функции RegisterClipboardFormat будут возвращать одинаковое
значение. Список стандартных форматов смотрите в описании функци
SetClipboardData.
Либое приложение может создать частный формат буфера обмена, указав
значения в промежутке от CF_PRIVATEFIRST до CF_PRIVATELAST. Указатели
данных, ассоциированные с частным форматом автоматически освобождаются
системой. Приложение, которое использует частные форматы, может применить
сообщение WM_DESTROYCLIPBOARD, чтобы освободить ресурсы системы, когда
данные в буфере обмена больше не требуются.
Приложение может поместить более чем один объект в буфер обмена, каждый
соответствующий по информации, но находящийся в разных форматах. Когда
приложение помещает информацию в буфер обмена, оно должно обеспечить как
можно больше форматов. Чтобы узнать сколько в буфере обмена в данный
момент используется форматов, вызовите функцию CountClipboardFormats.
Приложение, использующее информацию из буфера обмена, обычно, получает её
в наиболее подходящем для себя фомате.
Например, предположим, что
пользователь копирует форматированный текст из текстового редактора
(WordPad). Приложение первым поместит данные в наиболее подходящем формате
(RTF), а затем в обычном текстовом формате (CF_TEXT). Когда же содержимое
буфера обмена вставляется в другое приложение (Notepad - обычный текстовый
редактор), оно получит данные в наиболее подходящем формате для себя (в
случаее с Notepad - текстовом формате, если это Microsoft Word, то в
формате RTF).
Приложение должно использовать буфер обмена при вырезки (Cut),
копировании (Copy) или вставке данных (Paste). Приложение помещает данные
в буфер обмена при операциях Copy и Cut, а получает данные из буфера
обмена для оперции Paste.
Чтобы поместить или получить данные из
буфера обмена, сначала надо его открыть, используя функцию OpenClipboard.
Только одно приложение (точнее окно) может работать с буфером обмена,
когда он открыт. Чтобы найти окно, работающее с буфером обмена, вызовите
функцию GetOpenClipboardWindow. После того, как приложение закончит работу
с буфером обмена, оно должно закрыть его, вызвав функцию
CloseClipboard.
Чтобы поместить информацию в буфер обмена, сначала окно должно очистить
предыдущее его содержание, используя функцию EmptyClipboard. Эта функция
посылает сообщение WM_DESTROYCLIPBOARD предыдущему владельцу буфера
обмена, освобождает ресурсы и назначает владельцем окно, которое открыло
буфер обмена. Чтобы узнать какое окно является владельцем буфера обмена,
используйте функцию GetClipboardOwner.
После очистки буфера обмена
окно помещает в него как можно больше форматов данных. Для каждого формата
окно вызывает функцию SetClipboardData, указывая идентификатор формата и
указатель памяти (на данные). Указатель памяти может быть равен NULL,
означая то, что окно выдаст данные только при запросе.
Для получения информации из буфера обмена, сначала окно определяет
формат информации. Обычно, окно перечисляет доступные форматы, используя
функцию EnumClipboardFormats. В альтернативном случае также можно
использовать функцию GrtPriorityClipboardFormat, которая укажит наиболее
подходящие форматы по их приоритету. Окно, поддерживающее только один
формат может использовать функцию IsClipboardFormatAvailable, которая
определит, доступен ли указанный формат данных в буфере
обмена.
После определения формата данных буфера обмена окно
вызывает функцию GetClipboardData. Эта функция возвращает указатель
объекта в памяти, который содержит необходимые данные.
Под объект в памяти, который должен быть размещён в буфере обмена
должен быть выделен блок этой памяти, используйте функцию GlobalAlloc с
константами GMEM_DDESHARE и GMEM_MOVEABLE. А для получения данных из
памяти используйте функцию CopyMemory.
Clipboard Viewer - это приложение, которое показывает содержимое буфера
обмена в данный момент. По соглашению Clipboard Viewer не влияет на
содержимое буфера обмена (не изменяет данные). Обычно, Clipboard Viewer
может показывать по крайней мере 3 общих формата: CF_TEXT, CF_BITMAP и
CF_METAFILEPICT.
Приложение должно добавить себя в цепочку
обозревателей буфера обмена, вызвав функцию SetClipboardViewer.
Возвращаемое значние - указатель следующего окна в этой цепочке. Чтобы
получить указатель первого окна цепочки используйте функцию
GetClipboardViewer. Каждый раз, когда содержимое буфера обмена меняется,
система отправляет сообщение WM_DRAWCLIPBOARD первому окну цепочки, затем
это окно должно отправить это же сообщение следующему, и т.д. Перед
завершением работы Clipboard Viewer должен удалить себя из цепочки
обозревателей буфера обмена, вызвав функцию ChangeClipboardChain.
|