БУФЕР ОБМЕНА
Введение
Одна из задач программиста Windows-приложений состоит в создании продуктов, которые настолько подобны другим программам Windows, что пользователь сможет легко переключаться между ними, не ощущая различий в их поведении и внешнем виде. В идеале пользователь должен воспринимать однородную среду и не замечать разграничений между программами. В такой среде сама собой напрашивается возможность переноса данных между приложениями.
Буфер обмена (clipboard) Windows обеспечивает простой обмен данными между приложениями.
Содержимое буфера обмена в любой момент времени представляет собой набор объектов в памяти, созданных программой, которая поместила данные в буфер обмена. Функции API и сообщения, реализующие буфер обмена, управляют его содержимым. Буфер обмена служит единственным протоколом доступа к хранимым данным.
Приложения могут обрабатывать одни и те же данные по-разному. Например, текст может представлять собой простые символы, сгенерированные эмулятором терминала, либо результат применения современного полнофункционального текстового процессора. Данные, импортируемые любой программой из буфера обмена, необходимо представлять в наилучшем из возможных форматов. С этой целью приложения, попадающие данные в буфер обмена, экспортируют их как можно большим числом способов.
В результате при считывании из буфера обмена клиенту предоставляется набор опций. Различные способы представления данных в буфере обмена называются форматами буфера обмена.
Когда приложение использует функцию SetClipboardData() для помещения данных в буфер обмена в определенном формате, принято говорить, что приложение воспроизводит этот формат. Вообще говоря, чем больше форматов буфера обмена поддерживается приложением, тем точнее оно осуществляется обмен данными с другими Windows-приложениями. Поэтому имеет смысл воспроизводить как можно большее число форматов буфера обмена.
Приложение, которое очищает буфер обмена через функцию EmptyClipboard(), а затем помещает в него данные любого формата с использованием функции SetClipboardData(), называется владельцем буфера обмена (clipboard owner). (Термин не совсем точен, поскольку после помещения данных в буфер обмена они более не принадлежат владельцу. Эти данные принадлежат среде Windows.)
Другие приложения, извлекающие данные, называются клиентами буфера обмена (clipboard readers). Извлечение данных из буфера обмена не делает клиента его владельцем.
Программа Windows, единственной целью которой является просмотр содержимого буфера обмена, называется окном просмотра буфера обмена (clipboard viewer).
Для каждого формата буфера обмена, поддерживаемого приложением, должен выполняться отдельный вызов функции SetClipboardData(). Данные, записываемые в буфер обмена в результате каждого вызова, только замещают данные, хранимые в буфере обмена для данного формата. По этой причине перед помещением новых данных в буфер обмена, программа должна вызвать функцию EmptyClipboard(), чтобы очистить все хранимые форматы от неподходящих данных. В противном случае эти данные могу быть ошибочно сохранены. Вызов функции EmptyClipboard() также позволяет старому владельцу буфера обмена очистить все области памяти, выделенные определенным форматам, путем обработки сообщения WM_DESTROYCLIPBOARD.
Клиент буфера обмена может поддерживать и другие форматы, но для вставки данных ему более всего подходит формат CF_TEXT.
В табл.1 перечислены некоторые предопределенные форматы и описаны данные, а также тип дескриптора, передаваемого функции SetClipBoardData() для каждого типа. Наиболее распространенным типом записей буфера обмена является глобальный блок памяти, выделенный с опцией GMEM_DDESHARE. Для него в таблице применяется простое обозначение HANDLE. Постоянные значения форматов буфера обмена описаны в файле заголовков winuser.h вместе с прототипами функций API, которые определяют интерфейс буфера обмена.
Таблица 1Предопределенные форматы буфера обмена
Формат буфера обмена | Тип дескриптора | Описание данных |
CF_BITMAP | HBITMAP | Данные представляют собой набор битов. |
CF_DSPENHMETAFILE | HENHMETAFILE | Расширенный метафайл, приватный для приложения. |
CF_DSPMETAFILEPICT | HANDLE | Объект памяти, содержащий структуру METAFILEPICT, которая является приватной для приложения. |
CF_DSPTEXT | HANDLE | Приватный для приложения текст. |
CF_DSPBITMAP | НВIТМАР | Растровое изображение, которое является приватным для приложения. Этот формат может использоваться, например, для передачи данных между различными экземплярами одного и того же приложения. Для определения владельца буфера обмена следует использовать функцию GetClipboardOwner(). |
CF_ENHMETAFILE | HENHMETAFILE | Расширенный метафайл. |
CF_GDIOBJFIRST | HGDIOBJ | Описанные приложением форматы сквозного буфера обмена (throughclipboard), представленные объектами GDI (Graphic Device Interface — интерфейсом графических устройств). При вызове функции EmptyClipboard() для уничтожения данных этого формата используется функция DeleteObject(). |
CF_METFILEPICT | HANDLE | Объект памяти, содержащий структуру METAFILEPICT. |
CF_OEMTEXT | HANDLE | Объект памяти, который содержит завершаемую нулем строку символов набора OEM. Строки разделяются последовательностью символов возврата каретки и перевода строки (CR/LF). |
CF_OWNERDISPLAY | NULL | Указывает, что владелец буфера обмена будет отвечать за отображение данных, а также обновляет окна просмотре буфер обмена. Окно просмотра буфера обмена отправляет владельцу сообщения WM_ASKCBFORMATNAME, WM_PAINTCLIPBOARD, WM_HSCROLLCLIPBOARD, WM_SIZECLIPBOARD и WM_VSCROLLCLIPBOARD. |
от CF_PRIVATEFIRST до CF_PRIVATELAST | Этот диапазон обозначает приватные форматы буфера обмена. Windows не управляет этими форматами. Владелец буфера обмена должен управлять ресурсам» через сообщение WM_DESTROYCLBOARD. | |
CF_RBIFF | HANDLE | Сложная поддержка звуковых данных. Превосходит по сложности поддержку CF_WAVE. |
CF_TEXT | HANDLE | Объект памяти, содержащий строку символов, завершаемую нулем. Строки разграничиваются последовательностью символов возврата каретки и перевода строки (CR/LF). |
CF_TIFF | HANDLE | Формат дескриптора файла изображения. |
CF_UNCODETEXT | HANDLE | Объект памяти, содержащий завершаемую нулем строку в формате многобайтного глобального кода символов Unicode. |
CF_WAVE | HANDLE | Стандартная поддержка Wave-файлов. |
... передачу сообщений электронной почты, работу с телеконференциями (группами новостей), обеспечивают пересылку факсимильных сообщений и выполняют множество других операций в компьютерных сетях. 2 Использование буфера обмена в Windows В любом приложении Windows, имеются команды Вырезать, Копировать и Вставить. Они позволяют упростить действия по редактированию документов, связанные с ...
... сборки и маршрутные карты приведены в приложении. 9. ТЕХНИКО-ЭКОНОМИЧЕСКОЕ ОБОСНОВАНИЕ 9.1 Краткая экономическая характеристика проектируемого устройства Разрабатываемое в дипломном проекте устройство представляет собой блок обмена сообщениями аналоговой ЭАТС. В развитых зарубежных странах широкое применение нашли аналоговые ЭАТС типа IBM 1750 (США), DST1 (Италия), ЕК-50 (Япония), АТС 501 ...
... Спільне обговорення і робота з файлом декількох учасників під час зборів по мережі Призначення зборів по мережі 3. Технологія використання та приклади використання операцій обміну даними між компонентами MS Office Перетаскування даних між програмами Використовуйте перетаскування для копіювання і переміщення даних, створення зв'язаних об'єктів, ярликів і гіперпосилань між документами різних ...
... зміни, внесені в поле «Title» документа Notes, відображаються у властивості «Назва» файлу книги Microsoft Excel. Спеціальні властивості файлу книги є двонапрямленими полями, при установці обміну даними у формі Notes. Відновлення одно і двонапрямлених полів з упровадженої книги 1 В Lotus Notes 4.0 клацніть правою кнопкою миші книгу Microsoft Excel, уставлену як упроваджений об'єкт у документ ...
0 комментариев