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

Сообшение

Значение

WM_ASKCBFORMATNAME

Отправляется, когда окно просмотра буфера обмена запрашивает имя формата. Владелец буфера обмена должен скопировать байты wParam в буфер, на который указывает параметр /Param.

WM_PAINTCLIPBOARD

Отправляется,  когда клиентская область окна буфера обмена требует обновления. Параметр wParam является дескриптором окна просмотра буфера обмена. Параметр /Param является указателем на PAINTSTRUCT.

WM_SIZECLIPBOARD

Отправляется при изменении размера клиентской области окна' просмотра буфера обмена. Параметр wParam является дескриптором окна просмотра буфера обмена. Параметр IP агат — указатель на структуру  RECT.

WM HSCROLLCLIPBOARD WM_VSCROLLCLIPBOARD

и Отправляется при прокрутке клиентской области окна просмотра буфера обмена. Параметр wParam является дескриптором окна просмотра буфера обмена. Младшее слово параметра /Param обозначает тип запроса полосы прокрутки (подобно параметру wParam в сообщении WM_HSCROLL или WM_VSCROLL). Старшее слово параметра /Param указывает позицию бегунка тогда и только тогда, когда полоса прокрутки запрашивает SBJTHUMBPOSITION.

Одним из наглядных примеров формата CF_OWNERDISPLAY служит утилита Clipbook — окно просмотра буфера обмена Windows, которое распознает, казалоа бы, неограниченное количество форматов. На самом деле Clipbook предоставляет свою клиентскую область владельцу данных буфера обмена, который, конечно же, способен отображать содержимое так же, как и в исходном документе. Единственное отличие для владельца буфера обмена составляет окно, где должны выводиться данные. Однако это не вносит изменений в логику программы.Для использования формата CF_OWNERDISPLAY необходимо передать значение NULL в качестве дескриптора данных в вызове SetCIipboardData, как и в случае воспроизведения с задержкой. Однако сообщение WM_RENDERFORMAT владельцу бу фера обмена для данного формата не отправляется. Вместо этого необходимо прим< нить процедуру сообщений Windows для обработки сообщений, присущих данном формату буфера обмена. В листинге 18.1 показан пример процедуры WndProc, котора перехватывает сообщения буфера обмена.Листинг 18.1 Обработка сообщений буфера обмена процедурой WndProc_________ См.     \local-sources\chapl8\tl8-01.txt ,Формат буфера обмена CF_OWNERDISPLAY обеспечивает наивысшую степень раз нообразия всех форматов, поскольку за их отображение отвечает источник данных. Если приложение поддерживает необычный формат буфера обмена (например, приватный или зарегистрированный), существует только две возможности отображения данных вне приложения: отображение владельцем либо написание окна просмотра буфера обмена.Использование приватных форматов буфера обменаКак следует из названия, приватные форматы буфера обмена ограничены приложением, в котором они описаны. Они не предназначены для общего обмена данных буфера обмена. Тем не менее, такие форматы весьма удобны для обмена данными между двумя экземплярами одного и того же приложения. При использовании приватны) форматов в приложении система должна поддерживать также не менее одного стандартного формата буфера обмена.Существует три типа частных форматов данных: предопределенные форматы DSP, форматы диапазона CF_PRIVATEFIRST — CF_PRIVATELAST, а также форматы, за-регистрированные приложением с помощью функции RegisterClipboardFormat. Форматы DSP, включая CF_DSPTEXT, CF_DSPBITMAP, CF_DSPENHMETAFILE иCF_DSPMETAFILEPICT, в действительности являются стандартными (соответственно, текст, растровое изображение, расширенный метафайл с функциями Win32 и метафайл Windows 3.x). Поскольку эти форматы широко распространены, для отображения содержимого буфера обмена могут использоваться обычные окна просмотра наподобие Clipbook.Один из методов заключается в использовании приложения базы данных. Приложение может копировать текст из поля в буфер обмена с помощью стандартного формата CF_TEXT таким образом, что другие приложения могут извлекать текст, но при этом использовать приватный формат для передачи другому экземпляру этого же приложения дополнительных данных, таких как имя файла базы данных и имя поля. В результате вставки из буфера обмена в текстовый процессор будет скопирован лишь текст, в то время как при вставке в другой экземпляр приложения базы данных передается достаточно информации, чтобы программа смогла осуществить реляционный поиск в базе данных.Для реализации описанного подхода можно предпринять попытку анализа данных формата CF_TEXT, которые пользователь пытается вставить, либо прибегнуть к формату CF_DSPTEXT, чтобы отмести большое количество ложных попыток вставки. Однако не следует забывать, что другие приложения также могут использовать формат CF_DSPTEXT. Для гарантии, что получаемые данные на самом деле экспортированы конкретным приложением, необходимо поместить подпись в начало блока памяти. Например, строка "Hello World" должна храниться в виде: "MYAPP:Hello World".Другой способ определения источника данных для клиента буфера обмена заключается в использовании функции GetClipboardOwner. Эта функция возвращает дескриптор окна просмотра владельца буфера обмена. Для извлечения имени класса окна с целью определения факта принадлежности окна другому приложению используется функция GetClassName.Функция RegisterClipboardFormat возвращает уникальный целочисленный идентификатор нового формата буфера обмена либо идентификатор существующего формата, если формат с тем же именем обнаружен средой Windows. Использование зарегистрированных форматов буфера обмена позволяет приложению определять связанную с ним физическую область хранения данных и гарантирует, что источником данных, если они хранятся в этом же формате, является экземпляр данного приложения. Однако, поскольку формат буфера обмена связан с данным приложением, никакое другое приложение не может интерпретировать данные, хранящиеся в этом формате.Среда Windows не предпринимает попыток управлять данными, помешенными в буфер обмена в форматах диапазона CF_PRIVATEFIRST — CF_PRIVATELAST. Вместо этого при очистке буфера обмена владелец буфера обмена должен удалить данные, связанные с содержимым. В таком случае потребуется обработать сообщение WM DESTROYCLIPBOARD.Окна просмотра буфера обменаКак упоминалось ранее, окно просмотра буфера обмена представляет собой программу, предназначенную для просмотра содержимого буфера обмена. Обычно окна просмотра поддерживают множество форматов, но не могут правильно иптерпретиро-вать приватные зарегистрированные форматы. В этой связи может потребоваться создать окно просмотра буфера обмена самостоятельно.Следует учитывать, что .окно просмотра буфера обмена не владеет данными, которыми управляет. Окно просмотра ни в коем случае не должно выполнять запись в содержимое буфера обмена. Окно просмотра никогда не должно оставлять какой-либо элемент содержимого буфера обмена заблокированным. Кроме того, поскольку в любой момент времени могут выполняться несколько окон просмотра и сообщения передаются между ними посредством связанного списка окон просмотра, создаваемая программа должна отвечать следующим соглашениям:Сохранять значение возврата функции SetClipboardViewer, которое указывает на следующее окно просмотра буфера обмена в цепочке. Windows помещает новые окна просмотра перед уже установленными.Передавать сообщения WM_DRAWCLIPBOARD следующему окну просмотра в цепочке. В противном случае остальные окна просмотра не будут обновляться.Передавать сообщения WM_CHANGECBCHAIN следующему окну просмотра в цепочке. В противном случае цепочка окон просмотра будет прервана.Отслеживать сообщения WM_CHANGECBCHAIN для удаления следующего окна цепочки. Параметр IParam содержит новый дескриптор следующего окна в случае удаления следующего окна просмотра.Для удаления окна просмотра из цепочки следует вызвать функцию ChangeClipboardChain с использованием сохраненного значения следующего окна.Описание функций буфера обменаФункции буфера обмена перечислены в табл. 18.3. Затем следуют подробные описания функций.Таблица 18.3 Функции буфера обмена_____________________________