Буфер обмена

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

ывает, что владелец буфера обмена будет отвечать за отображение данных, а также обновляет окна просмотре буфер обмена. Окно просмотра буфера обмена отправляет владельцу сообщения WM_ASKCBFORMATNAME, WM_PAINTCLIPBOARD, WM_HSCROLLCLIPBOARD, WM_SIZECLIPBOARD и WM_VSCROLLCLIPBOARD.от CF_PRIVATEFIRST до CF_PRIVATELASTЭтот диапазон обозначает приватные форматы буфера обмена. Windows не управляет этими форматами. Владелец буфера обмена должен управлять ресурсам через сообщение WM_DESTROYCLBOARD.CF_RBIFF HANDLEСложная поддержка звуковых данных. Превосходит по сложности поддержку CF_WAVE.CF_TEXTHANDLEОбъект памяти, содержащий строку символов, завершаемую нулем. Строки разграничиваются последовательностью символов возврата каретки и перевода строки (CR/LF). CF_TIFFHANDLEФормат дескриптора файла изображения.CF_UNCODETEXTHANDLEОбъект памяти, содержащий завершаемую нулем строку в формате многобайтного глобального кода символов Unicode.CF_WAVEHANDLEСтандартная поддержка Wave-файлов.

2. Управление данными буфера обмена в среде Windows

 

Система Windows управляет содержимым и форматами буфера обмена. Windows сохраняет данные для каждого формата отдельно таким образом, что помещение данных в один формат не затрагивает данные, записанные в другом формате. Кроме того Windows управляет удалением данных, помещенных в буфер обмена. Данные, хранимые в буфере обмена для данного формата, должны удаляться при сохранении в формате новых данных, а также при вызове функции EmptyClipboard() для очистки всего содержимого буфера обмена.

Windows удаляет элементы данных буфера обмена путем вызова специальной функции удаления. Выбор функции зависит от типа данных, хранимых в формате буфера обмена.

Например, для объектов GDI Windows использует функцию DeleteObject(), для объектов памяти применяется функция GlobalFree() и т.д.

Исключением из этих правил служат приватные форматы буфера обмена. Как будет показано, Windows не управляет данными, хранимыми в упомянутых форматах буфера обмена. Фактически, управлять .хранимыми в приватных форматах данными должны программы, которые эти форматы создают.

 

3. Воспроизведение данных буфера обмена с задержкой

 

Обработка большого количества форматов данных буфера обмена сопряжена с затратами времени, в особенности, если приложение поддерживает графические форматы, такие как bitmap-изображения или метафайлы. Управление GDI-объектами требует больших затрат времени и памяти. Не имеет смысла обрабатывать или хранить данные, если их формат вообще не используется.

К счастью, API-интерфейсы Win32 предоставляют простой метод задержки помещения данных в буфер обмена, пока не будет сгенерирован запрос на извлечение данных в определенном формате. Это называется воспроизведением с задержкой (delayed rendering). Для его задействования достаточно передать значение NULL в качестве дескриптора типа HANDLE на данные буфера обмена при установке данных с помощью функции SetClipboardData(). Если приложение требует воспроизведения формата, отправляется сообщение WM_RENDERFORMAT с переменной wParam, чтобы указать запрашиваемый формат.

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

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

Примером воспроизведения с задержкой служат функции ClipboardFormatAvailable() и GetPriorityClipboardFormat().

Формат CF_OWNERDISPLAY

Уникальный формат буфера обмена CF_OWNERDISPLAY возлагает функции отображения данных буфера обмена на его владельца. Владелец буфера обмене принимает набор сообщений, описывающих изменения клиентской области в окне просмотра буфера обмена. Эти сообщения сведены в табл.2.

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

 

Таблица 2

Сообщения, принимаемые владельцем буфера обмена для отображения данных

СообщениеЗначение WM_ASKCBFORMATNAMEОтправляется, когда окно просмотра буфера обмена запрашивает имя формата. Владелец буфера обмена должен скопировать байты wParam в буфер, на который указывает параметр lPrarm.WM_PAINTCLIPBOARDОтправляется, когда клиентская область окна буфера обмена требует обновления. Параметр wParam является дескриптором окна просмотра буфера обмена. Параметр lParam является указателем на PAINTSTRUCT.WM_SIZECLIPBOARDОтправляется при изменении размера клиентской области окна просмотра буфера обмена. Параметр wParam является дескриптором окна просмотра буфера обмена. Параметр lParam - указатель на структуру RECT.WM_HSCROLLCLIPBOARD и WM_VSCROLLCLIPBOARDОтправляется при прокрутке клиентской области окна просмотра буфера обмена. Параметр wParam является дескриптором окна просмотра буфера обмена. Младшее слово параметра lParam обозначает тип запроса полосы прокрутки (подобно параметру wParam в сообщении WM_HSCROLL или WM_VSCROLL). Старшее слово параметра lParam указывает позицию бегунка тогда и только тогда, когда полоса прокр?/p>